F870 EEPROM проблем
12 отговора
306 прегледа
F870 EEPROM проблем
Правя едно проектче тук в което ползвам Pic16F870 и в което има малко писане и четене в EEPROM паметта на пика.
Проблема се появява когато запиша нещо в EEPROMA. Записа минава нормално, но след това не мога да чета повече нищо (или се четат 00 само). Ако рестартирам пика всичко се оправя, започва нормално да чете от паметта.
Процедурите за писане и четене са същите както са описани в дейташийта, като накрая само съм добавил връщане в банка 0 (bcf rp1, bcf rp0), понеже липсват.
Някой сблъсквал ли се е с подобен проблем и от къде биха могли да дойдат евентуалните проблеми ?
Ако някой иска ще постна и процедурите за read и write.
Проблема се появява когато запиша нещо в EEPROMA. Записа минава нормално, но след това не мога да чета повече нищо (или се четат 00 само). Ако рестартирам пика всичко се оправя, започва нормално да чете от паметта.
Процедурите за писане и четене са същите както са описани в дейташийта, като накрая само съм добавил връщане в банка 0 (bcf rp1, bcf rp0), понеже липсват.
Някой сблъсквал ли се е с подобен проблем и от къде биха могли да дойдат евентуалните проблеми ?
Ако някой иска ще постна и процедурите за read и write.
процедурите
;**************************************************************************
; 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
Re: процедурите
Аз този процесор много не го познавам, работил съм с 16F876A и 18F... Мога да ти дам следните припоръки ( просто за подкрепа )
- кога четеш данните? Може би цикълът на запис още не е завършил ? Провери бита WR!
- в какъв режим го тестваш? Ако си на Debugger, опитай в пълно програмиране. ICD2 ми е правило простотии.
- кога четеш данните? Може би цикълът на запис още не е завършил ? Провери бита WR!
- в какъв режим го тестваш? Ако си на Debugger, опитай в пълно програмиране. ICD2 ми е правило простотии.
Re: процедурите
Минава доста време между записа и последващото четене
А дебъгера е изключен в конфигурационната дума, а и преди програмиране пак проверявам как са настройките.
А дебъгера е изключен в конфигурационната дума, а и преди програмиране пак проверявам как са настройките.
още един тест ...
Правя запис, минават няколко инструкции, опитвам да чета - четат се само 00.
Ако обаче рестартирам пик-а (т.е. изключа и включа захранването) и прочета данните без да съм писал преди това - четат се нормално!
Най-общо програмата прави следното:
при първоначално стартиране, след всички инициализаций, чете от еепрома за да определи в какъв режим ще работи (целта е устройството да остане в режима който е било преди спиране на захранването).
Ако опитам да премина от един режим в друг, като при това запиша необходимата стойност в еепром паметта и направя (нарочно) goto към самото начало на програмата (направо към инитващата част) устройството не чете правилно паметта. Ако го изключа и включа - тогава четенето минава и устройството си отива в режима който трябва!
Всичко до тук ме навежда на мисълта че нещо се сетва не както трябва в процедурата за писане което пречи на следващото четене!
Ако обаче рестартирам пик-а (т.е. изключа и включа захранването) и прочета данните без да съм писал преди това - четат се нормално!
Най-общо програмата прави следното:
при първоначално стартиране, след всички инициализаций, чете от еепрома за да определи в какъв режим ще работи (целта е устройството да остане в режима който е било преди спиране на захранването).
Ако опитам да премина от един режим в друг, като при това запиша необходимата стойност в еепром паметта и направя (нарочно) goto към самото начало на програмата (направо към инитващата част) устройството не чете правилно паметта. Ако го изключа и включа - тогава четенето минава и устройството си отива в режима който трябва!
Всичко до тук ме навежда на мисълта че нещо се сетва не както трябва в процедурата за писане което пречи на следващото четене!
Re: процедурите
Torbata s hitrinite mi e w rabotata. Ako izchakash do utre, move bi shte ti otgoworya neshto po-smisleno.
Re: още един тест ...
"Няколко инструкции" изобщо не е достатъчно време. Записа е мно-о-ого бавен! Четенето е за една инструкция, но записа е много, много по-дълъг.
Общо взето, записа на повече от един байт може да се извърши по два начина:
1. След като вдигнеш WR, чакаш докато падне отново. Тогава можеш да продължиш със следващия байт.
2. Да си разрешиш прекъсване по EEPROM, в което или поставяш следващия байт за запис, или (ако си приключил) забраняваш прекъсването.
Има и вариации, разбира се (напр. да провериш флага за прекъсване по EEPROM, без да е разрешен), но общо взето всичко се свежда до тези два начина. Примера, който си посочил, работи само за 1 байт и то при достатъчно дълга пауза след това. Не знам откъде си го взел, но със сигурност не можеш да го извикаш няколко пъти последователно (дори и с 32kHz кварц - изпробвано е).
Общо взето, записа на повече от един байт може да се извърши по два начина:
1. След като вдигнеш WR, чакаш докато падне отново. Тогава можеш да продължиш със следващия байт.
2. Да си разрешиш прекъсване по EEPROM, в което или поставяш следващия байт за запис, или (ако си приключил) забраняваш прекъсването.
Има и вариации, разбира се (напр. да провериш флага за прекъсване по EEPROM, без да е разрешен), но общо взето всичко се свежда до тези два начина. Примера, който си посочил, работи само за 1 байт и то при достатъчно дълга пауза след това. Не знам откъде си го взел, но със сигурност не можеш да го извикаш няколко пъти последователно (дори и с 32kHz кварц - изпробвано е).
Re: още един тест ...
На 10 MHz ми работи дивайса. Сорса е взет от даташийта на Pic16F870.
За писането ми трябват отделни байтове, а не цял блок.
Сега ще опитам след записа да сложа едно по-голямо изчакване, ако трябва дори до 1-2 mS, предполагам че това вече е напълно достатъчно.
За писането ми трябват отделни байтове, а не цял блок.
Сега ще опитам след записа да сложа едно по-голямо изчакване, ако трябва дори до 1-2 mS, предполагам че това вече е напълно достатъчно.
Навремето бяха 5мс :)
Сега не знам, но е добре или да проверяваш бита или да си поддържаш флаг и да го установяваш по прекъсването след края на записа в ЕЕпром (нали има такова прекъсване?)
Позабравил съм, но в случей като твоя, е много хубава идея да пазиш конфигурацията си на две места и да ги записваш последователно:
- Вдигаш бит че конфигурация 1 е невалидна
- Записваш в конфигурация 1
- сваляш бита че конфигурация 1 е невалидна
- Вдигаш бит че конфигурация 2 е невалидна
- Записваш в конфигурация 2
- сваляш бита че конфигурация 2 е невалидна
При рестарт търсиш валидна конфигурация и я копираш, ако в другата.
Така няма да се скапе работата при ресет по време на запис.
Позабравил съм, но в случей като твоя, е много хубава идея да пазиш конфигурацията си на две места и да ги записваш последователно:
- Вдигаш бит че конфигурация 1 е невалидна
- Записваш в конфигурация 1
- сваляш бита че конфигурация 1 е невалидна
- Вдигаш бит че конфигурация 2 е невалидна
- Записваш в конфигурация 2
- сваляш бита че конфигурация 2 е невалидна
При рестарт търсиш валидна конфигурация и я копираш, ако в другата.
Така няма да се скапе работата при ресет по време на запис.
Re: Навремето бяха 5мс :)
Най-накрая завърших тая дивотия!
Така или иначе направих прочитането на данните да става още в началото след включване на захранването, а при всяка смяна на режима - пиша в еепрома.
И на мен ми се струва че проблема идва от бавно писане в еепрома.
Като остана по-свободен ще проверя какво става с това писане и четене. Важното е че сега стана работата
Така или иначе направих прочитането на данните да става още в началото след включване на захранването, а при всяка смяна на режима - пиша в еепрома.
И на мен ми се струва че проблема идва от бавно писане в еепрома.
Като остана по-свободен ще проверя какво става с това писане и четене. Важното е че сега стана работата
Re: Навремето бяха 5мс :)
От това е бъди сигурен. Трябва да му оставиш поне 5ms да се вземе в ръце след запис. Същите л.... ги ядох с една 24LC128
----------
По склона към връх Фудзи плахо пълзи охлюв към самото небе.
----------
По склона към връх Фудзи плахо пълзи охлюв към самото небе.
Re: Навремето бяха 5мс :)
Е то трябва да пише в документацията колко трае цикъла на запис. За 24С съм сигурен че пише (там поне се пишат по няколко байта наведнъж, за разлика от PIC).
______________
На всеки на пук!
______________
На всеки на пук!