еще вот что интересно: под регистр флагов отдал r17, а можно ли использовать один из младших регистров? r2 например?
;****************************************
;@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
;***************************************
Ассемблер (ASM) для AVR в вопросах и ответах
- Сообщения: 162
- Зарегистрирован: Вс дек 09, 2012 12:14:44
Спасибо за помощь мужики! С вашей помощью, получилось вот это:
- Реклама
Можно, именно поэтому в макросах используют флаг T, который работает с нижними регистрами. А вышеупомянутые SBR/CBR работают только с верхними регистрами, так как идёт работа с константами (эти команды, по сути, маркетинговый ход разработчиков). Кстати, они принимают на вход маску, а не номер бита.
Что и указано в даташите:

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

- Сообщения: 162
- Зарегистрирован: Вс дек 09, 2012 12:14:44
Ага, уяснил)
А может кому из опытных электронщиков не жалко будет поделится своим набором макросов?
Если с комментариями естественно.
И для расширения кругозора так скажем, и может что интересное подчерпну.
А может кому из опытных электронщиков не жалко будет поделится своим набором макросов?
И для расширения кругозора так скажем, и может что интересное подчерпну.
Я их обычно пишу для каждого конкретного проекта свои. Типа таких:
Спойлер
Код: Выделить всё
;-------------------------------------------------------------------------------
.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
Однострочные макросы без параметров лучше делать через #define так как-то компактней и аккуратней.
- Реклама
ассемблеры её поддерживать не должны, это происходит на уровне препроцессора. Не представляю жизни без директивы #define или аналогичной.
- Сообщения: 162
- Зарегистрирован: Вс дек 09, 2012 12:14:44
Что за define?
Я пользуюсь ассемблером 1 в AVRstudio 4
Я пользуюсь ассемблером 1 в AVRstudio 4
Сёвого препроцессора. Препроцессоры ассемблеров поддерживают другие директивы, например .DEFассемблеры её поддерживать не должны, это происходит на уровне препроцессора.
Всем зрдавствовать! Решил поиграться с mega8, пытаюсь натравить прерывания на кнопку, то есть на сигнал с одной из ножек, но вот ведь не задача, не могу это сделать... Пытался делать так:
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
Ткните мордой, где косяк?
Спойлер
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
Главное, чтоб был источник ЭДС, а с остальным разберемся
.
Вроде INT0 висит на PORTD, разве не так? прерывания внешние на PD2 и PD3.
Это весь текст? а где обработчик прерывания, и как оно должно перейти на обработчик? Таблица векторов пустая или как? Так то походу программа просто стартует каждый раз при прерывании, если оно вообще случится.ranger93 писал(а):Ткните мордой, где косяк?
zero648, нет, что вы
, таблица векторов перепрыгнута и там на int0 весит соответствующий прыжок на обработчик, до которого дело не доходило. И это не весь код, остальное не имело отношение к делу. Alexeyslav, а вы правы
, спасибо, подергал d3 ногой, прерывание сработало. Я что находил инфу, там говорилось, что на любую ногу можно вешать прерывание, видимо не к mega8 относилось. Пойду полистаю ДШ на предмет прерываний внешних.
Главное, чтоб был источник ЭДС, а с остальным разберемся
.
Наверное имелось ввиду прерывание PCINT. Если интересно - читайте про него в даташите.Я что находил инфу, там говорилось, что на любую ногу можно вешать прерывание
ploop, что-то не нашел я такого прерывания в ДШ, может не там смотрю? Качал самый первый ДШ, что выдал гугл по запросу mega8.
Главное, чтоб был источник ЭДС, а с остальным разберемся
.
И то верно, в восьмой нет 
Что же вы все таким старьём-то пользуетесь? Есть ведь более новые серии 48-88-168, там всё есть. И стоит дешевле, и потребляет меньше, и по коду совместима с более старыми...
Что же вы все таким старьём-то пользуетесь? Есть ведь более новые серии 48-88-168, там всё есть. И стоит дешевле, и потребляет меньше, и по коду совместима с более старыми...
Компактней писать так:ranger93 писал(а):nothing:
nop
rjmp nothing
Код: Выделить всё
rjmp PC[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ну да, АТмега88а стоит не сильно дороже, чем АТмега8а, а есть плюсы - режимы отладки, на один режим сна больше (шесть), шире диапазон питающих напряжений (1,8...5,5В), этот самый PCINT, легкость перехода на младшую (48а) или старшую (168а) модели.
ploop, пользуюсь тем, что было под рукой
. Да и не сказал бы, что ATmega88 стоит дешевле ATmega8, дороже раза в 2. Да и мне пока хватает этих функций, а как захочется что-то новенькое испытать, так попробую 88
.
Gudd-Head, согласен, можно так сэкономить 2 байта, но учитывая весь остальной код, мне это не требуется да и не стремлюсь я, ибо не задавал бы тогда временные интервалы при помощи:
ldi r17, 5
entrance2:
subi r16, 1
sbci r17, 0
brcc entrance2
rjmp main
.
А такое обозначение: 0x001 - Это порядковый номер команды, не адрес в памяти?
Gudd-Head, согласен, можно так сэкономить 2 байта, но учитывая весь остальной код, мне это не требуется да и не стремлюсь я, ибо не задавал бы тогда временные интервалы при помощи:
Спойлер
ldi r16, 60ldi r17, 5
entrance2:
subi r16, 1
sbci r17, 0
brcc entrance2
rjmp main
А такое обозначение: 0x001 - Это порядковый номер команды, не адрес в памяти?
Главное, чтоб был источник ЭДС, а с остальным разберемся
.


