|
; Kurs asemblera mikrokontrolerów
AVR
;
; Przykład 4 - Generator impulsów
.include "2313def.inc"
.def acc= r16
.def maska = r17
.cseg
.org 0x00
ldi acc, 0b11111111 ; załaduj
do r16 liczbę 255 (0xff)
out DDRB, acc ; wpisanie do DDRB samych jedynek
; powoduje ustawienie pinów jako wyjście
out PORTB, acc
ldi acc, 0b1111100 ;
out DDRD, acc ; piny D0 i D1 są ustawione jako wejścia
; pozostałe jako wyjścia
ldi acc, 0b1110111
out PORTD, acc
ldi acc, 127 ;
out SPL, acc ; ustawienie wskaˇnika stosu na 127
cbi PORTD, 7
start:
rcall cpl ; wywołanie procedury cpl
rjmp start ; pętla nieskończona
cpl:
in acc, PORTB ; załaduj do r16 stan przerzutników
; portu B
ldi maska, 0b10000000 ; załaduj do r17 maskę negacji
eor acc, maska ; zmień na przeciwne bity w r16 w/g maski
out PORTB, acc ; zapisz zmodyfikowaną wartość do PORTB
ldi acc, 200 ; czekaj ok. 200ms
rcall waitms ;
ret
; Przybliżone czasy opóznień
są podane dla
; rezonatora 4MHz
.def licz1 = r20
.def licz2 = r21
.def licz3 = r22
waitms:
mov licz3, acc ; ustaw czas opóznienia
; powtórz n razy pętlę L,
; co da opóznienie ok. n * 1 ms
L:
; powtórz 10 razy pętlę L0,
; co da opóznienie ok 1ms
ldi licz2, 10
L0:
; powtórz 100 razy pętlę L1,
; co da opóznienie ok. 100 us
ldi licz1, 100
L1:
nop ; 1 cykl
dec licz1 ; 1 cykl
brne l1 ; 2 cykle
; koniec pętli L1
dec licz2
brne l0
; koniec pętli L0
dec licz3
brne L
; koniec pętli L
ret
|