Ćwiczenie - multipleksowanie, rozbijanie zmiennej na cyfry

Transkrypt

Ćwiczenie - multipleksowanie, rozbijanie zmiennej na cyfry
Zespół Szkół Technicznych
i Ogólnokształcących Programowalne układy mikroprocesorowe
w Jarosławiu
stosowane
w elektronice i telekomunikacji
W ZAWODZIE TECHNIK
elektronik i telekomunikacji
Specjalizacja
Klasa: IV TE
Ćwiczenie nr
Temat: Wstęp do multipleksowania wyświetlaczy
siedmiosegmentowych cz. 3.
Atmega162
Napisz program, który będzie zwiększał stan zmiennej o 1 co 10ms i wyświetlał ją na
czterech wyświetlaczach, wykorzystując technikę multipleksowania w przerwaniu od
przepełnienia timera oraz algorytm rozbijania zmiennej na pojedyncze cyfry.
Wykorzystaj wiadomości z poprzednich ćwiczeń, pętle for, działania dzielenie i dzielenie
modulo (reszta z dzielenia), instrukcję opóźniającą waitms. Instrukcje zwiększającą stan
zmiennej i rozbijającą liczbę na cyfry umieść w pętli głównej.
Do poprawnej pracy algorytmu potrzebne są dodatkowe zmienne, które także zostały
zadeklarowane przed pętlą główna. Są to zmienne o nazwie pom (potrzebna do obliczeń, aby
nie zmieniać stanu zmiennej, którą rozbijamy na cyfry) oraz i (jako zmienna indeksująca dla
pętli for). Została tam także zadeklarowana zmienna Licznik, którą co 10ms zwiększamy o 1.
Algorytm rozbijania zmiennej na cyfry wykorzystuje dzielenie liczb całkowitych
wykorzystujące operator „\” (np. wynikiem dzielenia 18\5 = 4, a nie 4,6!), oraz dzielenie
modulo zwracające resztę z dzielenia liczb całkowitych i wykorzystujące operator „mod” (np.
18 mod 5 = 3). Został on zapisany w pętli for, aby skrócić i uprościć zapis. Algorytm należy
wykonać tyle razy ile jest cyfr w liczbie (u nas 4, stąd pętla for ma wykonywać się cztery razy
od indeksu 1 do 4 włącznie). W każdej iteracji (przebiegu) pętli należy obliczyć resztę z
dzielenia modulo co da pojedynczą cyfrę o wadze zależnej od nr obiegu pętli (np. przy
pierwszym obiegu zostanie obliczona cyfra jedności, przy 2 -> dziesiątek, przy 3 -> setek)
oraz jako drugie działanie podzielić liczbę, którą rozkładamy na cyfry przez 10.
Przykład dla licznik = 1234
Pierwsza iteracja: wyświetlacz(1) = licznik mod 10 czyli 4
licznik = licznik \ 10, czyli licznik = 123
Druga iteracja: wyświetlacz(2) = licznik mod 10 czyli 3
licznik = licznik \ 10 czyli 12
Trzecia iteracja: wyświetlacz(3) = licznik mod 10 czyli 2
licznik = licznik \ 10 czyli 1
Czwarta iteracja: wyświetlacz(4) = licznik mod 10 czyli 1
licznik = licznik \10 czylo 0
Co kończy algorytm.
Przed rozbijaniem zmienna licznik jest zwiększana o 1 i ograniczany jest jest jej zakres do
9999, po czym jest ona zerowana.
1
Przykładowy program:
$regfile = "m162def.dat"
$crystal = 8000000
‘ definicje rejestrów procesora
‘definicja częstotliwości mikrokontrolera
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5
‘PORTD.2 jako wyjście (wyś. 1)
‘PORTD.3 jako wyjście (wyś. 2)
‘PORTD.4 jako wyjście (wyś. 3)
‘PORTD.5 jako wyjście (wyś. 4)
‘zgaś wyś. 1
‘zgaś wyś. 2
‘zgaś wyś. 3
‘zgaś wyś. 4
Config Portb = Output
Set Portb
‘PORTB jako wyjście
‘zgaś cały wyświetlacz
Config Timer0 = Timer , Prescale = 64
Enable Interrupts
Enable Timer0
On Timer0 Tim0
‘konfiguracja timera0 z preskalerem = 64
‘włączenie systemu przerwań
‘włączenie timera0
‘włączenie przerwania od timera0 i
przypisanie do niego procedury Tim0
Dim Ktory_wyswietlacz As Byte
Ktory_wyswietlacz = 0
‘deklaracja zmiennej indeksującej
wyświetlacze i nadanie jej wartości 0
Dim Wyswietlacz(4) As Byte
‘deklaracja tablicy do wyświetlenia
Dim Licznik As Integer
Dim I As Byte
Dim Pom As Integer
‘deklaracja zmiennej do liczenia
‘deklaracja zmiennej pomocniczej
indeksującej pętlę
‘deklaracja zmiennej pomocniczej do
rozbijania liczby na cyfry
‘nadanie wartości 0 zmiennej licznik
Licznik = 0
Do
Incr Licznik
If Licznik > 9999 Then Licznik = 1
I=1
Pom = Licznik
For I = 1 To 4
Wyswietlacz(i) = Pom Mod 10
Pom = Pom \ 10
Next I
Waitms 10
Loop
End
‘początek pętli głównej
‘zwiększenie zmiennej licznik o 1
‘ograniczenie zakresu zliczania zmiennej do
9999
‘nadanie wartości 1 zmiennej indeksującej
‘przypisanie do zmiennej pom zmiennej
licznik
‘początek pętli for od 1 do 4
‘przypisanie do wyświetlacz pod indeksem i
wyniku z dzielenia modulo przez 10
‘zapisanie do zmiennej POM wyniku
dzielenia POM przez 10
‘zwiększenie zmiennej i o jeden i skok do
początku pętli for
‘odczekanie 10ms
‘koniec pętlię głównej ->skok do jej
początku
2
Tim0:
Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5
Select Case Ktory_wyswietlacz
Case 0:
Portb =
Lookup(wyswietlacz(ktory_wyswietlacz +
1) , Tabela)
Reset Portd.2
Case 1:
Portb =
Lookup(wyswietlacz(ktory_wyswietlacz +
1) , Tabela)
Reset Portd.3
Case 2:
Portb =
Lookup(wyswietlacz(ktory_wyswietlacz +
1) , Tabela)
Reset Portd.4
Case 3:
Portb =
Lookup(wyswietlacz(ktory_wyswietlacz +
1) , Tabela)
Reset Portd.5
End Select
‘początek procedury przerwania
‘zgaś wyświetlacz 1
‘zgaś wyświetlacz 2
‘zgaś wyświetlacz 3
‘zgaś wyświetlacz 4
‘blok instrukcji warunkowej
‘gdy Który_wyswietlacz = 0
‘wystawienie na port wartości dla cyfry
Z tablicy z pozycji 0+1=1
‘zaświecenie wyświetlacza 1
‘gdy Który_wyswietlacz = 1
‘wystawienie na port wartości dla cyfry
Z tablicy z pozycji 1+1=2
‘zaświecenie wyświetlacza 2
‘gdy Który_wyswietlacz = 2
‘wystawienie na port wartości dla cyfry
Z tablicy z pozycji 2+1=3
‘zaświecenie wyświetlacza 3
‘gdy Który_wyswietlacz = 3
‘wystawienie na port wartości dla cyfry
Z tablicy z pozycji 3+1=4
‘zaświecenie wyświetlacza 4
‘koniec bloku instrukcji warunkowej
Incr Ktory_wyswietlacz
If Ktory_wyswietlacz > 3 Then
Ktory_wyswietlacz = 0
‘zwiększenie zmiennej o 1 i sprawdzenie
czy nie jest większa od 3 i zerowanie jej
Return
‘koniec procedury obsługi przerwania
Tabela:
Data 130 , 215 , 35 , 67 , 86 , 74 , 10 , 199 ,
2 , 66
‘deklaracja tablicy z wartościami do
zapisania na port w celu wyświetlenia
konkretnej cyfry
3

Podobne dokumenty