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

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

Сообщение 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 например?
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

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

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

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

Ага, уяснил)

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

Сообщение 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
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

Сообщение ploop »

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

Сообщение Alexeyslav »

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

Сообщение ploop »

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

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

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

Сообщение ploop »

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

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

Сообщение Alexeyslav »

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

Сообщение zero648 »

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

Сообщение ranger93 »

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

Сообщение ploop »

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

Сообщение ranger93 »

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

Сообщение ploop »

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

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

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

Сообщение SmarTrunk »

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

Сообщение 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»