Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает EEPROM меги8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
oleg_lwd
При включении, выключении питания с EEPROM меги 8 либо всегда считываются все 0xFF, либо EEPROM нормально работает, т.е. считывается то, что было записано раньше. Причем, то же самое происходит уже на 3-ех изделиях. Кто нибудь сталкивался с таким? Что делать?
add
код в студию.. (особливо чтение из eeprom) :-)
IEC
Постарайтесь включить внутренний супервизор! У меня были аналогичные проблемы, только улетали случайные биты. Причина: при медленном фронте наростания(или спада!?) напряжения питания камень кудато улетает и затерает EEPROM! Кажется я правильно понял объяснения ATMEL?
oleg_lwd
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
Цитата(oleg_lwd @ May 29 2006, 13:52) *
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 ,или контроллеру с первого раза не доходит smile.gifsmile.gifsmile.gif
И чтобы выбрать значение ячейки из ЕЕР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
Цитата
а работает странно, как будто бы при включении питания нет какой-то инициализации.

Конечно странно, почему вы не дожидаетесь факта помещения данных в 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
Цитата
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
Цитата(defunct @ May 29 2006, 15:49) *
Конечно странно, почему вы не дожидаетесь факта помещения данных в EEDR при чтении.


А это не нужно,проц сам пропускает 4 такта перед выполнением следующей команды если натыкается на EERE=1,и за один такт заносит данные в EEDR.
Реееедко ,но иногда нуно перед чтением проверять EEWE ,и то если перед чтением была команда записи в EEPROM.
defunct
Цитата(bodja74 @ May 29 2006, 19:11) *
А это не нужно,проц сам пропускает 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
для 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
defunct
Цитата(Laksus @ May 29 2006, 20:27) *
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
Огромное всем СПАСИБО!!! Программа изначально была написана для AT90S4414 у него нет EEARН, он по даташиту не инициализируется при ресете!!! Хотя сделали кучу приборов на 8515, м32, м16 и всегда EEARН инициализировался 0, а на меге8 этот номер не прошел.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.