Laboratorium Układów Mikroprocesorowych |
---|
Rok akademicki |
2008/2009 |
Sprawozdanie z ćwiczenia numer 20
Data wykonania ćwiczenia: 2008-11-12
Temat ćwiczenia:
Mikrokontrolery AVR cz. I
Skład Podsekcji III |
---|
Wojciech Szymoszek Robert Uszok Ireneusz Zydroń |
1. TEMAT ĆWICZENIA
Do portu B podłączone jest 8 diod LED zwartych do masy. Do portu C podłączonych jest 8 przycisków zwartych do masy. W pamięci programu jest tablica romtab o nieznanej długości zakończona bitem 00. W pamięci znajduje się również tablica ramtab (0-1024 bajty). Napisać program pokazujący stan naciśnięcia przycisków przy założeniu, że stan pokazuje się natychmiast i trwa 2 sekundy.
2. ROZWIĄZANIE PROBLEMU - KOD PROGRAMU
.include "m2561def.inc"
.eseg
.dseg
.org 0x200 ;adres tablicy ramtab
ramtab: .byte 1024
.cseg
.org 0 ; start od adresu 0
romtab: .db $02, $08, $03, $04, $07, $00 ;zawartość tablicy ramtab kończącej
; się bitem 00
rjmp START ; skok do etykiety START
START:
.def rej = r16 ; rejestr przechowujący stan wciśniętych
; przycisków
.def acc = r17 ; rejestr zawierający liczbę wykonań
; pętli opóźniającej gaszenie diod
.def temp1 = r18 ; rejestr pomocniczy przechowujący stan
; wciśniętych przycisków
.def temp2 = r19 ; rejestr pomocniczy przechowujący stan
; wciśniętych przycisków
.def licz1 = r20 ; rejestr zawierający liczbę wykonań
; jednej z pętli opóźniających gaszenie diod
.def licz2 = r21 ; rejestr zawierający liczbę wykonań
; jednej z pętli opóźniających gaszenie diod
.def licz3 = r22 ; rejestr zawierający liczbę wykonań jednej z
; pętli opóźniających gaszenie diod
.equ KeyPort = PORTC ; portC jako KeyPort
.equ KeyPins = KeyPort-2 ; piny portuC jako KeyPins
ldi acc, 166 ; liczba wykonań pętli opóźniającej gaszenie
; diod (ok 250ms)
ser rej ; ustawienie wszystkich bitów rejestru
out DDRB,rej ; przepisanie zawartości ze zmiennej rej
; wskazującej na r16 do rejestru z przestrzeni
; adresowej I/O portuB
petelka:
in rej,KeyPins ; przepisanie zawartości rejestru z przestrzeni
; adresowej I/O portu C do rejestru rej(r16)
in temp1, KeyPins ; j.w do rejestru temp1 (r18)
out PORTB,rej ; przepisanie zawartości rejestru rej (r16) do
; rejestru z przestrzeni adresowej I/O portu B
rcall wait ; wywołanie podprogramu wait (opóźnia wygaszenie
rcall wait ; diod LED o ok 250ms)
rcall wait
rcall wait
rcall wait
rcall wait
rcall wait
rcall wait
cbi KeyPins,0
cbi KeyPins,1
cbi KeyPins,2
cbi KeyPins,3 ; zerowanie kolejnych bitów (0-7) w rejestrze
cbi KeyPins,4 ; we/wy portu C
cbi KeyPins,5
cbi KeyPins,6
cbi KeyPins,7
rjmp petelka ; skok na początek pętli
wait: ; podprogram wait opóźnia wygaszenie diod LED
mov licz3, acc ; ustawienie czasu opóźnienia
; powtórz n razy pętlę L,
; co da opóźnienie ok. n * 1,5 ms
L:
ldi licz2, 10 ; powtórz 10 razy pętlę L0,
; co da opóźnienie ok 1,5ms
L0:
ldi licz1, 100 ; powtórz 100 razy pętlę L1,
; co da opóźnienie ok. 150 us
L1:
in temp2, KeyPins ; przepisanie zawartości rejestru z przestrzeni
; adresowej I/O portu C do rejestru temp2(r19)
sub temp2,temp1 ; sprawdzenie czy zmienił sie stan przycisków
; (odjęcie zawartości rejestru temp2(r19) od
; rejestru temp1(r18)
brne petelka ; skok do pętelka jeśli !=0
dec licz1 ; dekrementacja licz1
brne l1 ; skok do L1 jeśli !=0
; koniec pętli L1
dec licz2 ; dekrementacja licz2
brne l0 ; skok do pętli L0
; koniec pętli L0 jeśli !=0
dec licz3 ; dekrementacja licz3
brne L ; skok do pętli L jeśli !=0
; koniec pętli L
ret ; powrót z podprogramu
3. WNIOSKI
Dzięki napisanemu programowi, zapoznaliśmy sie ze środowiskiem programistycznym AVR-Studio v4, mogliśmy także wykorzystać nasze teoretyczne umiejętności w pisaniu programów pod AVR w praktyce. Program działa według nas prawidłowo, choć napisanie go przysporzyło nam wielu problemów, z którymi jednak szybko sobie poradziliśmy.