Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сб дек 11, 2021 16:43:02

ARV, Ваша память всё ещё на высоте :). Просто дописывала ноль до чётного и при компиляции выбрасывала жёлтый варнинг.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс дек 12, 2021 07:01:34

Да, так как адресация двухбайтная, компилятор об этом предупреждает, и дописывает недостающий байт нулем. Поэтому, кол во байтов всегда должно быть четным, дописывайте сами недостающий байт.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн дек 13, 2021 12:26:56

....Как истинный извращенец пишу на ASM.
...Правильно в програмном флеше.

А вот так другой "извращенец" сделал бы...
Целая куча энергонезависимой памяти с однобайтовой организацией!!!
Код:
.include "m328pdef.inc"

.ESEG
.org 0
   .db   0xFC,0x84,0xDA,0xCE,0xA6,0x6E,0x7E,0xC4,0xFE,0xEE,0x00

.DSEG
.org 0x100

.CSEG
.org 0x00                        
.def   A      = r16            
.def   B      = r17            

.Macro  xchg
   push   @0
   push   @1
   pop   @0
   pop   @1         
.EndMacro

.Macro   ldiw
   ldi    @0L,low(@1)
   ldi   @0H,High(@1)
.EndMacro

.Macro  WaitEEPE ;Ожидание флага готовности EEPE      
   sbic   EECR, EEPE           
   rjmp   PC-1
.EndMacro

.Macro  fld   ;fld   Reg,XYZ
   WaitEEPE
   out   EEARH,@1H
   out   EEARL,@1L
   nop
   nop
   sbi   EECR,EERE
   in   @0,EEDR
.EndMacro

.Macro  flds   ;flds   Reg,Addr
   WaitEEPE
   ldi   @0,High(@1)
   out   EEARH,@0
   ldi   @0,Low(@1)
   out   EEARL,@0
   nop
   nop
   sbi   EECR,EERE
   in   @0,EEDR
.EndMacro

.Macro  fsts   ;fsts   Addr,Reg
   push   r0
   mov   r0,@1
   flds   @1,@0
   cpse   r0,@1
   rcall   writebyte
   mov   @1,r0
   pop   r0
.EndMacro

.Macro  fst   ;fst   XYZ,Reg
   push   r0
   fld   r0,@0
   xchg    r0,@1
   cpse   r0,@1
   rcall   writebyte
   pop   r0
.EndMacro

writebyte:
   cli
   WaitEEPE
   out   EEDR,r0
   sbi   EECR,EEMPE
   sbi   EECR,EEPE
   WaitEEPE
   sei
   ret

Reset:
   cli
   ldiw   X,RAMEND
   out   SPL,XL
   out   SPH,XH
.
.
   sei

Loop:   
;Далее просто вот так читать!   
   ldiw   Z,2
   fld   A,Z
;или так   
   flds   A,2
;Или просто вот так записать!   
   ldiw   Z,2
   ldi   A,0x56
   fst   Z,A
;или так   
   ldi   A,0x56
   fsts   0x2,A
   rjmp   Loop   

Одно НО! Макрос не инструкция и всякие пропуски sbrc(s) или sbic(s) или cpse не работают....Табличку искомую можно в обычную оперативку ОЗУ скопировать при старте если требуется быстрый доступ.
Последний раз редактировалось С.Н. Пн дек 13, 2021 16:51:08, всего редактировалось 4 раз(а).

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн дек 13, 2021 13:31:17

EEPROM для изменяемых данных. Параметры, настройки и прочее. Если данные константы, значит храним их во Flash памяти.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн дек 13, 2021 14:38:52

У ЕЕПРОМки ресурс перезаписи меньше чем у флеша.
Ставить туда чего-то часто перезаписываемого без проверок невыгодно.
Для чтения констант - затраты времени заметно выше, чем при чтении константы из флэша.
:roll:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн дек 13, 2021 15:00:07

У ЕЕПРОМки ресурс перезаписи меньше чем у флеша...

Наоборот. :)
Вложения
EEPROM10000_FLASH100000.png
(17.23 KiB) Скачиваний: 119

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн дек 13, 2021 16:20:27

У ЕЕПРОМки ресурс перезаписи меньше чем у флеша.
Ставить туда чего-то часто перезаписываемого без проверок невыгодно.
Для чтения констант - затраты времени заметно выше, чем при чтении константы из флэша.

По всем пунктам ЗА!. Поэтому проверка встроена при записи. Про время оговорку сделал.
Замечу, что речь зашла про "часы", "извращенец.... на ассемблере".
Так впадем же в этот "блуд" по полной! У меня есть еще в запасе: "технология" #define ... #ifdef и всякие логические выражения, укорачивающие код; операции с нецелыми константами. Все это превращает программу на ассемблере в водевиль.
Чтобы не было обид - сам я такой же "извращенец" - в смысле "любитель ассемблера", как и автор вопроса про выравнивание данных по словам - Да пусть его часы будут ходить всегда верно и красиво! :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн дек 13, 2021 21:36:14

akl
В документации все верно...
Однако на практике - уж довольно часто имеем "глюки" с повреждением содержимого интегрированной в кристалл ЕЕПРОМки...
:(

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт дек 17, 2021 01:49:30

BOB51, ну так или BOD включайте, или после работы с еепромкой положите в регистр EEARL/EEARH адрес неиспользуемой ячейки еепрома
Содержимое обычно портися когда выключается питание. МК в агонии как жидкий терминатор в домне - бросается во все стороны и делает непредсказуемые вещи.
в т. ч. и команду записи или стирания еепрома может инициировать. И запортит ту ячейку, адрес коей лежит в EEAR....

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт дек 17, 2021 09:46:41

В программе, работающей с EEPROM обязательно использую
Код:
   OUT   EECR,ZERO   ; на всякий случай
   SER   R16
   OUT   EEARH,R16   ;
   OUT   EEARL,R16   ;задать заведомо некорректный адрес

Касательно камней, у которых EEPROM <=256 типа Mega48 обмен должен быть по корректному адресу.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт дек 17, 2021 11:37:00

akl, да можно и корректный адрес задавать. Главное, что б ячейка неиспользуемая была.
Или выделить под такую ячейку явный адрес, или загонять в EEAR значение E2END.
Но это в случае батарейных устройств, где МК спит 99% времени и должен экономить батарейку.
В остальных случаях проще включить в фузах BOD - и агонии МК не будет. Но за это надо платить парой десятков микроамперов.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 00:37:15

Скоро сломаю голову. Ошибка где-то на поверхности, но понять не могу.
Работаем с часами DS3231. Работаем по I2C через прерывание. Для начала получаю только секунды, минуты и часы. Старт, отправку адреса часов и регистра, рестарт опускаю. Там всё работает. Сразу к получению данных. Этот вариант работает без вопросов. В оперативке по метке TIMME лежат все нужные данные

Теперь пробую получать ещё 4 регистра - день недели, дату, месяц, год.

И вот тут засада. Секунды, минуты и часы по прежнему корректные, а вот остальные 4 байта заполнены единицами. Подскажите, где я напартачил?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 16:29:36

1 - в симуляторе студии проверьте, в какой момент появляются единицы. I2C в симуляторе не проверить, потому создайте программные закладки.
2 - не обязательно каждый раз считывать данные. Достаточно при включении считать данные, потом опрашивать вывод IRQ кажется, который тикает каждую секунду. Ессно, нужно теперь самому проводить все вычисления. Прибавление секунд, минут, часов. Но так проще.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 17:26:39

a1000, вот честно, в такой закрученной "циклической" логике с кучей переходов, базируясь на flags, я до конца не отследил что и как работает.
Сделайте один цикл на 7 итераций и в нем просто читайте 7 байт данных, складывая их в память и инкрементируя указатель.
Чтение по i2c с точки зрения МК - достаточно медленное, но я не думаю, что у вас прям такой реалтаймовый проект, когда не сделать чтение 3231 на ожиданиях.
Плюсом такого цикла будет то, что установка всех режимов, регистров, флагов i2c будет в одном месте. Включая ACK для всех байтов, кроме последнего, и NACK для последнего.
И тогда вы не наступите на те грабли, которые я вижу на первый взгляд.

У вас во втором примере чтение секунд и минут выполняется макросом/подпрограммой IIC_RCV (RCALL IIC_RCV) - судя по всему, это чтение с флагом ACK.
А вот часы вы читаете макросом IIC_RCV2 - это чтение с NACK - последний байт.
После этого 3231 понимает, что от него уже ничего не ждут, и ничего не отдает. вот вам и 0xFF.
Кроме того, вы читаете день недели, число, месяц и год тем же макросом - IIC_RCV2 - без ACK.

Замените везде, кроме последнего байта (год) RCALL IIC_RCV2 на RCALL IIC_RCV

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 18:29:08

GoldenAndy, вы абсолютно правы. Совсем забыл про NACK, вот и скопировал не глядя. Спасибо за помощь, исправил, всё заработало.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 18:48:48

А почему у меня команда ld не работает в студио-симуляторе для tiny2313 ?
Ошибка компиляции,неправильный регистр. Регистр длинный r30,адрес
ячейки туда загружен и такой и сякой.Все равно ошибка.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 18:56:24

А адрес озу у Вас где? Всю строку пж покажите.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 19:10:25

А почему у меня команда ld не работает в студио-симуляторе для tiny2313 ?
Ошибка компиляции,неправильный регистр. Регистр длинный r30,адрес
ячейки туда загружен и такой и сякой.Все равно ошибка.

Регистровая пара Zh:Zl она же R31:R30
Диапазон адресов для команд LD rd,Z , LDS rdZ+rel касается только ОЗУ (для тини2313 это 0х0000-0x00DF)
Для доступа к таблицам в ПЗУ используется группа команд LPM
8)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 20:35:08

ldi r30,0xdf
ld r20,r30

Ну вот...
И вот.
C:\AVRStudio\belov\belov.asm(50): error: Invalid register

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср янв 05, 2022 20:52:23

Боюсь ошибиться, но по моему, LD работает только с регистровой парой. Попробуйте так
Код:
ldi r30,0xdf
clr r31
ld r20,Z
Ответить