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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

akl писал(а):Да, не катит. Попробуйте в соответствии с DS Изображение
mega168_insrt_set.GIF

Это я уже смотрел.
Ну допустим что на STS не ругается.
почему же тогда проверка

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

          ldi r16,(1<<1)
   sts DDRB,r16

Не работает!?
Т.е. компилятор не ругается а реальный контроллер ножку к земле не прибивает.
Или в данном случае это не применимо?

Я просто разные варианты уже проработал, не хотят биты устанавливатся в регистры что-то.
Если у кого пример кода есть, поделитесь пожалуйсто :solder:
Реклама
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Что-то мне подсказывает, что команда STS работает с другим пространством адресов, надо уточнить адрес нужного регистра в общем пространстве адресов. А то получается ты куда-то не туда зписываешь, и соответственно результата ноль.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Ну вы блин даёте :)
В одном месте посмотрели и думаете, что всё? Неа! :)
Открываем m168def.inc и внимательно смотрим. А смотрим вот куда.

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

.equ   PRR   = 0x64   ; MEMORY MAPPED
.equ   CLKPR   = 0x61   ; MEMORY MAPPED
.equ   WDTCSR   = 0x60   ; MEMORY MAPPED
.equ   SREG   = 0x3f
.equ   SPL   = 0x3d
.equ   SPH   = 0x3e
Сопоставляем волшебное число 0x20 из приведённой ранее цитаты из спецификации с приведённой выдержкой и погружаемся в Дзен. :))
А чтобы погружение было таким как надо - используйте макросы. Например из заметок по применению AVR001. :)
Спойлер

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

;*****************************************************************
;*   file: macros.inc
;*
;*   Description:
;*   Source file for application note AVR001 - Conditional Assembly
;*   and Portability Macros.
;*
;*   Defines a number of macros that makes it easier to access
;*   IO registers and extended IO registers (or SRAM locations up
;*  to adress $FF if applicable).
;*   The macros can be used to produce code that assembles to
;*   any target AVR, without considering if the accessed IO
;*   registers are located in low, standard or extended IO space
;*
;* $Revision: 2.2 $   
;* $Author: jllassen $
;* $Date: Wednesday, January 26, 2005 10:55:18 UTC $
;*****************************************************************

;*********************************************************
;*   BIT access anywhere in IO or lower $FF of data space
;*   SETB - SET Bit in IO of data space
;*   CLRB - CLeaR Bit in IO of data space
;*********************************************************

.MACRO SETB       ;Arguments: Address, Bit, Register
   .if @1>7
      .message "Only values 0-7 allowed for Bit parameter"
   .endif
   .if @0>0x3F
      lds  @2, @0
      sbr  @2, (1<<@1)
      sts  @0, @2
   .elif @0>0x1F
      in   @2, @0
      sbr  @2, (1<<@1)
      out  @0, @2
   .else
      sbi  @0, @1
   .endif
.ENDMACRO

.MACRO CLRB       ;Arguments: Address, Bit, Register
   .if @1>7
      .message "Only values 0-7 allowed for Bit parameter"
   .endif
   .if @0>0x3F
      lds  @2, @0
      cbr  @2, (1<<@1)
      sts  @0, @2
   .elif @0>0x1F
      in   @2, @0
      cbr  @2, (1<<@1)
      out  @0, @2
   .else
      cbi  @0, @1
   .endif
.ENDMACRO

;*********************************************************
;*   Bit test anywhere in IO or in lower $FF of data space
;*  SKBS : SKip if Bit Set
;*  SKBC : SKip if Bit Cleared
;*********************************************************
.MACRO SKBS        ;Arguments: Address, Bit, Register
   .if @1>7
      .message "Only values 0-7 allowed for Bit parameter"
   .endif
   .if @0>0x3F
      lds  @2, @0
      sbrs @2, @1
   .elif @0>0x1F
      in   @2, @0
      sbrs @2, @1
   .else
      sbis @0, @1
   .endif
.ENDMACRO

.MACRO SKBC        ;Arguments: Address, Bit, Register
   .if @1>7
      .message "Only values 0-7 allowed for Bit parameter"
   .endif
   .if @0>0x3F
      lds    @2, @0
      sbrc @2, @1
   .elif @0>0x1F
      in    @2, @0
      sbrc @2, @1
   .else
      sbic @0, @1
   .endif
.ENDMACRO

;*********************************************************
;*   Byte access anywhere in IO or lower $FF of data space
;*    STORE - Store register in IO or data space
;*    LOAD  - Load register from IO or data space
;*********************************************************

.MACRO STORE       ;Arguments: Address, Register
   .if   @0>0x3F
      sts   @0, @1
   .else
      out   @0, @1
   .endif
.ENDMACRO

.MACRO LOAD       ;Arguments: Register, Address
   .if   @1>0x3F
      lds   @0, @1
   .else
      in   @0, @1
   .endif
.ENDMACRO
Для новичков настоятельно рекомендую вникнуть в макросы, так как некоторым требуется "врЕменный" регистр.

Удачи!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Погружение в Дзен обязательно будет - НО чуть позже! :)
Сейчас же в порядке первой срочности надо запустить таймер а асинхронном режиме.
Значит накарлякал я вот такое!
Спойлер

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

.include "m168def.inc"

.dseg
.cseg
   .ORG 0x000 ; Reset Handler
    rjmp Reset    
   .ORG 0x001 ; IRQ0 Handler
   RETI 
   .ORG 0x002 ; IRQ1 Handler
   RETI
   .ORG 0x003 ; PCINT0 Handler
   RETI
   .ORG 0x004 ; PCINT1 Handler
   RETI
   .ORG 0x005 ; PCINT2 Handler
   RETI
   .ORG 0x006 ; Watchdog Timer Handler
   RETI
   .ORG 0x007 ; Timer2 Compare A Handler
   RETI
   .ORG 0x008 ; Timer2 Compare B Handler
   RETI
   .ORG 0x009 ; Timer2 Overflow Handler
   rjmp Klac
   .ORG 0x00A ; Timer1 Capture Handler
   RETI
   .ORG 0x00B ; Timer1 Compare A Handler
   RETI
   .ORG 0x00C ; Timer1 Compare B Handler
   RETI
   .ORG 0x00D ; Timer1 Overflow Handler
   RETI
   .ORG 0x00E ; Timer0 Compare A Handler
   RETI
   .ORG 0x00F ; Timer0 Compare B Handler
   RETI
   .ORG 0x010 ; Timer0 Overflow Handler
   RETI
   .ORG 0x011 ; SPI Transfer Complete Handler
   RETI
   .ORG 0x012 ; USART, RX Complete Handler
   RETI
   .ORG 0x013 ; USART, UDR Empty Handler
   RETI
   .ORG 0x014 ; USART, TX Complete Handler
   RETI
   .ORG 0x015 ; ADC Conversion Complete Handler
   RETI
   .ORG 0x016 ; EEPROM Ready Handler
   RETI
   .ORG 0x017 ; Analog Comparator Handler
   RETI
   .ORG 0x018 ; 2-wire Serial Interface Handler
   RETI
   .ORG 0x019 ; Store Program Memory Ready Handler
   RETI
   .ORG   INT_VECTORS_SIZE   ; Конец таблицы прерываний
   
Reset:

   
   ldi r16,low(RamEnd)
   out SPL,r16

   ldi r16,high(RamEnd)
   out SPH,r16

   ldi r16,0b00001111
   out DDRB,r16

   ldi r16,0b11111111
   out DDRD,r16

   cli ; запрещаем прерывания

   ldi r16,(1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2); Запрещаем прерывания TC2, обнуляя OCIE2x и TOIE2
   sts TIMSK2,r16

   ldi r16,(1<<AS2); Переводим ТС2 в асинхронный режим
   sts ASSR,r16

   rcall Delay1

   clr r16
   sts TCNT2,r16; Обнуляем ТСNТ2
   
   ldi r16,(1<<CS22)|(1<<CS20); Устанавливаем предделитель = 128
   sts TCCR2B,r16

re:   
   lds r16,ASSR
   andi r16,0b00011111
   brne re ; ждем пока обнулятся биты : TCN2UB, OCR2AUB, OCR2BUB, TCR2AUB и TCR2BUB.
   
   clr r16
   ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
   sts TIFR2,r16

   ldi r16,(1<<TOIE2);Разрешаем прерывание по переполнению таймера 2
   sts TIMSK2,r16

   sei   


Indic:                ;Цикл индикации   

   mov R22,R23
   rcall Decoder
   out PortD,R17
   sbi PortB,3
   rcall Delay       
    cbi PortB,3
   
   
   mov R22,R24
   rcall Decoder
   cbr R17,0b10000000         
   out PortD,R17     
   sbi PortB,2
   rcall Delay
   cbi PortB,2

   mov R22,r25
   rcall Decoder       
   out PortD,R17     
   sbi PortB,1
   rcall Delay
   cbi PortB,1

   mov R22,r26
   rcall Decoder       
   out PortD,R17   
   sbi PortB,0
   rcall Delay
   cbi PortB,0
   
   rjmp Indic          

Klac:               ; Переходим сюда каждые 128 переподнений Второго таймера
rcall CycleINC
reti

CycleINC:            ;!!!ЦИКЛ УВЕЛИЧЕНИЯ!!!   
   inc r23
   cpi r23,7
   breq M
   ret
M:
   clr r23   
   inc r24
   cpi r24,7
   breq F
   ret
F:
   clr r24   
   inc r25
   cpi r25,3
   breq W
   ret
W:
   clr r25   
   inc r26
   cpi r26,2
   breq T
   ret
T:
   clr r26
   reti


Decoder:            

   ldi ZL,Low(DcMatrix*2)      ;инициализация массива
   ldi ZH,High(DcMatrix*2)
   ldi R18,0                ;прибавление переменной
   add ZL,R22                 ;к 0-му адресу массива
   adc ZH,R18

   lpm                        ;загрузка значения
    mov R17,r0 
   ret


DcMatrix:
;массив - таблица истинности декодера
        ; hgfedcba   hgfedcba
   .db 0b11000000,0b11111001   ;0,1
   .db 0b10100100,0b10110000   ;2,3
   .db 0b10011001,0b10010010   ;4,5
   .db 0b10000010,0b11111000   ;6,7
   .db 0b10000000,0b10010000   ;8,9


   Delay:
   ldi R20,10
   ldi R21,4
d1:       
   dec R20
   brne d1
   dec R21
   brne d1
   ret

Delay1:
   ldi R20,200
   ldi R21,200
d2:       
   dec R20
   brne d2
   dec R21
   brne d2
   ret
   
.eseg

Пока вопрос только один!
Как у меня в R23 попадает число 7 из TIFR2 :shock: ?
Ну и таймер соответственно никак не хочет запускаться :(
Хотя ножки TOSC1 и TOSC2 в Протеусе оживают после добавления инициализации.
На индикацию пока внимания не обращаем - но она сама по себе тикает, а вот с переполнением ТС2 никак (
В чем тут может быть дело? Сомневаюсь насчет инициализации таймера. Правильна ли она?
Вложения
Mega168timer.rar
(21.79 КБ) 135 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Coldheart писал(а):Как у меня в R23 попадает число 7 из TIFR2
В коде командами

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

   ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
   sts TIFR2,r16
идет обращение именно к R23, а не к TIFR2
Т.к. адрес TIFR2 находится в области доступа IN/OUT, нужно и обращаться к нему соответственно

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

;   clr r16
   ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
   OUT TIFR2,r16
;   sts TIFR2,r16

Таблица прерываний для m168 выглядит так
СпойлерИзображение

interrupt_m168.GIF

поэтому будут проблемы с переходом на обслуживание прерывания. :)
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Coldheart писал(а):Подскажите как установить, сбросить бит в регистры по адресу выше 0х70 ?
Контроллер Мега168
написать макрос и забыть.......

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

.macro  outi
   ldi   r16,@1
   .if(@0 > 0x3F)
   sts @0,r16
   .else
   out @0,r16
   .endif
.endm
пишем например outi DDRC,0x1F, а макрос сам разберется, что использовать out или sts
Реклама
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

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

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

Сообщение Alexeyslav »

Продолжает.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

gauss, представьте.
Едет машина. И тут мужик с "феном" ГИБДДшник с радаром и, опа, радар зафиксировал скорость - 150км/ч. Остановиться ли машина в момент фиксации радаром скорости? Нет. Событие произошло - радар зафиксировал скорость. А машина как ехала, так и едет. :)
Так и с таймером - событие достижения таймером опр. значения генерирует прерывание, а таймер (счётчик) продолжает работать сам по себе.
Вот тут, прямо в начале, есть пример для AVR-ок.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Ох чувствую пример из жизни :)))
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Вопрос по макросу.
Пишем какой-либо макрос.
В коде программы вызываем, его, допустим, 10 раз. Получается, при записи в МК компилятор тупо запишет фрагмент кода 10 раз, тем самым существенно увеличив память?
:idea:
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

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

Сообщение SmarTrunk »

Да, размер программного кода увеличится, но уменьшится время выполнения, т.к. обойдется без команд CALL (RCALL) и RETI, поэтому будет быстрее. Оба варианта могут быть хороши, в зависимости от ситуации. Можно же попробовать, и выяснить - влезает ли код во ФЛЕШ (можно и старший МК взять, с бОльшей памятью).
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Обычно макросы используют с параметрами. Причем в качестве параметра можно передавать часть имени метки, переменной и т.д. что не по силам для обычных процедур. Вообще макросы по большей части предназначены для сокращения однотипных текстов в исходнике а не как замена подпрограмм. Макросом можно так же заменить однотипные последовательности в программе, которые есть необходимость менять все сразу.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Alexeyslav писал(а):Причем в качестве параметра можно передавать часть имени метки, переменной и т.д. что не по силам для обычных процедур.
А можно об этом подробнее.....
Примерчиком например.....
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

shads, здесь уже это было, специально для Вас нашел. Там обсуждение разворачивается в несколько постов ниже. Я указал на первый.
Ставим плюсы: )
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Ещё вопрос, по времени выполнению кода:
Сколько (примерно) миллисекунд будет выполняться такой код,

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

eeimp:
ldi delay,eetime
ldi delay2,eetime
LoopEE:
dec delay
nop
brne LoopEE
dec delay2
brne LoopEE
ret

если константа eetime=255, и МК тактируется от 8МГц кварца?
У меня получилось примерно 24 миллисекунды :)
:idea:
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

gauss писал(а):Сколько (примерно) миллисекунд будет выполняться такой код...
... все программные задержки удобно делать с помощью макроса, а не гадать "сколько будет" задержка

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

.equ   XL_CLOCK = 8000000; частота кварца
.......
.macro   _delay_us   
.if ((@0*XL_CLOCK/1000000)/4)>0x10000
.error "Overflow r25:r24"
.else
   ldi      r24,low((@0*XL_CLOCK/1000000)/4)
   ldi      r25,high((@0*XL_CLOCK/1000000)/4)
   sbiw    r25:r24,1
   brne   PC-1
.endif
.endm
теперь в тексте программы достаточно написать

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

_delay_us 2000
, и задержка будет именно та , что задана (расчет сделает сам макрос)
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Разве в ассемблере есть условный оператор? Или это не асм?
:idea:
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

это директива препроцессора, она поддерживается и в ассемблере.
посмотрите мое предыдущее сообщение в этой теме, в нем ссылка на материал по макросам.
Ставим плюсы: )
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Такая строка кода:

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

ldi r16,@0-(@0/255)*255

После деления на 255 умножаться будет дробь, или целое число, если @0 не кратно 255?
:idea:
Ответить

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