Witam, w oparciu o książę Marcina Wziązania i kody z tej strony napisałem sobie krótki program do obsługi 7 wyświetlaczy 7 segmentowych, niestety wyskakują mi w nim błędy... $regfile = "m8def.DAT" $crystal = 16000000 Config Portd = Output Config Pinb.0 = Output Config Pinb.1 = Output Config Pinb.2 = Output Config Pinb.3 = Output Config Pinb.4 = Output Config Pinb.5 = Output Config Pinc.0 = Output Config Timer0 = Timer , Prescale = 1024 Declare Sub Pobr_znaku(cyfra As Byte) On Timer0 Mult_wysw Dim A As Byte , B As Byte , C As Byte , D As Byte , E As Byte , F As Byte , G As Byte Dim Nr_wysw As Byte Dim Kr1 As Bit , Kr2 As Bit , Kr3 As Bit , Kr4 As Bit , Kr5 As Bit , Kr6 As Bit , Kr7 As Bit Dim Wart As Long W1 Alias Portb.0 W2 Alias Portb.1 W3 Alias Portb.2 W4 Alias Portb.3 W5 Alias Portb.4 W6 Alias Portb.5 W7 Alias Portc.0 Enable Interrupts Enable Timer0 Load Timer0 , 125 Do A = 1 B = 2 C = 8 D = 9 E = 3 F = 5 G = 1 Wait 5 Wart = 2322458 Wait 5 Loop End If Wart < 10000000 Then 'BŁĄD 7 - SPODZIEWANO SIĘ IF THEN W1 = Wart Mod 10 'BŁĄD 31 - BŁĘDNY TYP DANYCH Wart = Wart / 10 W2 = Wart Mod 10 'BŁĄD 31 - BŁĘDNY TYP DANYCH Wart = Wart / 10 W3 = Wart Mod 10 Wart = Wart / 10 W4 = Wart Mod 10 Wart = Wart / 10 W5 = Wart Mod 10 Wart = Wart / 10 W6 = Wart Mod 10 Wart = Wart / 10 W7 = Wart Mod 10 If W7 = 0 Then W7 = 10 'wygaszenie zera wiodcego W1 = Lookup(w1 , Kody7seg) W2 = Lookup(w2 , Kody7seg) W3 = Lookup(w3 , Kody7seg) W4 = Lookup(w4 , Kody7seg) W5 = Lookup(w5 , Kody7seg) W6 = Lookup(w6 , Kody7seg) W7 = Lookup(w7 , Kody7seg) End If 'BŁĄD 123 - SPODZIEWANO SIĘ END IF Select Case Nr_wysw Case 0: Call Pobr_znaku(a) Portd.7 = Kr1 Reset W1 Case 1: Call Pobr_znaku(b) Portd.7 = Kr2 Reset W2 Case 2: Call Pobr_znaku(c) Portd.7 = Kr3 Reset W3 Case 3: Call Pobr_znaku(d) Portd.7 = Kr4 Reset W4 Case 4: Call Pobr_znaku(e) Portd.7 = Kr5 Reset W5 Case 5: Call Pobr_znaku(f) Portd.7 = Kr6 Reset W6 Case 6: Call Pobr_znaku(g) Portd.7 = Kr7 Reset W7 End Select Incr Nr_wysw If Nr_wysw = 7 Then Nr_wysw = 0 End If Return Kody7seg: Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001, Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000 Błędy napisałem w linijkach w których program mi je wywala. Program ma po prostu wyświetlać wartść którą sobie wpiszę do zmiennej 'Wart'. Bardzo proszę o pomoc.
|
|||
Re: 7 segment
Po pierwsze to nie widzę nigdzie definicji podprogramu Pobr_znaku(cyfra As Byte), na początku jest deklaracja ale nie ma definicji nigdzie.
Sprawa z typem danych polega na tym że wpisujesz do portu który jest bytem zmienną long która ma wiele bajtów. Jeśli robisz operacje na long to jej wynik powinieneś też przypisać do loga, w przeciwnym wypadku mogą się pojawić błędy. Powinno to być chyba tak:
gdzie zmienna pomocnicza WL jest LONG a Cyfra jest typu byte
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
odp
A co to jest 'WL1' ? Kurcze no pojedyncze cyfry jeszcze jakoś rozumiem ale kompletnie nie kapuje jak zrobić, żeby wpisując Dowolną wartość do Wart wyświetlił mi to od razu...
Rozumiem Mod i te dzielenia, w projekcie Termometr Uniwersalny masz fragment:
Chciałem go po prostu przerobić na więcej wyświetlaczy i myślałem, że będzie ok...a tu zonk.
Próbuje i próbuje i ciągle nic... może napisze jaki program chce napisać...na początek chciałem, żeby napisać program który będzie wyświetlał wpisaną wartość do Wart (ale cięzko mi to idzie), póxniej chcę zrobić program który będzie wyświetlał cos takiego:
'in. (temperatura wewnątrz)'
przerwa około 10sec
'out. (temperatura na zewnątrz)'
Wiem jak odczytać temperature z czujnika itp więc głównie chodzi o wyświetlenie tego wszystkiego...
Multipleksowanie
Popatrz na program termometr 2313, to co wkleiłeś to jest z procesora 2051 a tam troszkę to inaczej działało.
Chodzi o to że wynik operacji Wysw Mod 10 musisz przypisać do zmiennej tego samego typu co wysw bo w przeciwnym wypadku mogą pojawić się błędy.
Potem przypisujesz zmienną większego typu na byte i starsza część zostanie odcięta.
Z tego co teraz patrzę to masz poważny błąd w samym algorytmie działania programu. Aby wyświetlić coś na wyświetlaczu 7 segmentowym sterujesz wyprowadzeniami segmentów oraz wspólnymi anodami, lub katodami w zależności od typu wyświetlacza.
Program musi przeliczyć zatem wartość "wart" na odpowiadające jej wartości znaków na wyświetlaczu (dla siedmi znaków powinieneś miec tablicę 7 bajtów np dim W(7) as byte). Nie możesz tego przypisywac do pinów pojedynczych tak jak u ciebie "W1 = Wart Mod 10 " bo co ci to daje. (Dopiero teraz zauważyłem że coś takiego zrobiłeś). To jest sterowanie wartością znaku.
W drugim kroku trzeba sterować wspólnymi wyprowadzeniami, czyli w ogólności masz licznik od 0 do 7 i case. W każdej z wartości case'a wyłączasz poprzedni znak (wyprowadzenie wspólne) ustawiasz na całym porcie wartość odpowiadającą z tablicy 7 bajtowej, dla case 0 będzie to Port = W(0), po drodze jeszcze trzeba będzie zrobić poleceniu lookup żeby zmienić wartość np 5 na odpowiadający jej kod bitowy.
Poczytaj jeszcze http://mirley.firlej.org/multipleksowanie_wyswietlacza_led tam jest opis działania programu dla dwóch wyświetlaczy
Spróbuje potem coś sam napisać ale mam mało czasu na dodatkowe czynności poza planem
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.