Sholkin
Apr 2 2007, 15:43
Здравствуйте. Первый раз на вашем форуме. На том где я обычно страшиваю не кто не ответил .Посоветовали к вам. Проблема вот какая.
(тему по ентому можно посмотреть сдесь
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
думал в этом деле нет всё осталось по прежнему. чегодальше делать где рыть не знаю
Не юбижайтесь, но довольно трудно разбираться в чужих листингах 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
bodja74
Apr 4 2007, 11:18
Цитата(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 ? В том же духе и по остальному коду.
В этом коде слишком много ошибок ,чтобы он работал даже на симуляторе
mempfis_
Apr 7 2007, 16:34
Привет
вот ещё мой код который стопроцентно рабочий
(покрайней мере в мегеа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
Sholkin
Apr 10 2007, 05:36
Здравствуйте
В пятницу поседел над програмкой вот чего получилось. Задачи у меня разделены сначала пишим в память потом в еепром потом обнуляем в памяти ячейки куда пишим считываем с еепром и записываем в память. Раньше у меня считывалось (убрал в програмке запись в еепром ) из еепром всё нормально как только занашу код записи прога не работаеть. Чего сделал в пятницу . Убрал все перечисленные ошибки зашил в память проца прогу (в имуляторе всё работает проверил) болт. Потом убрал опять записи в ячейки еепрома зашил всё считываеться . Потом вставил замись в еепром полько в первыю ячейку зашил заработало потом вставил запись во вторрую ячейку зашил работает теперь пишиться в две ячейки встави запиь в третью ячейку болт не стала работать прога. записи одинаковые но дальше 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
Sholkin
Apr 17 2007, 05:37
Здравствуйте.
Зделал всё как мне сказали выше борада ещё больше запуталься какойто проклятый .
Если я делаю как у атмела (... В примерах от атмела, проверка 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 .................................................
KamikFROMrussia
May 6 2007, 21:07
Здорова всем!
Проблема с EEPROM:
Программирую для ATMEGA128 на С в AVRstudio 4.
#include <avr/io.h>
#define __nop __asm__ __volatile__ ("nop":

;
void eddyEEPROMwrite ( uint8_t ADDR, uint8_t DAT )
{
while(EECR & (1<<EEWE)) ;
EEAR = ADDR;//location
EEDR = DAT;//byte
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
__nop;
__nop;
}
uint8_t eddyEEPROMread ( uint8_t ADDR )
{
uint8_t getDAT;
while(EECR & 0x02);
EEAR = ADDR;//location;
EECR |= (1<<EERE);
while ( EECR & 0x01 );
getDAT=EEDR;
return getDAT;
}
int main(void)
{
uint8_t ad, da, res;
ad=0;
da=1;
eddyEEPROMwrite( ad, da );
res=eddyEEPROMread( ad );
while(1);
}
Кто-ниб может подсказать почему условие
while(EECR & 0x02);
не выполняется при том, что бит EEWE(0x02) в регистре EECR в нуле. Это первое.
Второй вопрос:
Кто-нибудь использовал стандартную библиотеку eeprom.h?
Зачем там нужен дефайн:
#define EEMEM __attribute__((section(".eeprom")))
и как его правильно использовать?
Приведите, пожалуйста, проверенные примеры на С записи данных в ЕЕПРОМ для атмеге128 или других схожих МК.
Заранее всем спасибо!
Цитата(KamikFROMrussia @ May 7 2007, 01:07)

Кто-нибудь использовал стандартную библиотеку eeprom.h?
Зачем там нужен дефайн:
#define EEMEM __attribute__((section(".eeprom")))
и как его правильно использовать?
Так eeprom.h и нужно использовать, а не изобретать велосипед.
Проблема в этом коде:
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
Бит EEWE должен быть установлен в единицу
не позже чем через 4 цикла после установки в единицу бита EEMWE.
Во первых вы не отключаете прерывания, а оно спокойно может произойти между записью EEMWE и EEWE!
Во вторых язык С не дает ни каких гарантий о времени исполнения операций!!!! Да, на уровне оптимизации -Os этот код исполниться меньше чем за 4 цикла. Но без оптимизации (-O0) может быть больше 4 циклов.
Посмотрите ответ #5:
http://electronix.ru/forum/index.php?showtopic=29366Там пример использования EEMEM и функций eeprom_write_block/eeprom_read_block. Также вы можете найти на своем диске файл 'avr-libc-user-manual.pdf' и посмотеть там описание функций eeprom_read_byte, eeprom_read_word, eeprom_write_byte и eeprom_write_word.
Анатолий.
PS: А вы знаете про вошебное слово: M103C?
Цитата(Sholkin @ May 10 2007, 15:09)

Здравствуйте .
Код не могу привести вставляю тут нет такого шрифта кракозябы. Предоставлю попозже.
Хорошо, я сделаю этот фрагмент за вас, без применения шрифта "кракозябры":
.DSEG
Num1: .BYTE 1
.ESEG
EENum1: .DB 0
.CSEG
;...
LDI R20, LOW(EENum1)
OUT EEARL, R20
SBI EECR, EERE
REP0:
SBIC EECR, EERE
RJMP REP0
IN R21, EEDR
STS Num1,r21
По существу:
1. Перед изменением EEARL,EEARH надо проверять бит EEWE регистра EECR, так как в текущий момент может продолжаться запись в EEPROM
2. Проверка бита EERE, по вашему мнению, видимо должна помочь определить завершение чтения из EEPROM. Интересный способ, а datasheet читать пробовали? Как там рекомендуют определять окончание чтения из EEPROM, и нужно ли это делать?
И таких моментов в вашей программе - на каждом шагу. Если вы поменяете абсолютные адреса на символьные имена регистров и битов, то подобные ошибки в программе заметно даже при беглом взгляде. А разбираться в вашем текущем исходнике - мало желающих.
Sholkin
May 14 2007, 22:45
Здравствуйте .
Сейчас всё наладилось могу предоставить код
проивел в читабельный вид
Вот был такой
WRITE_EEPROM:
clr r22 ;обнуление переменной условия записи в EEPROM
ldi r20,0 ; заносим старший бит адреса EEPROM куда будем писать
OUT $1F,R20 ; заносим старший бит адреса EEPROM в 1F
ldi r20,0 ; заносим младшее значение адреса EEPROM куда будем писать
OUT $1E,R20 ; заносим младшее значение адреса EEPROM в $1E
lds r21,$60 ; заносим данные в регистр из памяти
OUT $1D,R21 ; заносим данные из регистра в EEPROM
SBI $1C,2 ; устанавливаем флаг EEWE разрешаем запись в EEPROM
SBI $1C,1 ; устанавливаем флаг EERE
WEP0:SBIC $1C,1 ; проверяем флаг записи в EEPROM
RJMP WEP0 ;
Расписал подробно в коментариях что этим хотел
Потом привёл в в такой вид
WEP3:SBIC EECR, EEWE ;проверяем флаг нет ли записи в EEPROM
RJMP WEP3
ldi VAR,0 ; заносим старший бит адреса EEPROM куда будем писать
OUT EEARH,VAR ; заносим старший бит адреса EEPROM в 1F
ldi VAR,3 ; заносим младшее значение адреса EEPROM куда будем писать
OUT EEARL,VAR ; заносим младшее значение адреса EEPROM в $1E
lds DATA,$63 ; заносим данные в регистр из памяти
OUT EEDR,DATA ; заносим данные из регистра в EEPROM
SBI EECR,EEMWE ; устанавливаем флаг EEWE разрешаем запись в EEPROM
SBI EECR,EEWE ; устанавливаем флаг EERE
Его я написал до сообщения AE . Были технические проблемы раньше не мог предоставить
По существу стал как в даташите снача проверять потом делать все изменения
Проблема осталась первые три ячейки пишет четвёртую болт. Некоторые говорят что
функцию
WEP3:SBIC EECR, EEWE ;проверяем флаг нет ли записи в EEPROM
RJMP WEP3
можно писать до изменя что и после изменения
Выше я как то писал что пробовал и так и так но если проверяю перед изменением в имуляторе нулевая ячейка памяти (когда считываю ) переписываеться на последнюю запись при записи в ЕЕПРОМ. Если проверяю у всех после изменения (код который первый в имуляторе всё окей) Но с этим как нибудь сам разберусь.
Проблема осталась почему боле трёх не пишит. У кого спрашивал те больше двух ячеек не писали сказать не могут смотрели всё правильно. Перед записью пробовал запрятить прерывания не помогло.
Воп в принципе и всё.
Кто чем может. С кодом AE по разбиралься не много его не понял
Цитата(Sholkin @ May 15 2007, 07:45)

...
Проблема осталась почему боле трёх не пишит. У кого спрашивал те больше двух ячеек не писали сказать не могут смотрели всё правильно. Перед записью пробовал запрятить прерывания не помогло.
Воп в принципе и всё.
Кто чем может. С кодом AE по разбиралься не много его не понял
Уважаемый Sholkin !
Это не мой код, это ВАШ код (без изменений), который я привёл в читабельный вид, что бы его легче было понять мне, и, надеюсь, остальным тоже. Теперь вы сами не понимаете СВОЙ код в читабельном виде, круг замкнулся.
Вот, как написано вами:
ldi R20,0 ;чтение 1 цифры
OUT $1E,R20
SBI $1C,0
REP0:SBIC $1C,0
RJMP REP0
IN R21,$1D
sts $60,r21
Вот мой вариант:
.DSEG
Num1: .BYTE 1
.ESEG
EENum1: .DB 0
.CSEG
;...
LDI R20, LOW(EENum1)
OUT EEARL, R20
SBI EECR, EERE
REP0:
SBIC EECR, EERE
RJMP REP0
IN R21, EEDR
STS Num1,r21
Оба варианта одинаковы, но вариант с символьными именами позволяет легче обрнаружить ошибку: объясните, что делает инструкция "SBIC EECR, EERE" (SBIC $1C,0) ?
Sholkin
May 17 2007, 12:59
Здравствуйте.
Вот этого фрагмента не достаточно
WEP3:SBIC EECR, EEWE ;проверяем флаг нет ли записи в EEPROM
RJMP WEP3
ldi VAR,0 ;заносим старший бит адреса EEPROM куда будем писать
OUT EEARH,VAR ; заносим старший бит адреса EEPROM в 1F
ldi VAR,3 ; заносим младшее значение адреса EEPROM куда будем писать
OUT EEARL,VAR ; заносим младшее значение адреса EEPROM в $1E
lds DATA,$60 ; заносим данные в регистр из памяти
OUT EEDR,DATA ; заносим данные из регистра в EEPROM
SBI EECR,EEMWE ; устанавливаем флаг EEWE разрешаем запись в EEPROM
SBI EECR,EEWE ; устанавливаем флаг EERE
Или привести весь код . Впринципе вот этот фрагмент в программе повторяеться 6 раз меняется только данные взятые из ячеек памяти
lds DATA,$60 ; заносим данные в регистр из памяти
это данные из ячеки памяти по адресу $60 пот тот же врагмент только из ячейки $61 $62 $63 ...
defunct
May 17 2007, 22:51
Цитата(Sholkin @ May 17 2007, 14:59)

Вот этого фрагмента не достаточно
тут вроде бы все ок,
нехватает только cli/sei:
Код
OUT EEDR,DATA ; заносим данные из регистра в EEPROM
cli
SBI EECR,EEMWE ; устанавливаем флаг EEWE разрешаем запись в EEPROM
SBI EECR,EEWE ; устанавливаем флаг EERE
sei
С записью вроде бы разобрались.
Если проблема осталась - ищите ее в чтении.
Еще, если вы оформите фрагметы записи и чтения ячейки eeprom как функции, то работать станет гораздо проще, и ошибок будет меньше.
Ниже я привожу пример записи/чтения массивов размером до 255 символов в/из eeprom. Разберитесь с этим примером.