Страница 1 из 1

Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 01:09:05
Ghostgkd777
Помогите, братья по разуму, начинающему мучителю ассемблера!

Нужно запомнить пару чисел в EEPROM, считывать их в дальнейшем. В AVR Studio при чтении после записи выдает нули и в Proteus поведение аналогичное: как будто ничего никогда и не писали в EEPROM. В железе проверил - та-же лажа :(

Attiny13

Код: Выделить всё

                       .
                       .
                       .
.eseg
.org 0x30
EESPEED:  	.byte 1
EEHEAT:		.byte 1

.CSEG 
.org 0

                    .
                    .
                    .

			sbi EECR, EEPM1
			ldi ADRREG,EESPEED
			rcall EEPROM_write
			ldi ADRREG,EEHEAT
			rcall EEPROM_write

                   .
                   .
                   .
                   .

			ldi ADRREG,EESPEED
			out EEARL,ADRREG
			sbi EECR,EERE
			in SPEED,EEDR					; читаем уставку скорости из EEPROM
			ldi ADRREG,EEHEAT				; выставляем адрес уставки температуры
			out EEARL,ADRREG
			sbi EECR,EERE
			in HEAT,EEDR					; читаем уставку температуры из EEPROM

                    .
                    .
                    .
 
;=========== ЗАПИСЬ В EEPROM ==================

EEPROM_write:
			
			cli
			out EEARL,ADRREG
; Write data (AD) to data register
			out EEDR,AD                                     ; AD - регистр, где содержится инфа, которую надо записать в EEPROM
; Write logical one to EEMPE
			sbi EECR,EEMPE
; Start eeprom write by setting EEPE
			sbi EECR,EEPE
EEWR:		sbic EECR,EEPE		       			; ожидание окончания записи
			rjmp EEWR
			sei
			ret
Прошу не кидать в меня тухлыми рыбьими хвостами - я еще только учусь :))
Да, знаю, что можно организовать отслеживание окончания записи иначе, не вводя ЦП в цикл, но для текущей задачи это вполне приемлемо.

Версия AVR Studio 4.19 Proteus 7.10 SP0 Частота МК дефолтная 4,8МГц

Вообще, верно-ли я все "оформил" т.е. зарезервировал 2 байта в EEPROM, осуществляю запись/чтение, сомневаюсь насчет директив .eseg и Метка: .byte 1 т.к. впервые это делаю. Отступил не то что рекомендованные производителем 8 байт от начала EEPROM, а аж целых 48!

Пожалуйста, подскажите, где собака порылась! :(

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 03:34:01
pcb
Вот рабочий код

Код: Выделить всё

EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEPE
rjmp EEPROM_write
; Set Programming mode
ldi r16, (0<<EEPM1)|(0<<EEPM0)
out EECR, r16
; Set up address (r17) in address register
out EEARL, r17
; Write data (r16) to data register
out EEDR,r16
; Write logical one to EEMPE
sbi EECR,EEMPE
; Start eeprom write by setting EEPE
sbi EECR,EEPE
ret
в пдфке написано, как правильно, даже с примером на асме :idea:

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 05:27:13
akl
Ghostgkd777 писал(а):Помогите, братья по разуму, начинающему мучителю ассемблера!

Код: Выделить всё

sbi EECR, EEPM1
Эта команда предполагает, что будет производиться только запись в уже стертую (0xFF) ячейку.

Код: Выделить всё

ldi r16, (0<<EEPM1)|(0<<EEPM0)
out EECR, r16
Этой командой будет произведено стирание старой информации и запись новой в одном цикле. Но, уже дольше.

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 10:37:24
Ghostgkd777
pcb писал(а):Вот рабочий код

Код: Выделить всё

EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEPE
rjmp EEPROM_write
; Set Programming mode
ldi r16, (0<<EEPM1)|(0<<EEPM0)
out EECR, r16
; Set up address (r17) in address register
out EEARL, r17
; Write data (r16) to data register
out EEDR,r16
; Write logical one to EEMPE
sbi EECR,EEMPE
; Start eeprom write by setting EEPE
sbi EECR,EEPE
ret
в пдфке написано, как правильно, даже с примером на асме :idea:
Это все понятно, видел, конечно, это и более того, последовательность операций с регистрами памяти сохранил из даташита. Одна лишь разница, что в даташите проверяется (и ждет, если это не так) окончен-ли пердыдущий цикл записи, а в моем примере последующая программа не выполняется до тех пор, пока не закончится запись, что равноценно. Сделал я это так потому,что в дальнейшем теле программы включаются двигатель и реле, что может привести к сбою при записи в память.

Считаю свой код так-же рабочим, покрайней мере ту часть, где осуществляется запись в память.

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 11:20:57
Ghostgkd777
akl писал(а):

Код: Выделить всё

sbi EECR, EEPM1
Эта команда предполагает, что будет производиться только запись в уже стертую (0xFF) ячейку.

Код: Выделить всё

ldi r16, (0<<EEPM1)|(0<<EEPM0)
out EECR, r16
Этой командой будет произведено стирание старой информации и запись новой в одном цикле. Но, уже дольше.
Верно-ли я Вас понял, в режиме Write Only (EEPM1=1, EEPM0=0) не будет происходить запись в ячейку памяти, если ее содержимое не затерто (0xFF)? И только в режиме Erase and Write in one operation (EEPM1=EEPM0=0) МК сначала "обнулит" (запишет 0xFF) адресуемую ячейку и корректно запишет содержимое EEDR в нее? В этом моя ошибка?

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 11:43:53
akl
Да, именно так. Попробуйте в студии.

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 12:00:20
BOB51
Запись будет произведена в любом случае, только вот результат таковой ... :)) зависит от предшествующего содержимого ячейки... :)

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 12:28:20
Ghostgkd777
akl писал(а):Да, именно так. Попробуйте в студии.
Спасибо огромное, действительно все заработало :beer:
Попутно нашел пару косячков с BR** переходами в теле программы, но все заработало. Сейчас буду пытать в железе)

Re: Не запоминаются числа в EEPROM Attiny13 (assembler)

Добавлено: Пн мар 24, 2014 13:24:17
pcb
Проверять окончание предыдущей записи нужно перед началом новой. Иначе не работает.
Я так понимаю запись происходит с некоторой задержкой. Поэтому при инициализации записи флаг записи устанавливается с некоторой задержкой, в несколько тактов.