Перейти к содержанию
    

Не работает EEPROM меги8

При включении, выключении питания с EEPROM меги 8 либо всегда считываются все 0xFF, либо EEPROM нормально работает, т.е. считывается то, что было записано раньше. Причем, то же самое происходит уже на 3-ех изделиях. Кто нибудь сталкивался с таким? Что делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Постарайтесь включить внутренний супервизор! У меня были аналогичные проблемы, только улетали случайные биты. Причина: при медленном фронте наростания(или спада!?) напряжения питания камень кудато улетает и затерает EEPROM! Кажется я правильно понял объяснения ATMEL?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 не сыпется!!!, а работает странно, как будто бы при включении питания нет какой-то инициализации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а работает странно, как будто бы при включении питания нет какой-то инициализации.

Конечно странно, почему вы не дожидаетесь факта помещения данных в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно странно, почему вы не дожидаетесь факта помещения данных в EEDR при чтении.

 

А это не нужно,проц сам пропускает 4 такта перед выполнением следующей команды если натыкается на EERE=1,и за один такт заносит данные в EEDR.

Реееедко ,но иногда нуно перед чтением проверять EEWE ,и то если перед чтением была команда записи в EEPROM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А это не нужно,проц сам пропускает 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) МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для 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

Изменено пользователем Laksus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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."

То есть он сам постоит, подождет. Опрашивать не надо.

 

Убедили, посыпаю голову пеплом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное всем СПАСИБО!!! Программа изначально была написана для AT90S4414 у него нет EEARН, он по даташиту не инициализируется при ресете!!! Хотя сделали кучу приборов на 8515, м32, м16 и всегда EEARН инициализировался 0, а на меге8 этот номер не прошел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...