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

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
Ghostgkd777
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

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

Сообщение 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!

Пожалуйста, подскажите, где собака порылась! :(
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

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

Сообщение 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:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Ghostgkd777 писал(а):Помогите, братья по разуму, начинающему мучителю ассемблера!

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

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

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

ldi r16, (0<<EEPM1)|(0<<EEPM0)
out EECR, r16
Этой командой будет произведено стирание старой информации и запись новой в одном цикле. Но, уже дольше.
Аватара пользователя
Ghostgkd777
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

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

Сообщение 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:
Это все понятно, видел, конечно, это и более того, последовательность операций с регистрами памяти сохранил из даташита. Одна лишь разница, что в даташите проверяется (и ждет, если это не так) окончен-ли пердыдущий цикл записи, а в моем примере последующая программа не выполняется до тех пор, пока не закончится запись, что равноценно. Сделал я это так потому,что в дальнейшем теле программы включаются двигатель и реле, что может привести к сбою при записи в память.

Считаю свой код так-же рабочим, покрайней мере ту часть, где осуществляется запись в память.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ghostgkd777
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

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

Сообщение 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 в нее? В этом моя ошибка?
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Да, именно так. Попробуйте в студии.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Запись будет произведена в любом случае, только вот результат таковой ... :)) зависит от предшествующего содержимого ячейки... :)
Аватара пользователя
Ghostgkd777
Открыл глаза
Сообщения: 50
Зарегистрирован: Пт фев 01, 2013 21:06:17

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

Сообщение Ghostgkd777 »

akl писал(а):Да, именно так. Попробуйте в студии.
Спасибо огромное, действительно все заработало :beer:
Попутно нашел пару косячков с BR** переходами в теле программы, но все заработало. Сейчас буду пытать в железе)
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

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

Сообщение pcb »

Проверять окончание предыдущей записи нужно перед началом новой. Иначе не работает.
Я так понимаю запись происходит с некоторой задержкой. Поэтому при инициализации записи флаг записи устанавливается с некоторой задержкой, в несколько тактов.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Ответить

Вернуться в «AVR»