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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

студия версии 4.xx вполне себе дружит с WinAVR, позволяя делать отладку внутри себя без танцев с бубном.
WinAVR в голом виде - только компилятор. точнее, там есть и свой "отладчик" и "симулятор", но я пока не встречал героя, который бы ими пользовался :)))
новые версии студии работают так же прозрачно с "тулчейном" avr-gcc, т.к. WinAVR - устарел и не поддерживается. WinAVR - это avr-gcc версии 3.3.2, в более свежих версиях есть интересные плюшки :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

[uquote="imerlin",url="/forum/viewtopic.php?p=3529356#p3529356"]...Проблема там в том, что при организации циклом очень большие накладные расходы на сохранение флага C (он используется в многобайтных ADC, SBC, CPC, ROL/ROR и т.д., но при этом портится в DEC), поэтому перед DEC его нужно куда то сохранять, а после - восстанавливать.[/uquote]Замечу, в AVR команды INC DEC флаг C не трогают, поэтому сохранять его не нужно. Мелочь, но приятно. :)
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

типа так:


.listmac

.macro rol_mem
LD R1,X
ROL R1
ST X+,R1
.endm

.macro rol_5
rol_mem
rol_mem
rol_mem
rol_mem
rol_mem
.endm

.cseg

......
rol_5

.......
imerlin
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Вт июл 16, 2013 11:18:59

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

Сообщение imerlin »

Замечу, в AVR команды INC DEC флаг C не трогают, поэтому сохранять его не нужно. Мелочь, но приятно. :)

Хм... И правда... Почему то засело в голове, что в таблице команд указано, что меняет... Помнится матерился из-за этого долго... Толи не на ту строчку посмотрел, толи что еще... :o
Может, в каком то из даташитов ошибка вкралась?
Спасибо, что сказали, а то так бы и пребывал в заблуждении...

Но в любом случае, для сравнения все равно танцы с бубном неизбежны - на Z то ведь по любому влияет.

Добавлено after 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3529404#p3529404"]студия версии 4.xx вполне себе дружит с WinAVR, позволяя делать отладку внутри себя без танцев с бубном.[/uquote]

Спасибо, придется изучать...

Добавлено after 2 minutes 35 seconds:
[uquote="trofim2",url="/forum/viewtopic.php?p=3529431#p3529431"]типа так:

.macro rol_5
rol_mem
rol_mem
rol_mem
rol_mem
rol_mem
.endm


.......[/uquote]


Так в том и вопрос был, чтобы не жестко задать, а произвольно: сколько надо, столько и задано, а не именно пять. А пока примерно так и вышел из положения: прописал 8 процедур для размеров операндов от 1 до 8-ми байт.
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

Тогда типа такого:

.macro rol_
rol_mem
.if @0 >= 10
rol_mem
.endif
.if @0 >= 9
rol_mem
.endif
.if @0 >= 8
rol_mem
.endif
.if @0 >= 7
rol_mem
.endif
.if @0 >= 6
rol_mem
.endif
.if @0 >= 5
rol_mem
.endif
.if @0 >= 4
rol_mem
.endif
.if @0 >= 3
rol_mem
.endif
.if @0 >= 2
rol_mem
.endif

.endm

.cseg

......
rol_ 8

.......
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

А стоит оно того? Разворачивать подобного рода циклы... экономия порядка 16 тактов на сдвиге 8 байт.... ценой потребления памяти в 8 раз?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Alexeyslav писал(а):А стоит оно того?
а почему нет? случаи бывают разные, например, при формировании видеосигнала придется считать каждый такт...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
imerlin
Нашел транзистор. Понюхал.
Сообщения: 157
Зарегистрирован: Вт июл 16, 2013 11:18:59

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

Сообщение imerlin »

[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3529839#p3529839"]А стоит оно того? Разворачивать подобного рода циклы... экономия порядка 16 тактов на сдвиге 8 байт.... ценой потребления памяти в 8 раз?[/uquote]

Иногда да. Например, при небольшой длине операндов (2-3 байта) может баш на баш выйти по объему за счет удаления цикла. Ну и верно AVR заметил, что случаи разные бывают, а я предпочитаю, если уж однажды сделал, сделать так чтобы потом с полочки взять и с минимальными изменениями снова использовать. Ну лень мне снова вспоминать, например, как деление сделать. А скоро потребуется - давно хочу приборчик добить для регулировки зажигания и карбюратора: тахометр, УОЗ, УЗСК, стробоскоп... Там если точно мерить, то много тактов набегает за оборот на низких оборотах, сейчас не помню, но то ли на 4 то ли аж на 6 байт, и все это надо делить для вычисления частоты в об/мин. А умножения в любом ПИД регуляторе нужно.
Да и вообще, может я ошибаюсь конечно, но каждый проект индивидуален, где то по памяти лимит жестче, где то по скорости, лучше, если тяжелые базовые подпрограммы будут иметь возможность выбора: скорость за счет памяти или наоборот.
Да и вообще, я задал вопрос, находясь в заблуждении о том, что команды inc/dec изменяют флаг C, и циклы получались очень уж монструозными. Сейчас перепишу версию с циклами, посчитаю такты, может и решу что не надо так уж заморачиваться.

Добавлено after 6 minutes 44 seconds:
[uquote="trofim2",url="/forum/viewtopic.php?p=3529519#p3529519"]Тогда типа такого:

.macro rol_
rol_mem
.if @0 >= 10
rol_mem
.endif
.if @0 >= 9
rol_mem
.endif
----------<----------

.......[/uquote]

А через пару лет, когда уже основательно забудется как сделана эта программа, вдруг понадобится 11 байт. Не упустите, что программа может быть очень сложна, таких кусочков может быть не один десяток и с разными кратностями повторения. К тому же такой вариант слишком сложен для восприятия, не влезает целиком на экран для осмысления сути этого действия и вообще вместо облегчения работы приносит больше осложнений. Нет, судя по всему действительно, в классическом ASM для AVR эта задача не решается так как я хочу ее решить.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Формировать видеосигнал тяжелыми вычислениями? на АВР? Психушка плачет... Это несколько опрометчивые решения, там где надо каждый такт считать, нужно рассматривать другие решения - на ПЛИС например или DSP. Ведь больше времени потратите на отладку этих крох, а время дороже железа.
Такие алгоритмы вы с полочки не возьмёте, они слишком специфичны и аппаратно зависимы. Через год вы уже забудете про контроллер на котором делали эту оптимизацию, а на другом эти хаки уже не работают и т.п. взять современные ARM, там уже конвеер, разные частоты ядра и периферии и уже не столь очевидно сколько тактов уходит на конкретную конструкцию а иногда быстрее будет исполняться неказистая на вид конструкция.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Alexeyslav писал(а):взять современные ARM
возьмите уже их и покиньте тему про ассемблер AVR :kill: :twisted: :evil:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение BOB51 »

За те циклы/подсчеты...
Я такую задачу делал когда WS2812 от АВРки запускал.
Все прекрасно контролируется и исполняется.
Причем с завидной стабильностью для случая программной широтной манипуляции
(это помимо основного генератора случайных чисел и прочей обработки).
Так что не надо "контейнер гнать" на 8-битники под ассемблером раньше времени.
8)
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Так кто гонит? Контролируется, да. Но задача для WS2812 по силам контроллеру, там не надо выжимать такты ибо не успеваешь - там такты считать надо чтобы обеспечить требуемые временные параметры импульсов, это совсем другое.

возьмите уже их и покиньте тему

Возьму, конечно, когда это надо будет - т.е. когда задача перерастёт возможности AVR или будет совсем впритык - именно для того чтобы не собирать крохи чтобы обеспечить менее 10% выигрыша по скорости.
4epemyxa
Родился
Сообщения: 6
Зарегистрирован: Сб июн 01, 2013 18:51:03

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

Сообщение 4epemyxa »

прописал 8 процедур для размеров операндов от 1 до 8-ми байт.

Есть жесткие ограничения по скорости? Почему не сделать одну универсальную?
Спойлер

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

.include "m8def.inc"

.def    temp = r16
.def    counter = r17    ;счетчик сдвигаемых байтов памяти


;бла-бла-бла
;...
;=======
;где-то в теле программы:
;---- init roll counter
        ldi     temp,5             ;задание количества сдвигаемых байтов
   sts    rol_counter,temp
;---- make roll
      rcall      rol_mem
;=======
;бла-бла-бла
;...

Loop:
      rjmp  Loop

;============
; FUNCTIONS
;============
rol_mem:
      ldi      xl,low(rol_field)      ;загрузка начального адреса сдвигаемого поля
      ldi      xh,high(rol_field)
      lds      counter,rol_counter ;загрузка счетчика
      clc
rol_01:
      ld      temp,x
      rol      temp
      st      x+,temp
      dec      counter
      brne   rol_01
      ret
;============
; DATA SEGMENT
;============
.dseg
rol_counter:   .byte 1
rol_field:      .byte 8

;***** END *****
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

1) А правильно ли я забираю/читаю двухбайтное из EEPROM? (tiny2313)
2) Т. к. физически двубайтных здесь нет (и адрес однобайтен и данные в общем то туда-сюда), то записывать надо в этой же последовательности? (писать Low, увеличить адрес, писать High)
Спойлер.def adr=r18
ldi adr,0 ;или ldi adr,(metka_v_eeprom)
;----------
ee_read: ;cli запрет прерываний делается выше на всю операцию с кнопкой
sbic EECR,eepe ;если сброшен то EEPROM готов и далее
rjmp ee_read ;иначе ждать здесь
out EEAR,adr ;отправить адрес
sbi EECR,eere ;Start Read
in r16,EEDR ;забрать данные L (лежат слева направо LL>HH)

ee_read_h: sbic EECR,eepe
rjmp ee_read_h
inc adr ;увеличить адрес
out EEAR,adr ;отправить
sbi EECR,eere ;Start Read
in r17,EEDR ;забрать данные H

ret ;выход (прерывания разрешатся выше)
;----------
;EEPROM
.eseg .dw 0xFFFF ;(LLHH)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15545
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Для EEPROM обязательного формата для многобайтовых величин нет.
Единственное условие - следовать выбранному правилу - или старшие байты затем младшие или как у Вас младшие а затем старшие.
И такой же порядок при извлечении.
Low или High относятся только к непосредственно загружаемым величинам.
Это если допустим требуется выполнить чего-то подобного:
6071 загрузить в EEPROM
тогда

загружаем начальный адрес ячейки ЕЕПРОМ (допустим 0)
LDI r16,low(6071)
out EEDR,r16
выполнить запись младшего байта
инкремент счетчика адреса в EEADRH:EEADRL
ldi r16,high(6071)
out EEDR,R16
выполнить запись старшего байта
инкремент счетчика адреса в EEADRH:EEADRL

а извлечение делается допустим в регистровую пару Хh:Xl

загружаем начальный адрес ячейки EEPROM (допустим 0)
читаем данные (в EEDR)
in Xl, EEDR
инкремент счетчика адреса в EEADRH:EEADRL
читаем данные (в EEDR)
in Xh, EEDR

Касательно директив DW/DB относительно EEPROM (загрузка фиксированной строки программатором из файла)...
Должны вроде правильно байты раскладывать - первым младший, вторым старший.
Но ... склероз...
:dont_know:
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

[uquote="Серый_",url="/forum/viewtopic.php?p=3540326#p3540326"]...записывать надо в этой же последовательности? (писать Low, увеличить адрес, писать High)...[/uquote]Как загрузите так и считаете. Думаю, оформить чтение/запись подпрограммой логичнее. Для примера, загрузка R16...R19 в формате младший-старший, а R20...R23 в формате старший-младший

Спойлер

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

.INCLUDE "tn2313def.inc"

.ESEG
   .org   0x00
EE_BEGIN:
   .DW LWRD(2345678901),HWRD(2345678901)
   .DB BYTE4(2345678901),BYTE3(2345678901),BYTE2(2345678901),BYTE1(2345678901)
EE_END:

;*******************************
   .CSEG

   .ORG   $00
RESET:
   RJMP   START

   .ORG   $20
START:
   LDI   R16,$6F
   OUT   SPL,R16

   SER   R20
   OUT   DDRA,R20
   OUT   DDRB,R20
   OUT   DDRD,R20

   SBI   ACSR,ACD   ; выключить аналоговый компаратор
;*************************************************
   LDI   ZH,0
   LDI   ZL,EE_BEGIN
   LDI   YH,0
   LDI   YL,16
;----------
   sbic EECR,eepe ;если сброшен то EEPROM готов и далее
   rjmp PC-1    ;иначе ждать здесь
READ_EEPROM:
   RCALL   EEREAD
   ST   Y+,R0
   INC   ZL
   CPI   ZL,EE_END
   BRLO   READ_EEPROM
   OUT   EECR,ZH
   RJMP   PC
;ee_read: ;cli запрет прерываний делается выше на всю операцию с кнопкой
;sbic EECR,eepe ;если сброшен то EEPROM готов и далее
;rjmp ee_read ;иначе ждать здесь
;out EEAR,adr ;отправить адрес
;sbi EECR,eere ;Start Read
;in r16,EEDR ;забрать данные L (лежат слева направо LL>HH)

;ee_read_h: sbic EECR,eepe
;rjmp ee_read_h
;inc adr ;увеличить адрес
;out EEAR,adr ;отправить
;sbi EECR,eere ;Start Read
;in r17,EEDR ;забрать данные H

;ret ;выход (прерывания разрешатся выше)
;----------
EEREAD:
   OUT   EEAR,ZL
   SBI   EECR,EERE
   IN   R0,EEDR
   RET

.EXIT
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Ок, спс. Проворачивать что-то более сложное, с заценкой конечного адреса пока не понадобилось, но засейвил для примера. (akl, имхо метки PC-1 и PC не имеют "точек выхода"). Запустил свои варианты R/W вроде пока работают, вроде пока безглючно. И ещё вопрос о двухбайтном, в данном случае "по научному" нужно ставить "nop"?

sbiw x,1 ;минуснуть 1 из пары (выполнится за 2 такта)
nop ;(поэтому пустотакт перед отправкой куда-либо)
out ocr1AH,xH ;отправить
out ocr1AL,xL

Офф:
СпойлерИ сорян, ответившим = в карму плюсовать дают только 1 раз (и то через поиск пользователя), а поднятия рейтинга сообщения висят уже давно. :)
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

А nop то зачем?
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Не готовые/полу готовые данные "потекут по трубам"...?
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

Не разу не замечал.
Ответить

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