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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 14.02.2019, 10:44   #1
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,371
Вес репутации: 2386/78
Рак 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
Возраст: 32
Сообщений: 2,150
Вес репутации: 4017/88
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
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,371
Вес репутации: 2386/78
Рак 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
Сообщений: 232
Вес репутации: 317/51
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
Сообщений: 232
Вес репутации: 317/51
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
Возраст: 32
Сообщений: 2,150
Вес репутации: 4017/88
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
Возраст: 55
Сообщений: 236
Вес репутации: 786/25
masterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to behold
По умолчанию 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
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,371
Вес репутации: 2386/78
Рак 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
Сообщений: 232
Вес репутации: 317/51
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
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,371
Вес репутации: 2386/78
Рак 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
Сообщений: 232
Вес репутации: 317/51
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
Сообщений: 297
Вес репутации: 862/40
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 behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: PIC18FxxK80 & EEPROM xc8

Я бы давно уже выкинул такой компилятор, который заставляет тратить время на шаманство, вместо работы.
eleks, чем он так хорош, что Вы терпите с ним муки ?
al.kl вне форума   Ответить с цитированием
Старый 28.02.2019, 17:46   #13
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 232
Вес репутации: 317/51
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
Сообщений: 297
Вес репутации: 862/40
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 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, время: 19:22.


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