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.