oleg_lwd 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба При включении, выключении питания с EEPROM меги 8 либо всегда считываются все 0xFF, либо EEPROM нормально работает, т.е. считывается то, что было записано раньше. Причем, то же самое происходит уже на 3-ех изделиях. Кто нибудь сталкивался с таким? Что делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
add 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба код в студию.. (особливо чтение из eeprom) :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IEC 1 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба Постарайтесь включить внутренний супервизор! У меня были аналогичные проблемы, только улетали случайные биты. Причина: при медленном фронте наростания(или спада!?) напряжения питания камень кудато улетает и затерает EEPROM! Кажется я правильно понял объяснения ATMEL? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oleg_lwd 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба corO:сlr R23 out EEARL,R23 rcall EERead_seq ..... rcall EERead_seq .... .... ret .def EErtmp =r31 .def mp16sL=r20 .def mp16sH=r21 EERead_seq: in EErtmp,EEARL sbi EECR,EERE sbi EECR,EERE in mp16sL,EEDR inc EErtmp out EEARL,EErtmp sbi EECR,EERE sbi EECR,EERE in mp16sH,EEDR inc EErtmp out EEARL,EErtmp ret Программа работает уже давно под 8515, Mega16, 32. BODEN естественно включен, EEPROM не сыпется!!!, а работает странно, как будто бы при включении питания нет какой-то инициализации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба EERead_seq: in EErtmp,EEARL<<<<<<< sbi EECR,EERE <<<<<<<< sbi EECR,EERE <<<<<<<< in mp16sL,EEDR inc EErtmp out EEARL,EErtmp sbi EECR,EERE <<<<<<<< sbi EECR,EERE <<<<<<<< А зачем два раза подряд устанавливать EERE ,или контроллеру с первого раза не доходит :):):) И чтобы выбрать значение ячейки из ЕЕРROM нужно заносить значение в EEARL:EEARН,а не извлекать. Пробуйте еще так ,может что с записью в ЕЕРROM. ;Basic MacroCommander v 1.2 for AVR & Proteus .include "c:\bodja\MacroCommander\m8def.inc" ;Вектора прерываний .org 0 ;VECTOR PROG rjmp PROG ;Начало программы PROG: ;PROG ldi R16,high(RAMEND) out SPH,R16 ldi R16,low(RAMEND) out SPL,R16 out eearl,ZL ;R20=EEP[Z] out eearh,ZH sbi eecr,EERE in R20,eedr out eearl,ZL ;EEP[Z]=R20 out eearh,ZH out eedr,R20 cli sbi eecr,EEMWE sbi eecr,EEWE sei sbic eecr,EEWE rjmp (PC-1) ;Конец программы (бесконечный цикл) END_PROG: ;END PROG rjmp END_PROG Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба а работает странно, как будто бы при включении питания нет какой-то инициализации. Конечно странно, почему вы не дожидаетесь факта помещения данных в EEDR при чтении. нужно дождаться когда бит EERE в EECR будет сброшен, и только тогда вытаскивать данные из EEDR.. .def AL = R24 .def AH = R25 ; Read Byte from EEPROM ; --> ZL = Address of EEPROM cell ; <-- AL = value of cell EEPROM[ZL] EEPROMReadByte: out EEAR, ZL sbi EECR, (EERE) _wait_R: sbic EECR, (EERE) rjmp _wait_R in AL, EEDR ret Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба bodja74 А зачем два раза подряд устанавливать EERE ,или контроллеру с первого раза не доходит _______ _С этим двойным чтением непонятный момент. У меня на диске "Атмел2003" в примерах AVR100: Accessing the EEPROM (12 pages, updated 12/98) указано именно такое двойное чтение и в файле AVR100.ASM (Last updated: 97.07.17; Target: AT90S1200) и в DOC0932.PDF (0932B–12/98/xM) Но сейчас на сайте лежит обновленный AVR100.ASM (Last updated: 98.10.14; Target: AT90S8515) там применяется однократное чтение. Хотя в doc0932.pdf (0932C-AVR-09/05) по прежнему: "...The routine then sets the EEPROM Read Strob - EERE twice. ..." Но, наверное, это просто забыли убрать при переделке. _Причиной двойного чтения может быть какой нибудь глюк в первых AVR. Который в последующих устранили. Так полагает Вадим Баранов, автор книги "Применение микроконтроллеров AVR:..." , я с ним согласен. ________________________________________________ ________________________________________________ defunct ... нужно дождаться когда бит EERE в EECR будет сброшен, ..." __________ _Наверное, все таки, не бит EERE, а бит EEWE. А бит EERE после этого установить и только после этого забрать данные из EEDR. ________________________________________________ ________________________________________________ для oleg_lwd _______ 1- может быть имеет смысл инициализировать также и верхний байт адреса, а не только нижний. Может он где нибудь, как нибудь, меняется и чтение происходит из верхней части еепром. 2- может не стОит использовать нулевую ячейку EEPROM. 3- ожидание очистки EEWE я все таки ввел бы, хотя, насколько я понимаю, если перед этим не было записи в еепром, то это не должно вызывать проблем. __________ Александр 2006 05 29 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба Конечно странно, почему вы не дожидаетесь факта помещения данных в EEDR при чтении. А это не нужно,проц сам пропускает 4 такта перед выполнением следующей команды если натыкается на EERE=1,и за один такт заносит данные в EEDR. Реееедко ,но иногда нуно перед чтением проверять EEWE ,и то если перед чтением была команда записи в EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба А это не нужно,проц сам пропускает 4 такта перед выполнением следующей команды если натыкается на EERE=1,и за один такт заносит данные в EEDR. Не каждый проц такое делает. В старых (Classic) было так (из ДШ S2313): When the EERE bit is cleared (zero) by hardware, requested data is found in the EEDR Register. Однако я с Вами вынужден согласиться в ДШ на новые МК, в частности m8 с которым работает автор ветки, уже имеется такая информация: The EEPROM read access takes one instruction, and the requested data is available immediately. When the EEPROM is read, the CPU is halted for four cycles before the next instruction is executed. тем не менее приведенный выше код будет работать и на старых (classic) и на новых (mega/tiny) МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 29 мая, 2006 Опубликовано 29 мая, 2006 (изменено) · Жалоба для defunct ______ Полностью в даташите на 90S2313 так: " When the EERE bit is cleared (zero) by hardware, requested data is found in the EEDR Register. The EEPROM read access takes one instruction and there is no need to poll the EERE bit . When EERE has been set, the CPU is halted for four cycles before the next instruction is executed." То есть он сам постоит, подождет. Опрашивать не надо. ________ Александр 2006 05 29 Изменено 29 мая, 2006 пользователем Laksus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 29 мая, 2006 Опубликовано 29 мая, 2006 · Жалоба and there is no need to poll the EERE bit . When EERE has been set, the CPU is halted for four cycles before the next instruction is executed." То есть он сам постоит, подождет. Опрашивать не надо. Убедили, посыпаю голову пеплом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oleg_lwd 0 30 мая, 2006 Опубликовано 30 мая, 2006 · Жалоба Огромное всем СПАСИБО!!! Программа изначально была написана для AT90S4414 у него нет EEARН, он по даташиту не инициализируется при ресете!!! Хотя сделали кучу приборов на 8515, м32, м16 и всегда EEARН инициализировался 0, а на меге8 этот номер не прошел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться