F870 EEPROM проблем

12 отговора 306 прегледа
#1

F870 EEPROM проблем

Правя едно проектче тук в което ползвам Pic16F870 и в което има малко писане и четене в EEPROM паметта на пика.
Проблема се появява когато запиша нещо в EEPROMA. Записа минава нормално, но след това не мога да чета повече нищо (или се четат 00 само). Ако рестартирам пика всичко се оправя, започва нормално да чете от паметта.

Процедурите за писане и четене са същите както са описани в дейташийта, като накрая само съм добавил връщане в банка 0 (bcf rp1, bcf rp0), понеже липсват.

Някой сблъсквал ли се е с подобен проблем и от къде биха могли да дойдат евентуалните проблеми ?

Ако някой иска ще постна и процедурите за read и write.

Отговор
в отговор на Ramirez #2

процедурите


;**************************************************************************
; Read from EEPROM
; input - w - eeprom address
; output - w - eeprom data
;
ReadEE
bsf status,rp1
bcf status,rp0 ; Bank 2
movwf EEADR ; EEPROM address to read
bsf status,rp0 ; Bank 3
bcf eecon1,EEPGD ; Point to DATA memory
bsf eecon1,RD ; EEPROM Read
bcf status,rp0 ; Bank 2
movfw EEDATA
bcf status,rp1 ; Bank 0
return


;**************************************************************************
; Write to EEPROM
; EADR - input
; EDATA - input
;
WriteEE
bsf status,rp1
bcf status,rp0 ; Bank 2
movfw EADR
movwf EEADR
movfw EDATA
movwf EEDATA
bsf status,rp0 ; Bank3
bcf eecon1,eepgd ; point to DATA memory
bsf EECON1,wren ; enable writes
bcf intcon,gie ; disable Interrupts
movlw 0x55
movwf eecon2
movlw 0xaa
movwf eecon2
bsf eecon1,wr
bsf intcon,gie ; enable Interrupts
bcf eecon1,wren ; disable writes
bcf status,rp1 ; Bank 0
bcf status,rp0
return


Отговор
в отговор на Ramirez #3

Re: процедурите

Аз този процесор много не го познавам, работил съм с 16F876A и 18F... Мога да ти дам следните припоръки ( просто за подкрепа )
- кога четеш данните? Може би цикълът на запис още не е завършил ? Провери бита WR!
- в какъв режим го тестваш? Ако си на Debugger, опитай в пълно програмиране. ICD2 ми е правило простотии.

Отговор
в отговор на bateAz #4

Re: процедурите

Минава доста време между записа и последващото четене
А дебъгера е изключен в конфигурационната дума, а и преди програмиране пак проверявам как са настройките.

Отговор
в отговор на Ramirez #5

още един тест ...

Правя запис, минават няколко инструкции, опитвам да чета - четат се само 00.
Ако обаче рестартирам пик-а (т.е. изключа и включа захранването) и прочета данните без да съм писал преди това - четат се нормално!

Най-общо програмата прави следното:
при първоначално стартиране, след всички инициализаций, чете от еепрома за да определи в какъв режим ще работи (целта е устройството да остане в режима който е било преди спиране на захранването).

Ако опитам да премина от един режим в друг, като при това запиша необходимата стойност в еепром паметта и направя (нарочно) goto към самото начало на програмата (направо към инитващата част) устройството не чете правилно паметта. Ако го изключа и включа - тогава четенето минава и устройството си отива в режима който трябва!

Всичко до тук ме навежда на мисълта че нещо се сетва не както трябва в процедурата за писане което пречи на следващото четене!

Отговор
в отговор на Ramirez #6

Re: процедурите

Torbata s hitrinite mi e w rabotata. Ako izchakash do utre, move bi shte ti otgoworya neshto po-smisleno.

Отговор
в отговор на Ramirez #7

Re: още един тест ...

ami ako chetesh nyakolko pyti bez zapis?

Отговор
в отговор на Ramirez #8

Re: още един тест ...

"Няколко инструкции" изобщо не е достатъчно време. Записа е мно-о-ого бавен! Четенето е за една инструкция, но записа е много, много по-дълъг.
Общо взето, записа на повече от един байт може да се извърши по два начина:
1. След като вдигнеш WR, чакаш докато падне отново. Тогава можеш да продължиш със следващия байт.
2. Да си разрешиш прекъсване по EEPROM, в което или поставяш следващия байт за запис, или (ако си приключил) забраняваш прекъсването.
Има и вариации, разбира се (напр. да провериш флага за прекъсване по EEPROM, без да е разрешен), но общо взето всичко се свежда до тези два начина. Примера, който си посочил, работи само за 1 байт и то при достатъчно дълга пауза след това. Не знам откъде си го взел, но със сигурност не можеш да го извикаш няколко пъти последователно (дори и с 32kHz кварц - изпробвано е).

Отговор
в отговор на Mandor #9

Re: още един тест ...

На 10 MHz ми работи дивайса. Сорса е взет от даташийта на Pic16F870.
За писането ми трябват отделни байтове, а не цял блок.

Сега ще опитам след записа да сложа едно по-голямо изчакване, ако трябва дори до 1-2 mS, предполагам че това вече е напълно достатъчно.

Отговор
в отговор на Ramirez #10

Навремето бяха 5мс :)

Сега не знам, но е добре или да проверяваш бита или да си поддържаш флаг и да го установяваш по прекъсването след края на записа в ЕЕпром (нали има такова прекъсване?)
Позабравил съм, но в случей като твоя, е много хубава идея да пазиш конфигурацията си на две места и да ги записваш последователно:
- Вдигаш бит че конфигурация 1 е невалидна
- Записваш в конфигурация 1
- сваляш бита че конфигурация 1 е невалидна
- Вдигаш бит че конфигурация 2 е невалидна
- Записваш в конфигурация 2
- сваляш бита че конфигурация 2 е невалидна
При рестарт търсиш валидна конфигурация и я копираш, ако в другата.
Така няма да се скапе работата при ресет по време на запис.

Отговор
в отговор на NikB #11

Re: Навремето бяха 5мс :)

Най-накрая завърших тая дивотия!

Така или иначе направих прочитането на данните да става още в началото след включване на захранването, а при всяка смяна на режима - пиша в еепрома.
И на мен ми се струва че проблема идва от бавно писане в еепрома.

Като остана по-свободен ще проверя какво става с това писане и четене. Важното е че сега стана работата

Отговор
в отговор на Ramirez #12

Re: Навремето бяха 5мс :)

От това е бъди сигурен. Трябва да му оставиш поне 5ms да се вземе в ръце след запис. Същите л.... ги ядох с една 24LC128

----------
По склона към връх Фудзи плахо пълзи охлюв към самото небе.
Отговор
в отговор на Vapi #13

Re: Навремето бяха 5мс :)

Е то трябва да пише в документацията колко трае цикъла на запис. За 24С съм сигурен че пише (там поне се пишат по няколко байта наведнъж, за разлика от PIC).

______________
На всеки на пук!
Отговор