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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
1essor1
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Вс дек 09, 2012 12:14:44

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

Сообщение 1essor1 »

Спасибо за помощь мужики! С вашей помощью, получилось вот это:


;****************************************
;@0 - имя флага
.MACRO sef ; установка флага (SEt Flag)
SET
BLD flag_reg,@0
.ENDM
;****************************************

;****************************************
;@0 - имя флага
.MACRO clf ; сброс флага (CLear Flag)
CLT
BLD flag_reg,@0
.ENDM
;****************************************

;****************************************
;@0 - имя флага, @1 - куда идти
.MACRO BRFS ; переход если установлен (BRench if Flag Set)
BST flag_reg,@0
BRTS @1
.ENDM
;***************************************

;***************************************
;@0 - имя флага, @1 - куда идти
.MACRO BRFC ; переход если сброшен (BRench if Flag Clear)
BST flag_reg,@0
BRTC @1
.ENDM
;***************************************
;***************************************
;@0 - имя флага
.MACRO SKFS ; пропуск следующей команды если флаг установлен (SKip if Flag Set)
SBRS flag_reg,@0
.ENDM
;***************************************
;***************************************
;@0 - имя флага
.MACRO SKFC ; пропуск следующей команды если флаг установлен (SKip if Flag Clear)
SBRC flag_reg,@0
.ENDM
;***************************************



еще вот что интересно: под регистр флагов отдал r17, а можно ли использовать один из младших регистров? r2 например?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Можно, именно поэтому в макросах используют флаг T, который работает с нижними регистрами. А вышеупомянутые SBR/CBR работают только с верхними регистрами, так как идёт работа с константами (эти команды, по сути, маркетинговый ход разработчиков). Кстати, они принимают на вход маску, а не номер бита.

Что и указано в даташите:

Изображение
Аватара пользователя
1essor1
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Вс дек 09, 2012 12:14:44

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

Сообщение 1essor1 »

Ага, уяснил)

А может кому из опытных электронщиков не жалко будет поделится своим набором макросов? :)) Если с комментариями естественно.
И для расширения кругозора так скажем, и может что интересное подчерпну.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Я их обычно пишу для каждого конкретного проекта свои. Типа таких:
Спойлер

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

;----------

.MACRO pushf                    ; Макрос сохранения регистра статуса в стек
  push r16
  in r16,SREG
  push r16
.ENDM

;----------

.MACRO popf                     ; Макрос извлечения регистра статуса из стека
  pop r16
  out SREG,r16
  pop r16
.ENDM
;----------
.MACRO push_sh_cp               ; Подаёт импульс на вход сдвига регистров
  sbi sh_cp_port,sh_cp_bit
  nop
  cbi sh_cp_port,sh_cp_bit
.ENDM
;----------
.MACRO push_st_cp               ; Подаёт импульс на вход защёлки регистров
  sbi st_cp_port,st_cp_bit
  nop
  cbi st_cp_port,st_cp_bit
.ENDM
;----------
.MACRO ldiX                     ; Присваивание константы
  ldi XH,high(@0)               ; адресному регистру X
  ldi XL,low(@0)
.ENDM
;----------
.MACRO ldiY                     ; Присваивание константы
  ldi YH,high(@0)               ; адресному регистру Y
  ldi YL,low(@0)
.ENDM
;----------
.MACRO ldiZ                     ; Присваивание константы
  ldi ZH,high(@0)               ; адресному регистру Z
  ldi ZL,low(@0)
.ENDM
;----------
.MACRO ldi2Z                    ; Макрос сложения 16-битного числа c 8-битным
  ldi ZH,High(@0*2)             ; в регистровой паре Z
  ldi ZL,Low(@0*2)              ; для чтения flash
.ENDM                           
;----------
.MACRO add16X                   ; Макрос сложения регистровой пары X
  add XL,@0                     ; и обычного РОН
  adc XH,null 
.ENDM
;----------
.MACRO sub16X                   ; Макрос вычитания из регистровой пары X
  sub XL,@0                     ; и обычного РОН
  sbc XH,null 
.ENDM
;----------
.MACRO cp16X                    ; Макрос сравнения регистровой пары X
  cp XL,@0                      ; и обычного РОН
  cpc XH,null
.ENDM
;----------
.MACRO add16Y                   ; Макрос сложения регистровой пары Y
  add YL,@0                     ; и обычного РОН
  adc YH,null 
.ENDM
;----------
.MACRO add16Z                   ; Макрос сложения регистровой пары Z
  add ZL,@0                     ; и обычного РОН
  adc ZH,null 
.ENDM
;----------
.MACRO led_on                   ; Операции со светодиодом                 
  sbi PORTD,7
.ENDM
.MACRO led_off                 
  cbi PORTD,7
.ENDM
.MACRO led_inv                 
  sbi PIND,7
.ENDM
;----------
.MACRO wire1                    ; Отпустить линию
  cbi  wireport, wirebit        ; 0->DDR = Z-состояние
.ENDM
.MACRO wire0                    ; Притянуть линию
  sbi  wireport, wirebit        ; 1->DDR = 0 на выходе
.ENDM
;----------
.MACRO  Send_1w                 ; вспомогательный макрос
  ldi r16, @0                   ; вывода в шину 1-Wire константы
  mov r0, r16
  rcall Send1w
.ENDM
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Однострочные макросы без параметров лучше делать через #define так как-то компактней и аккуратней.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

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

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

Сообщение Alexeyslav »

ассемблеры её поддерживать не должны, это происходит на уровне препроцессора. Не представляю жизни без директивы #define или аналогичной.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Я пользуюсь голым gavrasm.
Аватара пользователя
1essor1
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Вс дек 09, 2012 12:14:44

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

Сообщение 1essor1 »

Что за define?
Я пользуюсь ассемблером 1 в AVRstudio 4
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

ассемблеры её поддерживать не должны, это происходит на уровне препроцессора.

Сёвого препроцессора. Препроцессоры ассемблеров поддерживают другие директивы, например .DEF
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

Всем зрдавствовать! Решил поиграться с mega8, пытаюсь натравить прерывания на кнопку, то есть на сигнал с одной из ножек, но вот ведь не задача, не могу это сделать... Пытался делать так:
Спойлерstart:
LDI R16,Low(RAMEND)
OUT SPL,R16 ; Инициализация стека
LDI R16,High(RAMEND) ; Обязательно!!!
OUT SPH,R16

sbi DDRC, 4 ; порт c4 на выход
sbi PORTC, 3 ;порт c3 подтягивает к 1
sbi PORTC, 2 ; порт c2 подтягиваем к 1
ldi r16, 0b00000010
out MCUCR, r16 ; хотим работать со спадающим фронтом с прерыванием int0
ldi r16, 0b01000000
out GICR, r16 ; разрешаем прерывание int0
sei ;разрешаем все прерывания
nothing:
nop
rjmp nothing

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

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

Сообщение Alexeyslav »

Вроде INT0 висит на PORTD, разве не так? прерывания внешние на PD2 и PD3.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

ranger93 писал(а):Ткните мордой, где косяк?

Это весь текст? а где обработчик прерывания, и как оно должно перейти на обработчик? Таблица векторов пустая или как? Так то походу программа просто стартует каждый раз при прерывании, если оно вообще случится.
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

zero648, нет, что вы :) , таблица векторов перепрыгнута и там на int0 весит соответствующий прыжок на обработчик, до которого дело не доходило. И это не весь код, остальное не имело отношение к делу. Alexeyslav, а вы правы :) , спасибо, подергал d3 ногой, прерывание сработало. Я что находил инфу, там говорилось, что на любую ногу можно вешать прерывание, видимо не к mega8 относилось. Пойду полистаю ДШ на предмет прерываний внешних.
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Я что находил инфу, там говорилось, что на любую ногу можно вешать прерывание

Наверное имелось ввиду прерывание PCINT. Если интересно - читайте про него в даташите.
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

ploop, что-то не нашел я такого прерывания в ДШ, может не там смотрю? Качал самый первый ДШ, что выдал гугл по запросу mega8.
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

И то верно, в восьмой нет :)
Что же вы все таким старьём-то пользуетесь? Есть ведь более новые серии 48-88-168, там всё есть. И стоит дешевле, и потребляет меньше, и по коду совместима с более старыми...
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

ranger93 писал(а):nothing:
nop
rjmp nothing

Компактней писать так:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

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

Сообщение SmarTrunk »

Ну да, АТмега88а стоит не сильно дороже, чем АТмега8а, а есть плюсы - режимы отладки, на один режим сна больше (шесть), шире диапазон питающих напряжений (1,8...5,5В), этот самый PCINT, легкость перехода на младшую (48а) или старшую (168а) модели.
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

ploop, пользуюсь тем, что было под рукой :) . Да и не сказал бы, что ATmega88 стоит дешевле ATmega8, дороже раза в 2. Да и мне пока хватает этих функций, а как захочется что-то новенькое испытать, так попробую 88 :) .
Gudd-Head, согласен, можно так сэкономить 2 байта, но учитывая весь остальной код, мне это не требуется да и не стремлюсь я, ибо не задавал бы тогда временные интервалы при помощи:
Спойлерldi r16, 60
ldi r17, 5
entrance2:
subi r16, 1
sbci r17, 0
brcc entrance2
rjmp main
:))) :))) :))) .

А такое обозначение: 0x001 - Это порядковый номер команды, не адрес в памяти?
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Ответить

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