Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 14.02.2019, 10:44   #1
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,413
Вес репутации: 2632/85
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию PIC18FxxK80 & EEPROM xc8

В общем, появилась задача писать многобайтовую переменную в EEPROM.
Стандартная функция eeprom_write() (как оказалось она работает хорошо) не устраивала тем, что она ждала завершения записи в цикле.
Решил сделать по-своему, код из даташита портировал на C, но писался только первый байт, остальные оставались неизменными.
Мой код записи с ожиданием:
Код:
EEADRH = (addr >> 8) & 0x03;
EEADR = (addr & 0x0ff);
EEDATA = value;

EEPGD = 0;
CFGS = 0;
WREN = 1;

GIE = 0;

EECON2 = 0x55;
EECON2 = 0xAA;
WR = 1;

while(WR);			
GIE = 1;
WREN = 0;
Но работает код из примера компилятора
Код:
static bit f_GlogalInterrupt;

EEADRH = (addr >> 8) & 0x03;
EEADR = (addr & 0x0ff);
EEDATA = value;

EEPGD = 0;
CFGS = 0;
WREN = 1;

f_GlogalInterrupt = GIE;
GIE = 0;

EECON2 = 0x55;
EECON2 = 0xAA;
WR = 1;
while(WR);	//Wait till the write completion

GIE = f_GlogalInterrupt;

WREN = 0;
Как мне стало понятно, то разница с моим кодом в том, что в примере значение бита GIE сохраняется в промежуточной переменной, в моей программе GIE всегда 1, но даже если я присвою промежуточной переменной 1, и потом эту переменную GIE, то все равно второй и следующий байт не пишутся.
XC8 v.1.31, знаю, что старый, но давно с ним работаю и не подводил меня. Стояла оптимизация по скорости, отключение так же ничего не дало.
Рак вне форума   Ответить с цитированием
Старый 14.02.2019, 11:00   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,321
Вес репутации: 4401/96
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Рак
не смог вникнуть что у Вас происходит, но я бы посмотрел дизасм.
какая в итоге разница в коде.

в pic32m есть особенности в том, что microchip хочет чтобы мы все побыстрее издохли и реализовало syskey перед каждой операцией прожига.
который требует чтобы никто к шине в этот момент не лез.
чтобы побыстрее передохли клиенты и наконец-то все стали использовать stm, а microchip обанкротилась.
besogon вне форума   Ответить с цитированием
Старый 14.02.2019, 12:57   #3
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,413
Вес репутации: 2632/85
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Уже подзабыл ассемблер, но ничего криминального не увидел
Код:
;EEPROM.c: 32: CFGS = 0;
  	bcf	3967,6,c	;volatile

;EEPROM.c: 33: WREN = 1;
  	bsf	3967,2,c	;volatile

;EEPROM.c: 34: f_GlogalInterrupt = GIE;
  	bcf	EEPROM_Write@f_GlogalInterrupt/(0+8),EEPROM_Write@f_GlogalInterrupt& (0+7),c
  	btfsc	intcon,7,c	;volatile
  	bsf	EEPROM_Write@f_GlogalInterrupt/(0+8),EEPROM_Write@f_GlogalInterrupt& (0+7),c

;EEPROM.c: 35: GIE = 0;
  	bcf	intcon,7,c	;volatile

;EEPROM.c: 36: EECON2 = 0x55;
  	movlw	85
  	movwf	3966,c	;volatile

;EEPROM.c: 37: EECON2 = 0xAA;
  	movlw	170
  	movwf	3966,c	;volatile

;EEPROM.c: 38: WR = 1;
  	bsf	3967,1,c	;volatile
  i2l34:
  	btfsc	3967,1,c	;volatile
  	goto	i2l34

;EEPROM.c: 40: GIE = f_GlogalInterrupt;
  	movlb	(EEPROM_Write@f_GlogalInterrupt/(0+8)) shr (0+8)
  	btfss	EEPROM_Write@f_GlogalInterrupt/(0+8),EEPROM_Write@f_GlogalInterrupt& (0+7),c
  	bra	i2u220_45
  	bsf	intcon,7,c	;volatile
  i2u220_45:
  	btfsc	EEPROM_Write@f_GlogalInterrupt/(0+8),EEPROM_Write@f_GlogalInterrupt& (0+7),c
  	bra	i2u220_46
  	bcf	intcon,7,c	;volatile
  i2u220_46:

;EEPROM.c: 41: WREN = 0;
  	bcf	3967,2,c	;volatile
Тоже самое, но с принудительной установкой GIE=1
Код:
  
  	bcf	3967,7,c	;volatile

;EEPROM.c: 32: CFGS = 0;
  	bcf	3967,6,c	;volatile

;EEPROM.c: 33: WREN = 1;
  	bsf	3967,2,c	;volatile

;EEPROM.c: 35: GIE = 0;
  	bcf	intcon,7,c	;volatile

;EEPROM.c: 36: EECON2 = 0x55;
  	movlw	85
  	movwf	3966,c	;volatile

;EEPROM.c: 37: EECON2 = 0xAA;
  	movlw	170
  	movwf	3966,c	;volatile

;EEPROM.c: 38: WR = 1;
  	bsf	3967,1,c	;volatile
  i2l34:
  	btfsc	3967,1,c	;volatile
  	goto	i2l34

;EEPROM.c: 40: GIE = 1;
  	bsf	intcon,7,c	;volatile

;EEPROM.c: 41: WREN = 0;
  	bcf	3967,2,c	;volatile
С присвоением переменной немного больше времени нужно, добавил nop()ы, но это никак не повлияло.

В принципе, нашел решение и хорошо, но тогда пример из даташита не работает
Рак вне форума   Ответить с цитированием
Старый 27.02.2019, 17:35   #4
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 242
Вес репутации: 317/53
eleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rough
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Цитата:
Сообщение от Рак Посмотреть сообщение
В принципе, нашел решение и хорошо, но тогда пример из даташита не работает
Решением не поделитесь?

Похожая проблема с pic18F46k80.
Использую MikroC.
По два байта в EEPROM пишутся без проблем, если между записью и чтением делаю задержку 20мс. Однако появилась необходимость писать в EEPROM 7 байтов подряд (адреса с 0x04 по 0x0A). Данные содержатся в массиве buf[4][1]...buf[4][8].
Сначала использовал конструкцию:
Код:
for (k = 1; k < 8; k++) {
   EEPROM_Write(k+3, buf[4][k]);
}
Delay_ms(20);
Записывает только первые два байта. Время от времени записываются больше. Например 4 или даже все 7.
Немного изменил формат:
Код:
for (k = 1; k < 8; k++) {
   EEPROM_Write(k+3, buf[4][k]);
   Delay_ms(20);
}
Теперь пишет либо все, либо ничего. Для записи требуется несколько попыток (1...7).
Хорошо. Дай думаю введу проверку записи каждого байта:
Код:
for (k = 1; k < 8; k++) {
    while (EEPROM_Read(k + 3) != buf[4][k]) {   
        EEPROM_Write(k+3, buf[4][k]);
        Delay_ms(20);
    }
}
Как ни странно, но ничего не меняется. Для записи также требуется несколько попыток (1...7).

Последний раз редактировалось eleks; 27.02.2019 в 17:44.
eleks вне форума   Ответить с цитированием
Старый 27.02.2019, 18:12   #5
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 242
Вес репутации: 317/53
eleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rough
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Посмотрел ассемблерный код. Никакого криминала нет. Все почти соответствует даташиту. В том смысле, что WR контролируется не на выходе, а на входе:
Код:
;C code :: 		EEPROM_Write(addr, data);
      	MOVLW       addrL
      	MOVWF       FARG_EEPROM_Write_address, 1
      	MOVLW       addrH
      	MOVWF       FARG_EEPROM_Write_address+1, 1
  	MOVFF       data, FARG_EEPROM_Write_data_
  	CALL        _EEPROM_Write, 0
...
_EEPROM_Write:
L_EEPROM_Write0:
      	BTFSS       EECON1, 1 		; WR=1?
      	BRA         L_EEPROM_Write1 	; если нет, то L_EEPROM_Write1
      	NOP
      	BRA         L_EEPROM_Write0 	; если да, то идти на L_EEPROM_Write0 и там ждать сброса WR
L_EEPROM_Write1:
      	BCF         EECON1, 6 		; CFGS = 0
  	MOVFF       FARG_EEPROM_Write_address+1, EEADRH
  	MOVFF       FARG_EEPROM_Write_address, EEADR
  	MOVFF       FARG_EEPROM_Write_data_, EEDATA
      	BCF         EECON1, 7 		; EEPGD = 0
      	BSF         EECON1, 2 		; WREN = 1
  	MOVFF       INTCON, R0		; сохранить INTCON в R0
      	BCF         INTCON, 7 		; Запретить прерывания
      	MOVLW       85			; 
      	MOVWF       EECON2 		; EECON2 = 55H
      	MOVLW       170			;
      	MOVWF       EECON2 		; EECON2 = AAH
      	BSF         EECON1, 1 		; WR = 1
      	BTFSC       R0, 7 		; Если прерывания были разрешены, то L__EEPROM_Write4
      	BRA         L__EEPROM_Write4	;
      	BCF         INTCON, 7 		;
      	BRA         L__EEPROM_Write5	; Иначе на L__EEPROM_Write5
L__EEPROM_Write4:
      	BSF         INTCON, 7		; 
L__EEPROM_Write5:
      	BCF         EECON1, 2		; WREN = 0
 		
L_end_EEPROM_Write:
      	RETURN      0			; Выйти из ПП
eleks вне форума   Ответить с цитированием
Старый 27.02.2019, 23:10   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,321
Вес репутации: 4401/96
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

eleks
не читал Ваш код.
не вникал в Вашу проблему.

однако на Вашем месте бы заблокировал доступ к шине, остановив DMA и запретив прерывания до окончания прожига.
besogon вне форума   Ответить с цитированием
Старый 27.02.2019, 23:20   #7
masterok999
Senior Member
 
Регистрация: 28.07.2015
Адрес: NA
Возраст: 56
Сообщений: 254
Вес репутации: 1001/30
masterok999 has much to be proud ofmasterok999 has much to be proud ofmasterok999 has much to be proud ofmasterok999 has much to be proud ofmasterok999 has much to be proud ofmasterok999 has much to be proud ofmasterok999 has much to be proud ofmasterok999 has much to be proud of
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Да, это правильнее "WR контролируется не на выходе, а на входе" для скорости записи - можно много чего успеть сделать после: "BSF EECON1,WR,A"
НО, также нужно помнить что прочитать достоверные данные из ячейки куда пишем не получится до завершения цикла.
Поэтому перед контрольным чтением нужна процедура:
Код:
EE_WR    BTFSC   EECON1,WR,A 
         BRA     EE_WR

Последний раз редактировалось masterok999; 27.02.2019 в 23:25.
masterok999 вне форума   Ответить с цитированием
Старый 28.02.2019, 09:39   #8
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,413
Вес репутации: 2632/85
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Цитата:
Сообщение от masterok999 Посмотреть сообщение
Да, это правильнее "WR контролируется не на выходе, а на входе" для скорости записи - можно много чего успеть сделать после: "BSF EECON1,WR,A"
НО, также нужно помнить что прочитать достоверные данные из ячейки куда пишем не получится до завершения цикла.
Поэтому перед контрольным чтением нужна процедура:
Код:
EE_WR    BTFSC   EECON1,WR,A 
         BRA     EE_WR
С другой стороны, нужно GIE вернуть назад как только запись завершится, желательно сразу же и WREN отключить, что бы не записать чего лишнего. По-этому и не смог сделать проверку WR на входе, если продолжительность GIE = 0 не важна, то можно и на входе проверять.
Рак вне форума   Ответить с цитированием
Старый 28.02.2019, 13:07   #9
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 242
Вес репутации: 317/53
eleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rough
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Для порядка испытал и линейный вариант:
Код:
EEPROM_Write(0x04, buf[4][1]);
EEPROM_Write(0x05, buf[4][2]);
Delay_ms(20);
EEPROM_Write(0x06, buf[4][3]);
EEPROM_Write(0x07, buf[4][4]);
Delay_ms(20);
EEPROM_Write(0x08, buf[4][5]);
EEPROM_Write(0x09, buf[4][6]);
Delay_ms(20);
EEPROM_Write(0x0A, buf[4][7]);
Delay_ms(20);
Результат тот же. Иногда пишет с первого раза, иногда с н-го
eleks вне форума   Ответить с цитированием
Старый 28.02.2019, 13:17   #10
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,413
Вес репутации: 2632/85
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Цитата:
Сообщение от eleks Посмотреть сообщение
Для порядка испытал и линейный вариант:
Код:
EEPROM_Write(0x04, buf[4][1]);
EEPROM_Write(0x05, buf[4][2]);
Delay_ms(20);
EEPROM_Write(0x06, buf[4][3]);
EEPROM_Write(0x07, buf[4][4]);
Delay_ms(20);
EEPROM_Write(0x08, buf[4][5]);
EEPROM_Write(0x09, buf[4][6]);
Delay_ms(20);
EEPROM_Write(0x0A, buf[4][7]);
Delay_ms(20);
Результат тот же. Иногда пишет с первого раза, иногда с н-го
Попробуйте мой работающий вариант из первого поста. По итогу я скомбинировал функцию записи с предварительным чтением и проверкой записаного и записуемого на равенство. В случае несовпадения, как минимум, в регистре ADR адрес уже находится.
Рак вне форума   Ответить с цитированием
Старый 28.02.2019, 16:04   #11
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 242
Вес репутации: 317/53
eleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rough
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Цитата:
Сообщение от Рак Посмотреть сообщение
Попробуйте мой работающий вариант из первого поста. По итогу я скомбинировал функцию записи с предварительным чтением и проверкой записаного и записуемого на равенство. В случае несовпадения, как минимум, в регистре ADR адрес уже находится.
Попробую. Правда, судя по ассемблеру, встроенная процедура из MikroC также хранит GIE. В принципе так и надо. В противном случае процедура записи будет всегда этот бит устанавливать, вне зависимости от предыдущего этой процедуре состояния.

Чего только уже не пробовал. Результат ноль. Берет подозрение, что это какой-то косяк MikroC. Ранее у меня уже была проблема с записью. EEPROM не писалась, если Delay_ms находилась в условном блоке. Выносишь за его пределы и запись начинает работать.
eleks вне форума   Ответить с цитированием
Старый 28.02.2019, 17:32   #12
al.kl
Senior Member
 
Регистрация: 11.10.2011
Возраст: 24
Сообщений: 304
Вес репутации: 978/44
al.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Я бы давно уже выкинул такой компилятор, который заставляет тратить время на шаманство, вместо работы.
eleks, чем он так хорош, что Вы терпите с ним муки ?
al.kl вне форума   Ответить с цитированием
Старый 28.02.2019, 17:46   #13
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 242
Вес репутации: 317/53
eleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rougheleks is a jewel in the rough
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Цитата:
Сообщение от al.kl Посмотреть сообщение
Я бы давно уже выкинул такой компилятор, который заставляет тратить время на шаманство, вместо работы.
eleks, чем он так хорош, что Вы терпите с ним муки ?
Коллеги, компилятор не при чем. Тут моя вина. В хелпе же ясно сказано:
// for PIC18
Код:
void EEPROM_Write(unsigned int address, unsigned short data);
Для адреса ячейки надо использовать переменную unsigned int, а я использовал unsigned char. Полез в свои старые проги (я когда-то делал бутлоадер) и посмотрел как там было сделано. Короче установил требуемый тип переменной и все заработало. Так что MikroC хороший компилятор и не дорогой.
eleks вне форума   Ответить с цитированием
Старый 28.02.2019, 18:11   #14
al.kl
Senior Member
 
Регистрация: 11.10.2011
Возраст: 24
Сообщений: 304
Вес репутации: 978/44
al.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Ерунда какая то. Значение переменной должно просто преобразоваться к нужному типу, и всё.
al.kl вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Время записи в EEPROM PIC12F683 kaligraf Вопросы начинающих 2 12.04.2016 02:00
EEPROM в PIC16F84 miksayer Вопросы начинающих 14 09.03.2012 18:41
PIC16F877 EEPROM стирается после выключения питания alx71 Продукция MICROCHIP 15 16.12.2010 10:00
Внутренний EEPROM 16F84A nayabuka Продукция MICROCHIP 29 25.03.2008 10:59
PIC18F452 не пишет в EEPROM tzirulnicov Продукция MICROCHIP 2 03.01.2008 16:10


Часовой пояс GMT +3, время: 13:29.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot