|
не пишится в EEPROM данные, Реально не пишится в EEPROM данные |
|
|
|
Apr 2 2007, 15:43
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Первый раз на вашем форуме. На том где я обычно страшиваю не кто не ответил .Посоветовали к вам. Проблема вот какая. (тему по ентому можно посмотреть сдесь http://www.fulcrum.ru/cgi-bin/bbs/mess_sel...564&page=1)В процессоре не записываються данные в EEPROM. Написал программу в AVR 4.12 всё нормально данные пишуться прогу зашил в проц мега 8L на этом блоке где идет запись в EEPROM он застопориваеться и даль всё. Вот мой кусок проги записи в эмуляторе всё тип топ ;запись расхода электроэнергии в EEPROM clr r22 ;обнуление переменной условия записи в EEPROM ldi r20,0 OUT $1E,R20 lds r21,$60 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP0: SBIC $1C,1 RJMP WEP0 ldi r20,1 OUT $1E,R20 lds r21,$61 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP1: SBIC $1C,1 RJMP WEP1 ldi r20,2 OUT $1E,R20 lds r21,$62 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP2: SBIC $1C,1 RJMP WEP2 ldi r20,3 OUT $1E,R20 lds r21,$63 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP3: SBIC $1C,1 RJMP WEP3 ldi r20,4 OUT $1E,R20 lds r21,$64 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP4: SBIC $1C,1 RJMP WEP4 ldi r20,5 OUT $1E,R20 lds r21,$65 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP5:SBIC $1C,1 RJMP WEP5 ldi r20,6 OUT $1E,R20 MOV r21,r15 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 WEP6:SBIC $1C,1 RJMP WEP6 ;обнуление памяти о расходе електроэнергии ldi r16,0b00000000 ;временно заносим данные о электроэнергии sts $60,r16 sts $61,r16 sts $62,r16 sts $63,r16 sts $64,r16 sts $65,r16 clr r15 ; чтение из EEPROM данных расхода электроэнергии в десятичной форме ; и запись их в память ldi R20,0 ;чтение 1 цифры OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP0:SBIC $1C,0 RJMP REP0 IN R21,$1D sts $60,r21 ldi R20,1 ;чтение 2 цифры OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP1:SBIC $1C,0 RJMP REP1 IN R21,$1D sts $61,r21 ldi R20,2 ;чтение 3 цифры OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP2:SBIC $1C,0 RJMP REP2 IN R21,$1D sts $62,r21 ldi R20,3 ;чтение 4 цифры OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP3:SBIC $1C,0 RJMP REP3 IN R21,$1D sts $63,r21 ldi R20,4 ;чтение 5 цифры OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP4:SBIC $1C,0 RJMP REP4 IN R21,$1D sts $64,r21 ldi R20,5 ;чтение 6 цифры OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP5:SBIC $1C,0 RJMP REP5 IN R21,$1D sts $65,r21 ldi R20,6 ;чтение номера счётчика из EEPROM OUT $1E,R20 LDI R20,1 OUT $1C,R20 REP6:SBIC $1C,0 RJMP REP6 IN R15,$1D ;запись номера счётчика в регистор ; конец чтение из EEPROM данных расхода электроэнергии в десятичной форме Потом сделал как доке сначала команду WEP0: SBIC $1C,1 RJMP WEP0 потом OUT $1E,R20 lds r21,$60 OUT $1D,R21 LDI R21,4 sts $3C,R21 LDI R21,2 sts $3C,R21 думал в этом деле нет всё осталось по прежнему. чегодальше делать где рыть не знаю
|
|
|
|
|
Apr 3 2007, 10:22
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Не юбижайтесь, но довольно трудно разбираться в чужих листингах asm, если они такие большие и без всяких комментариев, так что не думаю, что кто-то этим займется. Также превожу свой код, копирующий массив данных в EEPROM. Код ;---------------------------------------------------------------------------------------------------------------------------- ; Загрузка параметров из EEPROM LoadParameters: ldi ZL, 0; Z указатель на начало области данных ldi ZH, 0
ldi YL, low(SpeedBuff) ldi YH, 1; Работаем только в пределах первых 256 байт ОЗУ
out EEARH, zero
EEPROM_read:
out EEARL, YL; Set up address (Y) in address register
sbi EECR, EERE; Start eeprom read by writing EERE in tmp, EEDR; Read data from data register st Y+, tmp
cpi YL, low(ParamsBuff+ParamsCount) brne EEPROM_read
ld maxAdrH, -Y ld maxAdrL, -Y
ld maxSpeed, -Y ld config, -Y ld tmp, -Y mov YL, tmp ldi sCountL, 1 ldi sCountH, 0
ret ;----------------------------------------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------------------------------- ; Сохранение параметров EEPROM ; Перед каждой запись байт проверяется на соответствие, запись производится только при обновлении значения SaveParameters: ldi YL, low(SpeedBuff) out EECR, zero
; Wait for completion of previous write EEPROM_Write: sbic EECR, EEPE rjmp EEPROM_Write
; Set up address in address register out EEARL, YL
; Start eeprom read by writing EERE sbi EECR, EERE ; Read data from data register in tmp, EEDR ; сравниваем текущее значение с записанным ld tmp2, Y+ cp tmp, tmp2 breq DoNotWrite ; если это значение уже записано - выходим ; Write data to data register out EEDR, tmp2 ; обновляем параметр ; Write logical one to EEMPE sbi EECR, EEMPE ; Start eeprom write by setting EEPE sbi EECR, EEPE
DoNotWrite: cpi YL, low(ParamsBuff+ParamsCount) brne EEPROM_Write
ret
|
|
|
|
|
Apr 4 2007, 10:30
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте вроде в моём коде все коментарии прописаны програмка просто проверяеть записалось или нет. Сделал я как в даташите (я и раньше писал что всё сотрел там и сделал так) оказалось при чтении у меня первое значение которое считываеться с еепрома не правильно считываеться вместо него считываеться последнне записаноое если продублировать с какй ячейки считываеться то всё в норме. При зашитии в проц даже байда что и была. Вернулься к предыдущему варианту. В авеерке все как надо и пишиться и считываеться . Парни спасибо что привели свои програимки но они пахоже на мои но почему мой та не работает. Чужое хорошо но своё та надо добить Что делать???7
|
|
|
|
|
Apr 4 2007, 11:18
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(Sholkin @ Apr 4 2007, 10:30)  Чужое хорошо но своё та надо добить Что делать???7 Чужой код со своим сравнивать ,вот что делать. ldi r20,0 OUT $1E,R20 <<В младший мы записали ,а где в старший ? lds r21,$60 OUT $1D,R21 LDI R21,4 sts $3C,R21 <<К чему это шаманство ? Это же адресс таймера. LDI R21,2 sts $3C,R21 << И это тоже? WEP0: SBIC $1C,1 RJMP WEP0 Где установка EEMWE, EEWE ? В том же духе и по остальному коду. В этом коде слишком много ошибок ,чтобы он работал даже на симуляторе
|
|
|
|
|
Apr 5 2007, 06:35
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
bodja74 вы немного не правы . Симуляторе работает всё идеально и пишится всё как надо . Попробую применить код выше сказанный и посмотреть как он работает
|
|
|
|
|
Apr 7 2007, 16:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Привет вот ещё мой код который стопроцентно рабочий (покрайней мере в мегеа8 и мега8535 работал)
; П/П чтения данных из EEPROM ; адрес ячейки памяти помещается в регистры s2:s1 ; данные считываются из регистра s3 EEPROM_read: wdr sbic EECR,EEWE rjmp EEPROM_read out EEARH,s2 out EEARL,s1 sbi EECR,EERE in s3,EEDR ret
; П/П записи данных в EEPROM ; адрес ячейки памяти помещается в регистры s2:s1 ; данные помещаются в регистр s3 EEPROM_write: wdr sbic EECR,EEWE rjmp EEPROM_write out EEARH,s2 out EEARL,s1 out EEDR,s3 sbi EECR,EEMWE sbi EECR,EEWE ret
|
|
|
|
|
Apr 10 2007, 05:36
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте В пятницу поседел над програмкой вот чего получилось. Задачи у меня разделены сначала пишим в память потом в еепром потом обнуляем в памяти ячейки куда пишим считываем с еепром и записываем в память. Раньше у меня считывалось (убрал в програмке запись в еепром ) из еепром всё нормально как только занашу код записи прога не работаеть. Чего сделал в пятницу . Убрал все перечисленные ошибки зашил в память проца прогу (в имуляторе всё работает проверил) болт. Потом убрал опять записи в ячейки еепрома зашил всё считываеться . Потом вставил замись в еепром полько в первыю ячейку зашил заработало потом вставил запись во вторрую ячейку зашил работает теперь пишиться в две ячейки встави запиь в третью ячейку болт не стала работать прога. записи одинаковые но дальше 3 ячейки не пишит . Вообще не понял привожу новый код
Как он приведен пишится в ячейки еепрома в 0 и 1 если раблокировать запись в 3 прога на ней встанет колом пока мыслей нет в имуляторе всё окей Пожскажите ещё чего может быть ? может проц гнилой ? или я .................. rjmp reset reti reti reti reti reti reti reti reti reti reti rjmp RXC rjmp UDRE rjmp TXC
aa: sbic $12,4 ; сравнение Pd(0)=1 rjmp outr0 ; пограмма передачи низкого уровня символа rjmp outr1 outr0:cbi $12,4 ;вывод сигнала анти сброс (0) rjmp aa outr1:sbi $12,4 ;вывод сигнала анти сброс (1) wdr ;сбрасывать WDT(вачдок таймер rjmp aa reset: //////////////////////////////////////////////////////////////////////////////// ldi r16,0b00011001 ;установка защиты от зависания программы out $21,r16 ldi r16,0b00000001 ;временно заносим данные о электроэнергии sts $60,r16 ldi r16,0b00000010 sts $61,r16 ldi r16,0b00000011 sts $62,r16 ldi r16,0b00000100 sts $63,r16 ldi r16,0b00000101 sts $64,r16 ldi r16,0b00000110 sts $65,r16 ldi r16,0b10000001 ;временно заносим номер счётчика mov r15,r16 ldi r16,$DF ;инициализация стека out $3d,r16 clr r14 ;запись расхода электроэнергии в EEPROM WRITE_EEPROM: clr r22 ;обнуление переменной условия записи в EEPROM ldi r20,0 OUT $1F,R20 ldi r20,0 OUT $1E,R20 lds r21,$60 OUT $1D,R21 SBI $1C,2 SBI $1C,1 WEP0:SBIC $1C,1 RJMP WEP0
ldi r20,0 OUT $1F,R20 ldi r20,1 OUT $1E,R20 lds r21,$61 OUT $1D,R21 SBI $1C,2 SBI $1C,1 WEP1:SBIC $1C,1 RJMP WEP1 // ldi r20,0 // OUT $1F,R20 // ldi r20,2 // OUT $1E,R20 // lds r21,$62 // OUT $1D,R21 // SBI $1C,2 // SBI $1C,1 //WEP2:SBIC $1C,1 // RJMP WEP2 // ldi r20,0 // OUT $1F,R20 // ldi r20,3 // OUT $1E,R20 // lds r21,$63 // OUT $1D,R21 // SBI $1C,2 // SBI $1C,1 /////WEP3:SBIC $1C,1 // RJMP WEP3 // ldi r20,0 // OUT $1F,R20 // ldi r20,4 // OUT $1E,R20 // lds r21,$64 // OUT $1D,R21 // SBI $1C,2 // SBI $1C,1 //WEP4:SBIC $1C,1 // RJMP WEP4 // ldi r20,0 // OUT $1F,R20 // ldi r20,5 // OUT $1E,R20 // lds r21,$65 // OUT $1D,R21 // SBI $1C,2 // SBI $1C,1 //WEP5:SBIC $1C,1 // RJMP WEP5
// ldi r20,0 // OUT $1F,R20 // ldi r20,6 // OUT $1E,R20 // mov r21,r15 // OUT $1D,R21 // SBI $1C,2 // SBI $1C,1 //WEP6:SBIC $1C,1 // RJMP WEP6
;обнуление памяти о расходе електроэнергии ldi r16,0b00000000 ;временно заносим данные о электроэнергии sts $60,r16 sts $61,r16 sts $62,r16 sts $63,r16 sts $64,r16 sts $65,r16 clr r15 ; чтение из EEPROM данных расхода электроэнергии в десятичной форме ; и запись их в память
ldi R20,0 ;чтение 1 цифры OUT $1E,R20 SBI $1C,0 REP0:SBIC $1C,0 RJMP REP0 IN R21,$1D sts $60,r21
ldi R20,1 ;чтение 2 цифры OUT $1E,R20 SBI $1C,0 REP1:SBIC $1C,0 RJMP REP1 IN R21,$1D sts $61,r21
ldi R20,2 ;чтение 3 цифры OUT $1E,R20 SBI $1C,0 REP2:SBIC $1C,0 RJMP REP2 IN R21,$1D sts $62,r21
ldi R20,3 ;чтение 4 цифры OUT $1E,R20 SBI $1C,0 REP3:SBIC $1C,0 RJMP REP3 IN R21,$1D sts $63,r21
ldi R20,4 ;чтение 5 цифры OUT $1E,R20 SBI $1C,0 REP4:SBIC $1C,0 RJMP REP4 IN R21,$1D sts $64,r21
ldi R20,5 ;чтение 6 цифры OUT $1E,R20 SBI $1C,0 REP5:SBIC $1C,0 RJMP REP5 IN R21,$1D sts $65,r21
ldi R20,6 ;чтение номера счётчика из EEPROM OUT $1E,R20 SBI $1C,0 REP6:SBIC $1C,0 RJMP REP6 IN R15,$1D ;запись номера счётчика в регистор ; конец чтение из EEPROM данных расхода электроэнергии в десятичной форме
//////////////////////////////////////////////////////////////////////////// ;установка режима порт D ldi r16,0b11110010 ldi r17,0b00001101 out $11,r16 ;установка регистра DDR_D out $12,r17 ;установка регистра PORT_D ;установка режима USART ldi r23,0b00000010 out $0B,r23 ;установка регистра UCSRA ldi r23,0b11011000 ;разрешаем работу приёмника/передатчика и разрешаем прерывания по завершению приёма/передачи out $0A,r23 ;установка регистра UCSRB ldi r23,0b00000000 out $20,r23 ;установка регистра UBRRH ldi r23,0b10000110 out $20,r23 ;установка регистра UCSRC ldi r23,0b01100111 out $09 ,r23 ;установка регистра скорости приёма/передачи UBRRL sei ;разрешение прерывания rjmp aa
RXC: sbi $12,5 ;вывод сигнала приём закончен in r23,$0C ;получение данных с регистра USART cpse r23,r15 ;сравнение данных регистра приёма USART с номером счётчика rjmp felse ;не совпадение кода и на подпрограмму о передачи принятых данных sbi $12,6 ;вывод сигнала о совподении кода lds r23,$60 ;данные совпадают с номером счётчика out $0C,r23 ldi r23,0b11111000 out $0A,r23 ; разрешаем прерывание по опусташению регистра данных USART inc r14 reti UDRE: mov r23,r14 cpi r23,0b00000001 brne writ3 lds r23,$61 ;передача второй цифры out $0C,r23 inc r14 reti writ3:cpi r23,0b00000010 brne writ4 lds r23,$62 ;передача третей цифры out$0C,r23 inc r14 reti writ4:cpi r23,0b00000011 brne writ5 lds r23,$63 ;передача четвёртой цифры out $0C,r23 inc r14 reti writ5:cpi r23,0b00000100 brne writ6 lds r23,$64 ;передача пятой цифры out $0C,r23 inc r14 reti writ6:lds r23,$65 ;передача шестой цифры out $0C,r23 clr r14 ldi r23,0b11011000 out $0A,r23 ;заприщаем работу прерывания по опустошению регистра приёма/передачи reti TXC: sbi $12,7 ;вывод сигнала завершения передачи reti
felse:mov r24,r23 out $0C,r24 ldi r24,0b10101010 out $0C,r24 reti
|
|
|
|
|
Apr 17 2007, 05:37
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Зделал всё как мне сказали выше борада ещё больше запуталься какойто проклятый . Если я делаю как у атмела (... В примерах от атмела, проверка EEWE делается перед записью, а не после) у мкня после записи в ЕЕпром читаем записываем в память в первую ячейку пишется значение не первой ячейки еепрома а последняя запись е еепром тесть пишу допустим в 6 ячеек еепрома обнуляю память потом считываю с еепропа пишу в память 6 ячейка еепрома пишится и в нулевую ячейку памяти и в шестую это всё в эмуляторе Тот код который я превёл он в имуляторе работает без глюков вот потому так и оставил . Но я уже писал пишитчся полько первые две ячейки на третьеи прога встаёт колом . Но вот породокс в коде при записи в третью ячеику функцию WEP0:SBIC $1C,1 RJMP WEP0 записал перед ldi r20,0 OUT $1F,R20 ldi r20,2 OUT $1E,R20 lds r21,$62 OUT $1D,R21 SBI $1C,2 SBI $1C,1 третья стала писаться проделал тоже с четвертой болт теперь на четвёртой клинит с ней ни так ни так не идёт перед записью ставил CLI запретить прерывание тоже болт воопще мистика эта так пишится это так эта вообще не как SOS .................................................
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|