Ć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