Programowanie mikrokontrolerów - laboratorium Temat
Transkrypt
Programowanie mikrokontrolerów - laboratorium Temat
Programowanie mikrokontrolerów - laboratorium Państwowa Wyższa Szkoła Zawodowa w Nowym Sączu Instytut Techniczny Programowanie mikrokontrolerów- laboratorium Temat: Obsługa wyświetlacza siedmiosegmentowego. Ocena sprawozdania Nazwisko i imię Symbol: AVR_4 Zaliczenie: 1. 2. Data wykonania ćwiczenia: Grupa: 1. Celem ćwiczenia: Celem ćwiczenia jest zapoznanie z obsługą układów czasowo licznikowych mikrokontrolera AVR Atmega 32 oraz wyświetlaczem siedmiosegmentowym. 2. Program ćwiczenia: • Program_1 – sterowanie statyczne wyświetlaczem siedmiosegmentowym. • Program_2 – sterowanie sekwencyjne wyświetlaczem siedmiosegmentowym. • Program_3 – sterowanie sekwencyjne wyświetlaczem siedmiosegmentowym zegar. 3. Realizacja ćwiczenia: Przykład_1 • Przykład_1 – sterowanie statyczne wyświetlaczem siedmiosegmentowym. 'Program sterujący wyświetlaczem 7-segmentowym LED $REGFILE = "m32def.dat" $CRYSTAL = 16000000 Config PortA = Output Config PortB = Output 'informuje kompilator o pliku 'dyrektyw mikrokontrolera 'informuje kompilator 'o częstotliwości oscylatora 'taktującego mikrokontroler 'port A jako wyjściowy Declare Sub Wysw7seg(Cyfra As Byte) 'deklaracja procedury obsługi 'wyświetlacza LED Dim I As Byte Dim Kod_cyf As Byte PORTB = &B11110000 Do For I = 0 To 9 Call Wysw7seg(i) Waitms 500 Next I Loop End 'zmienna licznikowa dla pętli 'For...Next 'zmienna do przechowywania kodu 'wyświetlanej cyfry ‘sterowanie wyświetlaczami 1-4 'początek pętli nieskończonej 'Do...Loop 'pętla wykonywana 10 razy 'wywołanie procedury Wysw7seg 'czekaj 500 ms 'zwiększ o jeden wartość I 'koniec pętli nieskończonej 'koniec programu Sub Wysw7seg(Cyfra As Byte) If Cyfra < 10 Then 'definicja procedury Wysw7seg 'jeśli wartość otrzymanej do 'wyświetlenia cyfry < od 10 to Kod_cyf = Lookup(cyfra , Kody7seg ) 'zapisz do zmiennej Kod_cyf kod 'znaku z tablicy stałych Kody7seg PortA = Kod_cyf 'linii sterującej kropka 'wartość zmiennej Kod_cyf 'wystawiana jest na port A Temat: Obsługa wyświetlacza siedmiosegmentowego. Programowanie mikrokontrolerów - laboratorium Else 'w przeciwnym razie PortA = 255 End If 'koniec warunku If...Then 'koniec procedury End Sub Kody7seg: 'tablica stałych Kody7seg 'przechowująca kody wyświetlanych 'cyfr Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 , Data &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001 Zadanie_1: • Napisz program, cyfry 1234 który wyświetla na wyświetlaczu siedmiosegmentowym Przykład_2 • Przykład_2 – sterowanie sekwencyjne wyświetlaczem siedmiosegmentowym. $regfile = "m32def.dat" $crystal = $hwstack = $swstack = $framesize Config Config Config Config Config Config 16000000 34 8 = 24 Porta = Output Pinb.0 = Output Pinb.1 = Output Pinb.2 = Output Pinb.3 = Output Timer0 = Timer , Prescale = 256 Declare Sub Pobr_znaku(cyfra As Byte) On Timer0 Mult_wysw Dim A As Byte , B As Byte , C As Byte , D As Byte Dim Nr_wysw As Byte Dim Wart As Byte W1 W2 W3 W4 Alias Alias Alias Alias 'informuje kompilator o pliku 'dyrektyw mikrokontrolera Portb.0 Portb.1 Portb.2 Portb.3 Enable Interrupts Enable Timer0 Load Timer0 , 125 Do A=1 B=2 C=3 D=4 'port A jako wyjściowy 'linia PB0 jako wyjściowa 'linia PB1 jako wyjściowa 'linia PB2 jako wyjściowa 'linia PB3 jako wyjściowa 'konfiguracja Timer0 jako 'timer z podziałem 'preskalera przez 256 'deklaracja procedury 'pobierającej kod cyfry do 'wyświetlenia z tablicy 'przerwanie od przepełnienia 'Timer0‚ skok nastąpi do 'podprogramu Mult_wysw 'definicje zmiennych A, B, C, 'D, w których będzie 'przechowywana wartość do 'wyświetlenia 'zmienna określająca numer 'zapalonego wyświetlacza 'zmienna Wart przechowująca 'liczbę do wyświetlenia 'przypisanie linii PB0 nazwy W1 'przypisanie linii PB1 nazwy W2 'przypisanie linii PB2 nazwy W3 'przypisanie linii PB3 nazwy W4 'odblokowanie globalnego 'systemu przerwań 'odblokowanie przerwania od 'przepełnienia Timer0 'załadowanie do licznika 'wartości początkowej 131, bo '256 - 125 = 131 'początek nieskończonej pętli Waitms 500 Loop End 'opóźnienie 5 sekund 'koniec pętli nieskończonej 'koniec programu Sub Pobr_znaku(cyfra As Byte) 'definicja procedury 'Pobr_znaku Temat: Obsługa wyświetlacza siedmiosegmentowego. Programowanie mikrokontrolerów - laboratorium If Cyfra < 10 Then Porta = Lookup(cyfra , Kody7seg ) Else Porta = 0 End If End Sub Mult_wysw: Load Timer0 , 150 Set W1 Set W2 Set W3 Set W4 Select Case Nr_wysw 'Nr_wysw, wykonaj: Case 0: Call Pobr_znaku(a) 'jeżeli wartość otrzymanej do 'wyświetlenia cyfry < od 10, 'to wpisanie do portu A 'wartość kodu z tablicy 'stałych Kody7seg 'w przeciwnym razie 'wpisanie do portu A wartości '0 która wygasza wyświetlacz 'koniec warunku If...Then 'koniec procedury 'podprogramu obsługi 'przerwania od przepełnienia 'Timer0 w którym odbywa się 'multipleksowanie 'załadowanie do licznika 'wartości początkowej 'wygaszenie wyświetlacza 1 'wygaszenie wyświetlacza 2 'wygaszenie wyświetlacza 3 'wygaszenie wyświetlacza 4 'w zależności od wartości 'gdy Nr_wysw = 0, to 'wywołanie procedury Reset W1 Case 1: Call Pobr_znaku(b) 'włączenie wyświetlacza 1 'gdy Nr_wysw = 1, to 'wywołanie procedury Reset W2 Case 2: Call Pobr_znaku(c) 'włączenie wyświetlacza 2 'gdy Nr_wysw = 2, to 'wywołanie procedury Reset W3 Case 3: Call Pobr_znaku(d) 'włączenie wyświetlacza 3 'gdy Nr_wysw = 3, to 'wywołanie procedury Reset W4 End Select Incr Nr_wysw 'Nr_wysw If Nr_wysw = 4 Then 'osiągnie 4, to Nr_wysw = 0 End If Return Kody7seg: 'włączenie wyświetlacza 4 'koniec instrukcji wyboru 'zwiększenie o jeden wartości 'jeśli wartość Nr_wysw 'zeruj wartość Nr_wysw 'powrót z podprogramu 'przerwania 'tablica stałych Kody7seg 'przechowująca kody 'wyświetlanych cyfr 'Kody cyfr Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 , Data &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001 Zadanie_2: • Napisz program, który na wyświetlaczu siedmiosegmentowym liczby od 0000 do 9999. Licznik zwiększa wartość co 100ms. Przykład_3 • Przykład_3 – sterowanie sekwencyjne wyświetlaczem – zegar. $regfile = "m32def.dat" $crystal = 16000000 $hwstack = 34 $swstack = 8 $framesize = 24 Config Porta = Output Config Portb = Output Config Portc = Input Temat: Obsługa wyświetlacza siedmiosegmentowego. wyświetla Programowanie mikrokontrolerów - laboratorium Config Timer0 = Timer , Prescale = 256 Config Timer1 = Timer , Prescale = 256 Declare Sub Pobr_znaku(cyfra As Byte) On Timer0 Mult_wysw On Timer1 Odmierz_1s Dim S As Byte : Dim M As Byte : Dim G As Byte Dim Dim Dim Dim A B C D As As As As Byte Byte Byte Byte Dim Nr_wysw As Byte W1 W2 W3 W4 Alias Alias Alias Alias Portb.0 Portb.1 Portb.2 Portb.3 S1 Alias Pinc.0 S2 Alias Pinc.1 S3 Alias Pinc.2 Enable Interrupts Enable Timer0 Load Timer0 , 125 Enable Timer1 Counter1 = 3036 Set Portc.0 Set Portc.1 Set Portc.2 Do If S1 = 0 Then Waitms 25 If S1 = 0 Then Incr S If S = 60 Then S = 0 End If Waitms 200 End If End If If S2 = 0 Then Waitms 25 If S2 = 0 Then Incr M If M = 60 Then M = 0 End If Waitms 200 End If End If If S3 = 0 Then Waitms 25 If S3 = 0 Then M = 0 S = 0 Waitms 200 End If End If A = M / 10 B = M Mod 10 C = S / 10 Temat: Obsługa wyświetlacza siedmiosegmentowego. Programowanie mikrokontrolerów - laboratorium D = S Mod 10 Loop End Odmierz_1s: Counter1 = 3036 Incr S If S = 60 Then S = 0 Incr M If M = 60 Then M = 0 Incr G If G = 24 Then G = 0 End If End If End If Return Sub Pobr_znaku(cyfra As Byte) Porta = Lookup(cyfra , Kody7seg) End Sub Mult_wysw: Load Timer0 , 150 Set W1 Set W2 Set W3 Set W4 Select Case Nr_wysw Case 0: Call Pobr_znaku(a) Reset W1 Case 1: Call Pobr_znaku(b) Reset W2 Case 2: Call Pobr_znaku(c) Reset W3 Case 3: Call Pobr_znaku(d) Reset W4 End Select Incr Nr_wysw If Nr_wysw = 4 Then Nr_wysw = 0 End If Return Kody7seg: Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 , Data &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001 Temat: Obsługa wyświetlacza siedmiosegmentowego.