mikrokontrolery.net

 

   

Przykład 4 - Generator impulsów
Kropka wyświetlacza jest na przemian zapalana i gaszona. Algorytm działania programu przedstawiony jest na poniższym rysunku :

Kod Ľródłowy przedstawiony jest poniżej :

; 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

Powyższy program jest zmodyfikowaną wersją progrmu poprzedniego. Modyfikacja sprowadza się do usunięcia instrukcji "sbis PIND, 0" powodującej pominięcie instrukcji "rcall cpl". Dzięki temu procedura "cpl" jest wykonywana w pętli nieskończonej niezależnie od stanu przycisku, co objawia się miganiem kropki wyświetlacza.

 

 

 

 

 

 

 

 

 

 

 
 
 
 

(c) 2004-2008 Radosław Kwiecień
Polityka prywatności