Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс янв 25, 2015 07:34:11
akl, спасибо 
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
LDI R16,1
ADD ZL,R16akl писал(а): Командой ADIW ZH:ZL,1 просто добавится 1, т.е. значение пары станет 0x0100.
Код: Выделить всё
adiw ZH:ZL,0b10000000;ADIW Rd+1:Rd,K d ∈ {24,26,28,30}, 0 ≤ K ≤ 63 PC ← PC + 1
akl писал(а): Операнд 2 не может превышать 63.
Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Поправка , не вычтет а прибавит ибо (минус на минус дает плюс)zero648 писал(а):Поправка, на флаг С не влияют команды INC и DEC, арифметика влияет, а SUBI ZL,-1 просто вычтет 255 из ZL и конечно же получится 0 и поэтому никакого переполнения не произойдет.akl писал(а):Командами SUBI ZL,-1 INC ZL просто обнулится с установкой флага Z.
Код: Выделить всё
DB_LINE: ; Выводим тетраду в линии дисплея
rcall OUT_PORT ; Делает пины, которые используются на ВЫХОД и обнуляет их...
sbrc R18, 4 ; Пропустить слудующую, еслли бит сброшен
sbi DB4port, DB4pin ; Ставим бит
sbrc R18, 5 ; Пропустить слудующую, еслли бит сброшен
sbi DB5port, DB5pin ; Ставим бит
sbrc R18, 6 ; Пропустить слудующую, еслли бит сброшен
sbi DB6port, DB6pin ; Ставим бит
sbrc R18, 7 ; Пропустить слудующую, еслли бит сброшен
sbi DB7port, DB7pin ; Ставим бит
retПочитай у Ди-Хальта сталью про виртуальные порты. Под твою задачу - само то.Petr_Vas писал(а):Необходимо выводить по команде 4 бита только на
1-е устройство, не затрагивая остальные 4 бита, как реализовать?
Код: Выделить всё
$000 nach (переход при сбросе\включении питания)
$001 knopka (при наличии 0 на входе INT0)
$003 timer (переполнение таймера\счетчика)
nach:
sei
разрешение прерыв. от Int0
rjmp start
Knopka:
запрет прерыв. от Int0
sei
разрешение прерыв. от переполнения
разрешение idle mode
rjmp bla
Timer:
sei
inc REG
_проверка REG на совпадение с некоторым числом(для формирования задержки)
если REG<числа, то rjmp bla
иначе
запрет прерыв. по переполнению
разрешение прерыв. от Int0
sei
rjmp start
Start:
разрешение Power-down
sleep
rjmp start
Bla:
sleep (был разрешен Idle mode)
rjmp blaКод: Выделить всё
.device ATtiny13
.nolist
.include "C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc"
.list
.def temp=r16;
.def srl=r17;
.def srh=r18;
.cseg
.org $000
rjmp nach ; (reset)
.org $001
rjmp Knopka ;
.org $002
reti
.org $003
rjmp timer ; Timer\counter overflow
Nach:
ldi temp, low(ramend);
out spl,temp
ldi temp,0x80 ; выкл. комп.
out ACSR,temp ;
ldi temp,0b11111111 ;
out DDRB,temp ;
ldi temp,0b00000011 ;
out PortB, temp ;
sei ;
ldi temp,0b01000000 ;раз. прер. от Int0
out GIMSK, temp ;
rjmp start
; =========
Knopka:
ldi temp,0b00000000 ; запрещ прер INT0
out GIMSK, temp ;
ldi temp,0b00000010 ;вкл LED
out PortB, temp ;
ldi temp,0b00100000 ; разр. sleep, idle
out MCUCR, temp ;
sei ;
ldi zh,$00 ; вводим числа, с которыми будет сравниваться т.н. REG
ldi zl,$02 ;
ldi temp,0b00000010 ;
out TIMSK0, temp ;разр прер по переполнению
ldi temp,0b00000001 ;
out TCCR0B,temp ; clk/1024
ldi srL, $00
ldi srH, $00
rjmp bla
Timer: ;проверка
inc srL
brvc PC+3 ;
inc srh
clr srl
sei ;
cp srh, zh ;
brlo bla ;
cp srl,zl ;
brlo bla ;
;проверку прошел
ldi temp,0b00000011 ; выкл LED
out PortB, temp ;
ldi temp,0b00000000 ;
out TIMSK0, temp ; запр прер по переполнениню
ldi temp,0b01000000 ; разр прерыв INT0
out GIMSK, temp ;
rjmp start;
; =========
Start:
ldi temp,0b00110000 ; sleep, Power-down, проснется от 0 на Int0
out MCUCR, temp ;
sleep
nop;
rjmp start
Bla:
sleep;
rjmp bla
.exit
В обработчике Timer его нет, да. Если поставить reti, то после окончания задержки возвращается на bla...поэтому поставил rjmp start, а перед ним sei. Просто здесь sei еще не дописалChipKiller писал(а):.. а где в обработчиках reti?