Państwowa Wyższa Szkoła Zawodowa w Nowym Sączu Instytut Techniczny Programowanie mikrokontrolerów- laboratorium Nazwisko i imię 1. 2. Data wykonania ćwiczenia: Grupa: Ocena sprawozdania Zaliczenie: Symbol: AVR_4 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 Declare Sub Wysw7seg(Cyfra As Byte) 'informuje kompilator o pliku 'dyrektyw mikrokontrolera 'informuje kompilator 'o częstotliwości oscylatora 'taktującego mikrokontroler 'port A jako wyjściowy 'deklaracja procedury obsługi 'wyświetlacza LED Dim I As Byte 'zmienna licznikowa dla pętli 'For...Next Dim Kod_cyf As Byte 'zmienna do przechowywania kodu 'wyświetlanej cyfry PORTB = &B11110000 sterowanie wyświetlaczami 1-4 'początek pętli nieskończonej '... For I = 0 To 9 'pętla wykonywana 10 razy Call Wysw7seg(i) Wysw7seg Waitms 500 'czekaj 500 ms Next I 'zwiększ o jeden wartość I 'koniec pętli nieskończonej 'koniec programu Sub Wysw7seg(Cyfra As Byte) 'definicja procedury Wysw7seg If Cyfra < 10 Then '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
Else Sub PortA = 255 'w przeciwnym razie 'koniec warunku If...Then 'koniec procedury 'tablica stałych Kody7seg 'przechowująca kody wyświetlanych 'cyfr Zadanie_1: Przykład_2 Napisz program, który wyświetla na wyświetlaczu siedmiosegmentowym cyfry 1234 Przykład_2 sterowanie sekwencyjne wyświetlaczem siedmiosegmentowym. $regfile = "m32def.dat" $crystal = 16000000 $hwstack = 34 $swstack = 8 $framesize = 24 Config Porta = Output Config Pinb.0 = Output Config Pinb.1 = Output Config Pinb.2 = Output Config Pinb.3 = Output Config Timer0 = Timer, Prescale = 256 'informuje kompilator o pliku 'dyrektyw mikrokontrolera '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 Declare Sub Pobr_znaku(cyfra As Byte) On Timer0 Mult_wysw 'deklaracja procedury 'pobierającej kod cyfry do 'wyświetlenia z tablicy 'przerwanie od przepełnienia 'Timer0 skok nastąpi do 'podprogramu Mult_wysw Dim A As Byte, B As Byte, C As Byte, D As Byte 'definicje zmiennych A, B, C, 'D, w których będzie 'przechowywana wartość do 'wyświetlenia Dim Nr_wysw As Byte Dim Wart As Byte W1 Alias Portb.0 W2 Alias Portb.1 W3 Alias Portb.2 W4 Alias Portb.3 '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 Enable Interrupts Enable Timer0 Load Timer0, 125 A=1 B=2 C=3 D=4 Waitms 500 '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 'opóźnienie 5 sekund 'koniec pętli nieskończonej 'koniec programu Sub Pobr_znaku(cyfra As Byte) 'definicja procedury 'Pobr_znaku
If Cyfra < 10 Then Porta = Lookup(cyfra, Kody7seg ) Else Porta = 0 Sub '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 Mult_wysw: Load Timer0, 150 'podprogramu obsługi 'przerwania od przepełnienia 'Timer0 w którym odbywa się 'multipleksowanie 'załadowanie do licznika 'wartości początkowej Set W1 'wygaszenie wyświetlacza 1 Set W2 'wygaszenie wyświetlacza 2 Set W3 'wygaszenie wyświetlacza 3 Set W4 'wygaszenie wyświetlacza 4 Select Case Nr_wysw 'Nr_wysw, wykonaj: Case 0: Call Pobr_znaku(a) 'w zależności od wartości 'gdy Nr_wysw = 0, to Reset W1 'włączenie wyświetlacza 1 Case 1: 'gdy Nr_wysw = 1, to Call Pobr_znaku(b) Reset W2 'włączenie wyświetlacza 2 Case 2: 'gdy Nr_wysw = 2, to Call Pobr_znaku(c) Reset W3 'włączenie wyświetlacza 3 Case 3: 'gdy Nr_wysw = 3, to Call Pobr_znaku(d) Reset W4 'włączenie wyświetlacza 4 Select 'koniec instrukcji wyboru Incr Nr_wysw 'zwiększenie o jeden wartości 'Nr_wysw If Nr_wysw = 4 Then 'jeśli wartość Nr_wysw 'osiągnie 4, to Nr_wysw = 0 'zeruj wartość Nr_wysw 'powrót z podprogramu 'przerwania 'Kody cyfr 'tablica stałych Kody7seg 'przechowująca kody 'wyświetlanych cyfr Zadanie_2: Przykład_3 Napisz program, który na wyświetlaczu siedmiosegmentowym wyświetla liczby od 0000 do 9999. Licznik zwiększa wartość co 100ms. 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
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 A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim Nr_wysw As Byte W1 Alias Portb.0 W2 Alias Portb.1 W3 Alias Portb.2 W4 Alias 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 If S1 = 0 Then If S1 = 0 Then Incr S If S = 60 Then If S2 = 0 Then If S2 = 0 Then Incr M If M = 60 Then If S3 = 0 Then A = M / 10 B = M Mod 10 C = S / 10 If S3 = 0 Then
D = S Mod 10 Odmierz_1s: Counter1 = 3036 Incr S If S = 60 Then Incr M If M = 60 Then Incr G If G = 24 Then G = 0 Sub Pobr_znaku(cyfra As Byte) Porta = Lookup(cyfra, Kody7seg) 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 Select Incr Nr_wysw If Nr_wysw = 4 Then Nr_wysw = 0