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

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

Сб дек 31, 2022 01:21:21

Последние три позиции в functions...
И вроде на виду и "не приметны"...
:?

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

Сб дек 31, 2022 11:19:53

Ноль на конце хорошь тогда, когда DB-шка не включает его. А ведь она может включать его. Отсюда мораль: найти у DB-шки конец надо другим способом.
Предполагаю так:
Код:
read_loop:
ldi counter, 2*(endstring-string)
ldi ZL, low(2*string)
ldi ZH, high(2*string)
again:
lpm temp, Z+
rcall something
dec counter
tst counter
breq exit
rjmp again

Но че-то оно не работает. А из-за 16-битной авр-овской памяти, не могу догнать как правильно.

С AVRASM у меня все плохо, т.к linux

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

Сб дек 31, 2022 12:30:01

Ноль на конце хорошь тогда, когда DB-шка не включает его. А ведь она может включать его. Отсюда мораль: найти у DB-шки конец надо другим способом.
.....Но че-то оно не работает. А из-за 16-битной авр-овской памяти, не могу догнать как правильно.
С AVRASM у меня все плохо, т.к linux

А чем мой код то не понравился?
Вы думаете компилятор в конец строки какой то другой НОЛЬ подставит? Да, будет два ноля, но программа то все равно на первый сработает.
Причину "не работы" Вашей программы тяжело обнаружить не имея представления кто заполняет string и куда потом он идет. Ну на первый взгляд - Ваш регистр counter всегда ноль по выходу из Вашего цикла.
Присмотритесь к своей задаче и выберите себе один из форматов string - или "0 terminated" или (устаревший)с длиной строки в первом байте строки.

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

Сб дек 31, 2022 12:43:50

Shuspano писал(а):dec counter
dec counter
tst counter
breq exit
rjmp again

tst counter - лишняя команда. после декремента уже тест сделан.
и должно быть так:
dec counter
brne again
exit:

то есть, вместо пяти твоих строк нужно всего 2 строки.

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

Сб дек 31, 2022 15:34:49

При текстовой строке, содержащей коды символов ASCII нужно только начальный адрес да контроль считанных данных на код 0х00.
Память читаем побайтово от начального адреса до встречи кода 0х00.
Или ищем иной код, используемый в качестве стопового, если это не символьная строка, а бинарник.
:roll:
Вопрос резервирования места под строку актуален только для ОЗУ (или ЕЕПРОМ).
8)

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

Сб дек 31, 2022 15:58:54

Практикую ставить метки в начале и в конце таблицы. К примеру
Код:
read_loop:
   ldi ZL,low(2*TBI)         ;string)
   ldi ZH,high(2*TBI)         ;string)
again:
   lpm R0, Z
   rcall something
   CPI   ZL,LOW(2*TBI_END)
   BRLO   AGAIN
EXIT:
   RJMP   PC

something:
   ST   Z+,R0
   RET
;*****
.org   $100
TBI:
      .DB   $3F,$06         ; 0,1 Кодирования индикатора 
      .DB   $5B,$4F      ; 2,3
      .DB   $66,$6D      ; 4,5
      .DB   $7D,$07      ; 6,7
      .DB   $7F,$6F      ; 8,9

      .DB   $00,$00      ; гашение незначащего нуля
TBI_END:
;************************************************

С наступающим...

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

Сб апр 01, 2023 15:18:06

С наступающим...
Спасибо :)

Ну раз моё сообщение первое в этом году :), то ползвольте сначала всех поздравить :)
С новым 2023-м годом уважаемые форумчане!

Пишу вот по какому поводу.. Вобщем интересная ситуация обнаружилась.
Сейчас пишу код, расчётов много, много загрузок тех или иных данных. Данные от 8-ми до 24 бит нужно грузить в три регистра, и если данные 8 или 16 бит, то старшие регистры очищаются естественно..
На этом фоне вопрос по оформлению кода встал ребром :)

Сначала грузил типа:
Код:
.set Var1 = 0x6EF5
ldi R16, low (Var1)
ldi R17, high  (Var1)
clr R18
в различных вариациях.
Потом после недолгих экспериментов пришёл к такому варианту:
Код:
.set Var1 = 0x28
ldi R20, BYTE1   (Var1)
ldi R21, BYTE2   (Var1)
ldi R22, BYTE3   (Var1)
причём вместо Var1 может быть любое значение до 32 бит (но потребуется 4-й регистр) Код конечно стал на много симпатичнее и нагляднее.

Но самое интересное, что во всей документации по авр асму, которой располагаю (от атмел и микрочип), ни где в функциях не нашёл "BYTE1", хотя написано что "BYTE2" и "HIGH" дублируют друг друга.. Может конечно в каких то старых мануалах есть. :dont_know:

как то так ..

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

Сб апр 01, 2023 19:04:50

Все прекрасно описано еще для avrsam2 для аврстудио4 (правда мой экземпляр уже в редакции от микрощипа)
40001917A_AVR Assembler_User Guides.pdf
(312.32 KiB) Скачиваний: 24

смотреть страницу33...
или тот же встроенный help -> avr tools user guide -> avr assembler -> user's guide -> expressions (для авр студио 4.19)
За byte1 видимо просто не сочли нужным делать описание его эквивалента low.
Кстати... есть и альтернатива:
Код:
.set tests = 0x4567af
ldi r16,low(tests)
ldi r17,low(tests>>8)
ldi r18,low(tests>>16)

:beer:

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

Сб апр 01, 2023 21:41:16

BOB51 писал(а):За byte1 видимо просто не сочли нужным делать описание его эквивалента low.
Ага, и по этому пришлось догадываться по смыслу :)) у меня не так много фудаментальных знаний.
Я кстати тем же документом от микрочипа пользовался.
BOB51 писал(а):Кстати... есть и альтернатива:
Код:
.set tests = 0x4567af
ldi r16,low(tests)
ldi r17,low(tests>>8)
ldi r18,low(tests>>16)

Оо.. А за это спасибо. Тут можно больше 32 бит данных загрузить.
:beer:

Добавлено after 56 minutes 14 seconds:
Ага, и по этому пришлось догадываться по смыслу :))...
Ан нет, нашёл "BYTE1", в атмеловском "AVR Instruction Set Manual", вскользь упоминается всего в одном месте и то в примере.
п 57.2., стр. 90, (Atmel-0856L-AVR-Instruction-Set-Manual_Other-11/2016)

Но кстати я как то BYTE1,2,3.. лучше воспринимаю, чем low/high. И код ровнее :))

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

Вс апр 02, 2023 06:53:12

...Тут можно больше 32 бит данных загрузить...
Касательно студии, поддерживающей 32-битные значения, не получится. Я не смог выразить константу, кроме как прямым занесением
Код:
.equ   VAR   =1000000000000   ;E8 D4A5 1000

Буду признателен тому, кто знает как это делается.

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

Вс апр 02, 2023 08:53:53

akl писал(а):Касательно студии, поддерживающей 32-битные значения, не получится.
В смысле? Только сейчас попробовал. Собирается без ошибок.
Студия 4.19, но в ней только собираю, а код пишу в стороннем редакторе.
Код:
.equ var = 999999999999999999999999999999999999999

ldi R16, low(var)
ldi R17, low(var>>8)
ldi R18, low(var>>16)
ldi R19, low(var>>24)
ldi R20, low(var>>32)
ldi R21, low(var>>40)
ldi R22, low(var>>48)
ldi R23, low(var>>56)
ldi R24, low(var>>64)

PS что в R24 не проверял, но думаю, что именно var>>64

Добавлено after 41 minute 51 second:
Хм.. да, действительно, больше 32 бит не получится.
Сейчас прогнал этот код, с выводом на дисплей.
Код:
.equ var = 77777777777777

ldi R16, low(var)
ldi R17, low(var>>8)
ldi R18, low(var>>16)
ldi R19, low(var>>24)
ldi R20, low(var>>32)
ldi R21, low(var>>40)
ldi R22, low(var>>48)
ldi R23, low(var>>56)
ldi R24, low(var>>64)
ldi R24, low(var>>72)

ldi YL,low (Result+9)       ;
ldi YH,high (Result+9)      ;
   st  Y, R16
   st -Y, R17
   st -Y, R18
   st -Y, R19
   st -Y, R20
   st -Y, R21
   st -Y, R22
   st -Y, R23
   st -Y, R24
   st -Y, R25

Младшие 32 бита выводит правильно, а дальше или нули или мусор из FF, в зависимости от константы.

Изображение

а должно быть 46 BD 0C D0 DC 71

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

Вс апр 02, 2023 09:26:03

Код:
;.equ var = 999999999999999999999999999999999999999; калькулятор XP-винды с этим числом не справился, поэтому урезал до
.equ var = 9999999999999999999;8AC7230489E7FFFF

.CSEG
TEST:

ldi R16, low(var)
ldi R17, low(var>>8)
ldi R18, low(var>>16)
ldi R19, low(var>>24)
ldi R20, low(var>>32)
ldi R21, low(var>>40)
ldi R22, low(var>>48)
ldi R23, low(var>>56)
ldi R24, low(var>>64)

RJMP   TEST
.EXIT

:dont_know: Ничего похожего на 0x8AC7230489E7FFFF моя студия не собирает. Жирным выделено правильная часть значения.

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

Вс апр 02, 2023 10:16:47

ДЫК....
Даже в СИ АВРок непосредственно задается максимум только четыре байта (long, double)
дальше уже float (но те же 4 байта).
Так что "особо не разгоняйтесь"
:beer:

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

Вс апр 02, 2023 13:42:47

Тут дело больше не в том, что бы преодолеть 4-х байтовый порог, а найти способ написания кода, что бы более менее воспринимался интуитивно.

Я на TFT дисплеи "подсел". Там, что бы задать координаты поля, нужно отправить 8 байт. Долго я не мог найти интуитивно понятный вариант. Пробовал и через макросы и через массивы под .db, но всё не то..
Вот только недавно попробовал использовать .dw, на нём и остановлюсь.
Но .dw имеет свои особенности, связанные с 16-ти битной организацией памяти. По этому в подпрограмме обработки есть небольшие заморочки :)) Хотя ни по циклам, ни по коду за рамки дозволенного не вышла. Ещё и регистры экономятся.

Теперь запись стала выглядеть примерно так:
Set_str_1_tab: .DW 3, 319, 20, 20+23
Смотрю и понимаю в каком углу дисплея это поле находится :))

А до этого постоянно в калькулятор приходилось нырять, что бы перегнать в такое: 0x00, 0x03, 0x01, 0x3F, 0x00, 0x14, 0x00, 0x2B :shock: ну или типа.

PS Тут ещё дело в значениях выше 0xff. Можно конечно в десятичном виде записывать: low(319), high(319), но это всё равно не изящно :))

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

Пн май 29, 2023 19:08:30

С AVRASM у меня все плохо, т.к linux

gavrasm использую в linux, плюс avr_sim от того же автора.

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

Пт сен 22, 2023 22:15:32

ДЫК....
Даже в СИ АВРок непосредственно задается максимум только четыре байта (long, double)
дальше уже float (но те же 4 байта).
Так что "особо не разгоняйтесь"
:beer:

4 байта – маловато будет. В, условно говоря, хорошем ассемблере, в котором сейчас работаю, размер переменных до 8 байт. Работать намного удобней. И команды есть удобные.
Например, чтобы в примере shonty отправить через USART массив Set_str_1_tab, можно просто написать команду:
USART_Send_Array Set_str_1_tab Z
Z – указание, что в команде будет использоваться пара регистров Z.

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

Пт сен 22, 2023 22:43:45

AQ29, в ассемблере, какую обработку вы напишете, столько байт число и будет. Хоть 16. Хоть 32.
ПС. USART_Send_Array - не команда ассемблера, а макрос вашего алгоритм билдера, который асемблером называть не совсем корректно.

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

Пн сен 25, 2023 13:03:23

AQ29, в ассемблере, какую обработку вы напишете, столько байт число и будет. Хоть 16. Хоть 32.
ПС. USART_Send_Array - не команда ассемблера, а макрос вашего алгоритм билдера, который асемблером называть не совсем корректно.

У меня не алгоритм билдер (АБ). Он давно устарел и сейчас явно слаб.
Ясно, что в командах ассемблера можно сделать разную обработку. Но с переменными работать многократно удобней, ведь для них для основных операций есть встроенные макросы, которые возьмут рутину на себя.
Когда при расчёте по сложной формуле переменная превысила 8 байт, менял алгоритм расчёта, чтобы остаться в пределах 8 байт.

Я не писал, что USART_Send_Array – команда ассемблера, у меня она названо просто командой.
В АБ нет встроенных команд такого типа. В АБ придётся самому писать макросы для всех вариантов команды, а их много.
Приведена неполная команда. В полном представлении команды есть ещё необязательные параметры: начальный индекс, с которого начнётся посылка массива, и число посылаемых элементов.
Есть ещё параметр Wait. При полудуплексной передаче после посылки пакета нельзя сразу переходить к приёму, надо подождать передачи последнего байта. Параметр Wait это делает.
Можно также указать номер USART, ведь в некоторых МК есть несколько USART.
Самому писать макросы под все эти варианты – тяжкий труд, это что-то из программирования прошлого века.
А со встроенными командами всё проще, достаточно только набрать строчку команды.
Насчёт некорректности названия ассемблер согласен. В этом плане предварительно сделал замечание «условно говоря». Программа находится где-то между ассемблером и ЯВУ. К ассемблеру всё-таки ближе.

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

Ср сен 27, 2023 14:17:01

Всем добрый день. Подскажите, как можно пробежаться по массиву, размещённому во флеш-памяти? Есть atmega8a. Написал такую программу, но она не работает

Код:
#define __SFR_OFFSET 0
   
#include   "avr/io.h"

   /* Секция данных */
   .section .data

table:
   .byte 0b00000001, 0b00000010, 0b00000011
   /* Секция кода */

   /*
1   0x000(1)   RESET   External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
2   0x001   INT0   External Interrupt Request 0
3   0x002   INT1   External Interrupt Request 1
4   0x003   TIMER2 COMP   Timer/Counter2 Compare Match
5   0x004   TIMER2 OVF   Timer/Counter2 Overflow
6   0x005   TIMER1 CAPT   Timer/Counter1 Capture Event
7   0x006   TIMER1 COMPA   Timer/Counter1 Compare Match A
8   0x007   TIMER1 COMPB   Timer/Counter1 Compare Match B
9   0x008   TIMER1 OVF   Timer/Counter1 Overflow
10   0x009   TIMER0 OVF   Timer/Counter0 Overflow
11   0x00A   SPI, STC   Serial Transfer Complete
12   0x00B   USART, RXC   USART, Rx Complete
13   0x00C   USART, UDRE   USART Data Register Empty
14   0x00D   USART, TXC   USART, Tx Complete
15   0x00E   ADC   ADC Conversion Complete
16   0x00F   EE_RDY   EEPROM Ready
17   0x010   ANA_COMP   Analog Comparator
18   0x011   TWI   Two-wire Serial Interface
19   0x012   SPM_RDY   Store Program Memory Ready
   */
   
   .section .text
   .org 0x0000
   
   rjmp RESET_vect
   reti          ; INT0
   reti         ; INT1
   reti         ; TIMER2_COMP
   reti         ; TIMER2_OVF
   reti         ; TIMER1_CAPT
   reti         ; TIMER1_COMPA
   reti         ; TIMER1_COMPB
   reti         ; TIMER1_OVF
   reti         ; TIMER0_OVF
   reti         ; SPI_STC
   reti         ; USART_RXC
   reti         ; USART_UDRE
   reti         ; USART_TXC
   reti         ; ADC
   reti         ; EE_RDY
   reti         ; ANA_COMP
   reti         ; TWI
   reti         ; SPM_RDY   
   
RESET_vect:
   ldi r16, RAMEND & 0xff
   out SPL, r16
   ldi r16, RAMEND >> 8
   out SPH, r16

   ldi r16, 0b00111111
   out DDRC, r16

   ldi r16, 0b00000000
   sei

_main:
   out PORTC, r16

   ldi ZL, lo8(table)
   ldi ZH, hi8(table)

   lsl ZH
   lsl ZL

   brcc _set_index
   inc ZH
   
_set_index:   
   ldi r17, 3
_loop:
   lpm r0, Z+
   out PORTC, r0

   dec r17
   cpi r17, 0x00
   brne _loop
   
   rjmp _main


Во всех примерах рекомендуют записать в Z регистр адрес массива, сдвинутый влево, но gnu assembler, как оказалось, не умеет применять операторы умножения и сдвига к адресам меток. Похоже, это связано с особенностями линковщика (по крайней мере, так пишут тут https://stackoverflow.com/questions/184 ... binary-and). Поэтому я поступил прямолинейнее и просто сдвинул ZL и ZH влево, а потом увеличил ZH, чтобы вернуть бит, потерянный при сдвиге. Но программа всё равно не работает и просто пишет 0xff в PORTC. Подскажите, в чём может быть ошибка?

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

Ср сен 27, 2023 16:45:46

просто сдвинул ZL и ZH влево,

А если так попробовать:
lsl ZL
rol ZH
Хз какой там синтаксис у GNU, в студии 4 обычно так пишу:
LDI ZH, High(Code_Table*2) ; адрес кодовой таблицы
LDI ZL, Low(Code_Table*2) ;

lpm ; данные в регистре 0
Ответить