Witam
Zmontowałem sobie układ atmega8 oraz 35 LED połączonych w małą matrycę 7x5
Załadowałem kod który jest napisany w listingu do książki Marcina Wiązania.Są tam dwa kody jeden do wyświetlania po kolei wszystkich znaków ASCII który działa bez problemowo oraz drugi który przewija text lecz on nie działa
Oto ten kod. Co jest w nim nie tak?
Zmontowałem sobie układ atmega8 oraz 35 LED połączonych w małą matrycę 7x5
Załadowałem kod który jest napisany w listingu do książki Marcina Wiązania.Są tam dwa kody jeden do wyświetlania po kolei wszystkich znaków ASCII który działa bez problemowo oraz drugi który przewija text lecz on nie działa
Oto ten kod. Co jest w nim nie tak?
'Program tablicy świetlnej
'Sterowania multipleksowe wyświetlaczem matrycowym 7x5 LED
'Częstotliwość sterowania kolumn wyświetlacza wynosi ok. 333 Hz
'czyli częstotliwość odświeżania kolumn wyświetlacza
'wyniesie ok. 333/5 = ok. 67 Hz
$regfile = "m8def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Pind.0 = Output 'linia PD0 jako wyjściowa
Config Pind.1 = Output 'linia PD1 jako wyjściowa
Config Pind.2 = Output 'linia PD2 jako wyjściowa
Config Pind.3 = Output 'linia PD3 jako wyjściowa
Config Pind.4 = Output 'linia PD4 jako wyjściowa
Config Pind.5 = Output 'linia PD5 jako wyjściowa
Config Pind.6 = Output 'linia PD6 jako wyjściowa
Config Pinb.0 = Output 'linia PB0 jako wyjściowa
Config Pinb.1 = Output 'linia PB1 jako wyjściowa
Config Pinb.2 = Output 'linia PB2 jako wyjściowa
Config Pinb.3 = Output 'linia PB3 jako wyjściowa
Config Pinb.4 = Output 'linia PB4 jako wyjściowa
Config Timer0 = Timer , Prescale = 256
'konfiguracja Timer0 jako timer
'z podziałem preskalera przez
'256
Declare Sub Tablica_sw(byval Tekst As String , Byval Szybkosc As Byte)
'procedura tablicy świetlnej
Declare Sub Pobr_kol_z_tab 'procedura pobiera kod kolumny
'wyświetlanego znaku z tablic
Declare Sub Przepisz 'procedura przesuwa wartości
'wyświetlanych kolumn o kolejną
'pozycję
Declare Sub Wysl_zn 'procedura wysyłająca znaki
'z tablicy Kol na wyjścia poru D
On Timer0 Mult_wysw_matr 'przerwanie od przepełnienia
'Timer0, skok do podprogramu
'przerwania Mult_wysw_matr
Dim Znak As String * 1 'zmienna, do której wpisywany
'jest znak do wyświetlenia
Dim Nr_kol As Byte 'zmienna określająca numer
'zapalanej kolumny wyświetlacza
Dim Kod_zn As Byte 'zmienna, do której wpisywany
'jest kod ASCII wyświetlanego
'znaku
Dim Kol_zn As Byte 'zmienna, do której wpisywany
'jest kod wyświetlanej kolumny
'z określonej tablicy
Dim Kol(5) As Byte '5-elementowa tablica Kol do
'której będą wpisywane
'wyświetlane kody kolumn znaków
Dim I As Byte 'zmienna licznikowa
Dim J As Byte 'zmienna licznikowa
C1 Alias Portb.0 'przypisanie linii PB0 nazwy C1
C2 Alias Portb.1 'przypisanie linii PB1 nazwy C2
C3 Alias Portb.2 'przypisanie linii PB2 nazwy C3
C4 Alias Portb.3 'przypisanie linii PB3 nazwy C4
C5 Alias Portb.4 'przypisanie linii PB4 nazwy C5
Enable Interrupts 'odblokowanie globalnego systemu
'przerwań
Enable Timer0 'odblokowanie przerwania od
'przepełnienia Timer0
Load Timer0 , 94 'wpisanie do licznika wartości
'początkowej 162 gdyż
'256 - 94 = 162
Do 'początek nieskończonej pętli
Tablica_sw "*Bascom AVR*" , 100 'wywołanie w pętli procedury
'tablicy świetlnej co 100 ms
Loop 'koniec pętli nieskończonej
End 'koniec programu
Sub Tablica_sw(byval Tekst As String , Byval Szybkosc As Byte)
'definicja procedury
'z parametrem Tekst oraz
'Szybkosc
Local Dl As Byte 'definicja zmiennej lokalnej Dl
For I = 1 To 5 'pętla wykonywana 5 razy
Kol(i) = 255 'wpisanie do wszystkich
'elementów tablicy Kol wartości
'255 powodującej wygaszenie
'kolumn
Next I 'zwiększenie o 1 zmiennej I
Dl = Len(tekst) 'odczyt ilości znaków w tekście
For J = 1 To Dl 'zewnętrzna pętla wykonywana od
'wartości J = 1 do liczby znaków
'w tekście
Znak = Mid(tekst , J , 1) 'przypisanie zmiennej Znak
'znaku odczytanego z pozycji
'określonej przez J z parametru
'Tekst
Kod_zn = Asc(znak) 'zamienia znak zmiennej Znak na
'odpowiednik kodu ASCII
For I = 1 To 5 'wewnętrzna pętla wykonywana 5
'razy
Call Pobr_kol_z_tab 'pobranie kodu kolumny do
'zmiennej Kol(5) z odpowiedniej
'tablicy stałych
Waitms Szybkosc 'opóźnienie o czas zadany
'parametrem Szybkosc
Call Przepisz 'przepisanie wartości z tablicy
'zmiennych Kol
Next I 'zwiększenie o 1 zmiennej I
Kol(5) = 255 'zapisz do Kol(5) wartość 255, co
'powoduje odstęp pomiędzy
'przesuwanymi znakami
Waitms Szybkosc 'opóźnienie o zadany czas
Call Przepisz 'przepisanie wartości z tablicy
'zmiennych Kol w lewo
Next J 'zwiększenie wartość zmiennej J
For I = 1 To 4 'pętla wykonywana 4 razy
Kol(5) = 255 'wygaszenie kolumny C5
Waitms Szybkosc 'opóźnienie o zadany czas
Call Przepisz 'przepisanie wartości z tablicy
'zmiennych Kol w lewo
Next I 'zwiększenie o 1 zmiennej I
End Sub 'koniec procedury
Sub Pobr_kol_z_tab 'definicja procedury
'Pobr_kol_z_tab
Select Case I 'w zależności od wartości
'i wykonaj:
Case 1: 'jeśli I ma wartość 1, to
Kol(5) = Lookup(kod_zn , Kol1) 'wpisanie do tablicy Kol(5) kodu
'znaku dla kolumny 1
Case 2: 'jeśli I ma wartość 2, to
Kol(5) = Lookup(kod_zn , Kol2) 'wpisanie do tablicy Kol(5) kodu
'znaku dla kolumny 2
Case 3: 'jeśli I ma wartość 3, to
Kol(5) = Lookup(kod_zn , Kol3) 'wpisanie do tablicy Kol(5) kodu
'znaku dla kolumny 3
Case 4: 'jeśli I ma wartość 4, to
Kol(5) = Lookup(kod_zn , Kol4) 'wpisanie do tablicy Kol(5) kodu
'znaku dla kolumny 4
Case 5: 'jeśli I ma wartość 5, to
Kol(5) = Lookup(kod_zn , Kol5) 'wpisanie do tablicy Kol(5) kodu
'znaku dla kolumny 5
End Select 'koniec instrukcji wyboru
End Sub 'koniec procedury
Sub Przepisz 'definicja procedury Przepisz,
'przesuwa wartości wpisane do
'tablicy Kol o jedną pozycję
'w lewo
Kol(1) = Kol(2) 'przepisanie wartości Kol(2) do
'Kol(1) - wartość Kol(1) tracona
Kol(2) = Kol(3) 'przepisanie wartości Kol(3) do
'Kol(2)
Kol(3) = Kol(4) 'przepisanie wartości Kol(4) do
'Kol(3)
Kol(4) = Kol(5) 'przepisanie wartości Kol(5) do
'Kol(4)
End Sub 'koniec procedury
Sub Wysl_zn 'definicja procedury, która
'w zależności od Nr_kol wpisuje
'wartość z odpowiedniej tablicy
'Kol do portu D
Select Case Nr_kol 'w zależności od wartości Nr_kol
'- numeru kolumny wykonaj:
Case 0: 'gdy Nr_kol = 1
Kol_zn = Kol(nr_kol + 1) 'wpisanie do zmiennej Kol_zn
'wartości pierwszego elementu
'tablicy Kol (Nr_kol+1)
Case 1: 'gdy Nr_kol = 2
Kol_zn = Kol(nr_kol + 1) 'wpisanie do zmiennej Kol_zn
'wartości drugiego elementu
'tablicy Kol (Nr_kol+1)
Case 2: 'gdy Nr_kol = 3
Kol_zn = Kol(nr_kol + 1) 'wpisanie do zmiennej Kol_zn
'wartości trzeciego elementu
'tablicy Kol (Nr_kol+1)
Case 3: 'gdy Nr_kol = 4
Kol_zn = Kol(nr_kol + 1) 'wpisanie do zmiennej Kol_zn
'wartości czwartego elementu
'tablicy Kol (Nr_kol+1)
Case 4: 'gdy Nr_kol = 5
Kol_zn = Kol(nr_kol + 1) 'wpisanie do zmiennej Kol_zn
'wartości piątego elementu
'tablicy Kol (Nr_kol+1)
End Select 'koniec instrukcji warunkowej
Portd = Portd And &B10000000 'wyzerowanie 7 bitów rejestru
'PORTD
Kol_zn = Kol_zn And &B01111111 'wyzerowanie najstarszego bitu
'zmiennej Kol_zn zawierającej
'kolumnę znaku do wyświetlenia
Portd = Portd Or Kol_zn 'zapisanie do rejestru PORTD
'wartości zmiennej Kol_zn bez
'zmiany najstarszego bitu
'rejestru PORTD
End Sub 'koniec procedury
Mult_wysw_matr: 'podprogramu obsługi przerwania
'od przepełnienia Timer0
Load Timer0 , 94 'wpisanie do licznika wartości
'początkowej
Set C1 'wygaszenie kolumny 1
Set C2 'wygaszenie kolumny 2
Set C3 'wygaszenie kolumny 3
Set C4 'wygaszenie kolumny 4
Set C5 'wygaszenie kolumny 5
Call Wysl_zn 'wywołanie procedury
'pobierającej i wysyłającej kod
'wyświetlanej kolumny z tablic
Select Case Nr_kol 'w zależności od wartości Nr_kol
'wykonaj:
Case 0: 'gdy Nr_kol = 0, to
Reset C1 'włączenie kolumny 1
Case 1: 'gdy Nr_kol = 1, to
Reset C2 'włączenie kolumny 2
Case 2: 'gdy Nr_kol = 2, to
Reset C3 'włączenie kolumny 3
Case 3: 'gdy Nr_kol = 3, to
Reset C4 'włączenie kolumny 4
Case 4: 'gdy Nr_kol = 4, to
Reset C5 'włączenie kolumny 5
End Select 'koniec instrukcji wyboru
Incr Nr_kol 'zwiększenie o jeden wartości
'Nr_kol
If Nr_kol = 5 Then 'jeśli wartość Nr_kol osiągnie
'5, to
Nr_kol = 0 'zerowanie wartości Nr_kol
End If
Return 'powrót z podprogramu przerwania
Kol1: 'tablica kodów Kol1 dla
'pierwszej kolumny wyświetlacza
'- kolejność kodów odpowiada
'numerom ASCII
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 107 , 109 , 29 , 73 , 127 ,
Data 127 , 127 , 107 , 119 , 127 , 119 , 127 , 125 , 65 , 127 ,
Data 94 , 61 , 115 , 13 , 97 , 127 , 73 , 79 , 127 , 127 , 119 ,
Data 107 , 127 , 95 , 89 , 64 , 0 , 65 , 0 , 0 , 0 , 65 , 0 ,
Data 127 , 125 , 0 , 0 , 0 , 0 , 65 , 0 , 65 , 0 , 78 , 63 , 1 ,
Data 3 , 1 , 28 , 15 , 60 , 127 , 43 , 127 , 111 , 126 , 127 ,
Data 125 , 0 , 113 , 113 , 113 , 119 , 103 , 0 , 127 , 125 , 0 ,
Data 127 , 96 , 96 , 113 , 96 , 119 , 96 , 118 , 111 , 97 , 99 ,
Data 97 , 110 , 103 , 110 , 127 , 127 , 127 , 119 , 119
Kol2: 'tablica kodów Kol2 dla drugiej
'kolumny wyświetlacza
'- kolejność kodów odpowiada
'numerom ASCII
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 15 , 0 , 85 , 27 , 54 , 47 , 99 ,
Data 62 , 119 , 119 , 122 , 119 , 124 , 123 , 58 , 94 , 60 , 62 ,
Data 107 , 46 , 86 , 56 , 54 , 54 , 73 , 74 , 107 , 107 , 62 ,
Data 63 , 54 , 59 , 54 , 62 , 62 , 54 , 55 , 62 , 119 , 62 , 126 ,
Data 119 , 126 , 95 , 111 , 62 , 55 , 62 , 55 , 54 , 63 , 126 ,
Data 125 , 126 , 107 , 119 , 58 , 0 , 75 , 62 , 95 , 126 , 63 ,
Data 106 , 118 , 110 , 110 , 106 , 64 , 90 , 119 , 110 , 126 ,
Data 123 , 62 , 111 , 119 , 110 , 107 , 107 , 119 , 106 , 1 ,
Data 126 , 125 , 126 , 117 , 122 , 108 , 119 , 127 , 62 , 119 , 99
Kol3: 'tablica kodów Kol3 dla trzeciej
'kolumny wyświetlacza
'- kolejność kodów odpowiada
'numerom ASCII
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 6 , 127 , 107 , 0 , 119 , 42 , 31 , 93 ,
Data 93 , 65 , 65 , 121 , 119 , 124 , 119 , 54 , 0 , 58 , 46 , 91 ,
Data 46 , 54 , 55 , 54 , 54 , 73 , 73 , 93 , 107 , 93 , 58 , 48 ,
Data 59 , 54 , 62 , 62 , 54 , 55 , 54 , 119 , 0 , 62 , 107 , 126 ,
Data 103 , 119 , 62 , 55 , 58 , 51 , 54 , 0 , 126 , 126 , 113 ,
Data 119 , 120 , 54 , 62 , 96 , 62 , 63 , 126 , 95 , 106 , 110 ,
Data 110 , 110 , 106 , 55 , 90 , 111 , 32 , 110 , 117 , 0 , 115 ,
Data 111 , 110 , 107 , 107 , 111 , 106 , 110 , 126 , 126 , 121 ,
Data 123 , 122 , 106 , 73 , 0 , 73 , 85 , 85
Kol4: 'tablica kodów Kol4 dla czwartej
'kolumny wyświetlacza
'- kolejność kodów odpowiada
'numerom ASCII
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 15 , 0 , 85 , 108 , 93 , 127 , 62 ,
Data 99 , 119 , 119 , 127 , 119 , 127 , 111 , 46 , 126 , 54 , 22 ,
Data 0 , 46 , 54 , 47 , 54 , 53 , 127 , 127 , 62 , 107 , 107 , 55 ,
Data 62 , 59 , 54 , 62 , 93 , 54 , 55 , 54 , 119 , 62 , 1 , 93 ,
Data 126 , 95 , 123 , 62 , 55 , 61 , 53 , 54 , 63 , 126 , 125 , 126 ,
Data 107 , 119 , 46 , 62 , 75 , 0 , 95 , 126 , 111 , 106 , 110 ,
Data 110 , 118 , 106 , 63 , 90 , 111 , 126 , 33 , 110 , 126 , 111 ,
Data 111 , 110 , 107 , 115 , 111 , 106 , 126 , 125 , 125 , 126 ,
Data 117 , 122 , 102 , 62 , 127 , 119 , 99 , 119
Kol5: 'tablica kodów Kol5 dla piątej
'kolumny wyświetlacza
'- kolejność kodów odpowiada
'numerom ASCII
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 , 127 ,
Data 127 , 127 , 127 , 127 , 127 , 107 , 91 , 92 , 122 , 127 , 127 ,
Data 127 , 107 , 119 , 127 , 119 , 127 , 95 , 65 , 127 , 78 , 57 ,
Data 123 , 49 , 121 , 31 , 73 , 67 , 127 , 127 , 127 , 107 , 119 ,
Data 79 , 65 , 64 , 73 , 93 , 99 , 62 , 63 , 80 , 0 , 127 , 63 , 62 ,
Data 126 , 0 , 0 , 65 , 79 , 66 , 78 , 57 , 63 , 1 , 3 , 1 , 28 , 15 ,
Data 30 , 127 , 43 , 127 , 111 , 126 , 127 , 112 , 113 , 125 , 0 ,
Data 115 , 95 , 65 , 112 , 127 , 127 , 127 , 127 , 112 , 112 , 113 ,
Data 119 , 96 , 119 , 125 , 125 , 96 , 99 , 97 , 110 , 97 , 110 ,
Data 127 , 127 , 127 , 119 , 119