реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не работает EEPROM меги8
oleg_lwd
сообщение May 29 2006, 09:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



При включении, выключении питания с EEPROM меги 8 либо всегда считываются все 0xFF, либо EEPROM нормально работает, т.е. считывается то, что было записано раньше. Причем, то же самое происходит уже на 3-ех изделиях. Кто нибудь сталкивался с таким? Что делать?
Go to the top of the page
 
+Quote Post
add
сообщение May 29 2006, 10:15
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



код в студию.. (особливо чтение из eeprom) :-)


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
IEC
сообщение May 29 2006, 10:40
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Постарайтесь включить внутренний супервизор! У меня были аналогичные проблемы, только улетали случайные биты. Причина: при медленном фронте наростания(или спада!?) напряжения питания камень кудато улетает и затерает EEPROM! Кажется я правильно понял объяснения ATMEL?
Go to the top of the page
 
+Quote Post
oleg_lwd
сообщение May 29 2006, 10:52
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



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 не сыпется!!!, а работает странно, как будто бы при включении питания нет какой-то инициализации.
Go to the top of the page
 
+Quote Post
bodja74
сообщение May 29 2006, 11:48
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(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
Go to the top of the page
 
+Quote Post
defunct
сообщение May 29 2006, 12:49
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

Конечно странно, почему вы не дожидаетесь факта помещения данных в 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
Go to the top of the page
 
+Quote Post
Laksus
сообщение May 29 2006, 16:10
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата
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
Go to the top of the page
 
+Quote Post
bodja74
сообщение May 29 2006, 16:11
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



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


А это не нужно,проц сам пропускает 4 такта перед выполнением следующей команды если натыкается на EERE=1,и за один такт заносит данные в EEDR.
Реееедко ,но иногда нуно перед чтением проверять EEWE ,и то если перед чтением была команда записи в EEPROM.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 29 2006, 16:44
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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) МК.
Go to the top of the page
 
+Quote Post
Laksus
сообщение May 29 2006, 17:27
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



для 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 - May 29 2006, 17:28
Go to the top of the page
 
+Quote Post
defunct
сообщение May 29 2006, 18:52
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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."
То есть он сам постоит, подождет. Опрашивать не надо.


Убедили, посыпаю голову пеплом.
Go to the top of the page
 
+Quote Post
oleg_lwd
сообщение May 30 2006, 06:13
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016