mikrokontrolery.net

 

   

Przykład 3 - przerzutnik T
Naciśnięcie przycisku S1 zmienia stan kropki wyświetlacza na przeciwny. Algorytm jest przedstawiony na poniższym rysunku :

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

; Kurs asemblera mikrokontrolerów AVR
;
; Przykład 3 - Przerzutnik T

.include "2313def.inc"
.cseg
.def acc = r16 ; nadanie rejestrom r16 i r17 nazw symbolicznych
.def maska = r17
.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 wskaznika stosu na 127

cbi PORTD, 7

start:
sbis PIND, 0 ; Jeśli S1 nie jest wciśnięty to
; pomiń następną instrukcję
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

 

Instrukcja EOR (Exclusive OR) - suma modulo 2 zawartości dwóch rejestrów. Wykonanie operacji EOR na rejestrze z drugim argumentem o wartości logicznej jedynki powoduje zanegowanie bitów w rejestrze.

Składnia rozkazu Operandy Licznik rozkazów:
(i) EOR Rd,Rr 0 <= d <=31, 0 <= r <= 31 PC <- PC + 1

Kod operacji :

0010 01rd dddd rrrr

Nieco komentarza wymaga procedura cpl. Ponieważ na liście instrukcji mikrokontrolerów AVR nie ma instrukcji służącej bezpośrednio do zanegowania bitu w przestrzeni I/O, tak, jak ma to miejsce w 8051 konieczne jest zrealizowanie tego zadania okrężną drogą. Sposób, w jaki to zrealizowałem nie jest, być może najprostszy, ale spełnia swoje zadanie. Aby zmienić stan lini portu wyjściowego, należy wczytać ten stan do rejestru, np. r16. Jednak nie odczytujemy rejestru PINB, jak mogłoby się wydawać, ale rejestr PORTB, gdyż właśnie ten rejestr ma wpływ na stan linii portu jako wyjścia. Następnie ładujemy do r17 maskę, na podstawie której zanegujemy odpowiedni bit. Ponieważ chcemy zanegować stan kropki wyświetlacza, która jest połączona z pinem 7 portu B, ładujemy wartość 128 (dziesiętnie). Po wykonaniu instrukcji EOR ładujemy z powrotem do PORTB zawartość rejestru r16. Jak widać, to co w 8051 możemy zrealizować za pomocą jednej instrukcji, w AVR musimy użyć trzech instrukcji.

 

 

 

 

 

 

 

 

 

 

 
 
 
 

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