Sprawozdanie z
ć
wiczenia numer 20
Data wykonania
ć
wiczenia: 16.10.2006
Temat
ć
wiczenia:
Mikrokontrolery z serii AVR cz. 1
Laboratorium Mikroinformatyki
Rok akademicki
Termin
Rodzaj studiów
Kierunek
Prowadz
ą
cy
Grupa
Sekcja
Poniedziałek
2006/2007
14:45-17:00
Dzienne
INF
JP
4
2
Skład sekcji:
Kamil Lebek
Michał Liszka
Dawid Pulnar
Marcin Strzelczyk
1. Zadanie
Dana jest tablica tabl1 umieszczona w pamięci programu zakończona wartością 0. Do portu
A podłączono 8 diod tak, że wartość 0 na wyjściu linii portu gasi diodę. Napisać program,
który co 1 sekundę wyświetla wartości kolejnych bajtów tablicy na porcie A.
Wykorzystać mikrokontroler ATmega128 o zegarze 1MHz.
.include "m128def.inc"
.eseg
.dseg
.cseg
.ORG 0x0
rjmp start
.ORG OVF1addr ; Overflow1 Interrupt Vector Address
rjmp timer1
start: ;
pocz
ą
tek programu
; ustawienie rejestrów pomocniczych
.def TMP=r16;
.def CNT=r17;
.def MAX=r18;
.def DISP=r19;
; ustawienie stosu
ldi r17, high(RAMEND)
ldi r16, low(RAMEND)
out sph, r17
out spl, r16
; inicjalizacja licznika przerwa
ń
clr CNT
clr DISP
ldi MAX, 20
; ustawienie rejestru Z
ldi ZL, low(tabl<<1)
ldi ZH, high(tabl<<1)
; ustawienie portu A jako wyj
ś
cie i zgaszenie wszystkich diod
ser TMP
out DDRA, TMP
clr TMP
out PORTA, TMP
; ustawienie timera
ldi TMP, high(15536)
out TCNT1H, TMP
ldi TMP, low(15536)
out TCNT1L, TMP
; odmaskowanie przerwania przepełnienia
ldi TMP, (1<<TOIE1)
out TIMSK, TMP
; ustawienie
ź
ródła zliczania na wewn
ę
trzny zegar
; (bez prescalera)
ldi TMP, (0<<CS12)|(0<<CS11)|(1<<CS10)
out TCCR1B, TMP
sei ; odblokowanie układu przerwa
ń
; główna p
ę
tla
czekaj:
nop
jmp czekaj
; obsługa przerwania
timer1:
; przeładuj timer
ldi TMP, high(15536)
out TCNT1H, TMP
ldi TMP, low(15536)
out TCNT1L, TMP
; obsługa przerwania
cp CNT, MAX ; if (CNT == 20)
breq wysw ; wy
ś
wietl zawarto
ść
tablicy na porcie
jmp nie_wysw ; nie wy
ś
wietlaj zawarto
ś
ci tablicy
wysw:
; CNT == 20
call read_char ; przeczytaj bajt z tablicy
out PORTA, DISP ; i wy
ś
wietl
clr CNT
; zeruj licznik
reti
nie_wysw:
; CNT < 20
inc CNT
reti
; odczyt warto
ś
ci z tablicy do DISP
read_char:
lpm DISP, Z+ ; załadowanie warto
ś
ci do wy
ś
wietlenia
tst DISP ; sprawdzenie czy koniec tablicy (0)
breq disp_null ; je
ś
li wyst
ą
piło 0 (koniec tablicy)
jmp disp_not_null
; wyst
ą
piła warto
ść
ró
ż
na od 0
disp_null:
ldi ZL, low(tabl<<1) ; załaduj Z ponownie
ldi ZH, high(tabl<<1)
lpm DISP, Z
; załadowanie warto
ś
ci do wy
ś
wietlenia
tst DISP
brne not_null
; nie 0? to inc Z
disp_not_null:
; else
ret
not_null:
ldi ZL, low(tabl<<1) ; załaduj Z ponownie
ldi ZH, high(tabl<<1)
lpm DISP, Z+
ret
; ró
ż
ne dane
tabl: .db 0xF0, 0x0F, 0xAA, 0x00
;tabl: .db 0x00, 0x0F, 0xAA, 0x00
;tabl: .db 0x00
.exit ;koniec programu
2. Dane testowe
Program przetestowano pod kątem różnych wartości danych testowych. We wszystkich
przypadkach działał poprawnie. Niektóre z testowanych postaci tablicy przedstawiono
poniżej:
tabl: .db 0xF0, 0x0F, 0xAA, 0x00
tabl: .db 0x00, 0x0F, 0xAA, 0x00
tabl: .db 0x00
3. Wnioski
Mikrokontroler ATmega128 jest rozbudowanym układem posiadającym m. in. liczniki
16-bitowe, które wykorzystano do odliczenia czasu 1 sekundy (milion taktów zegara 1 MHz).
Dużą rolę przy pisaniu programu odegrał debugger oraz symulator procesora ATmega, dzięki
którym uruchamianie oprogramowania było sporo łatwiejsze. Ostatecznie stworzony program
działał poprawnie dla wszystkich testowanych kombinacji danych.