7 wyświetlaczy 7 segmentowych


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.




Portret użytkownika mirley

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:

WL = Wart Mod 10
Cyfra = WL1
W1 = cyfra

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.

Portret użytkownika drowning_man

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:

 If Wysw < 1000 Then
   Wysw1 = Wysw Mod 10
   Wysw = Wysw / 10
   Wysw10 = Wysw Mod 10
   Wysw = Wysw / 10
   Wysw100 = Wysw Mod 10
 
   If Wysw100 = 0 Then Wysw100 = 10                           'wygaszenie zera wiodcego
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)

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...

Portret użytkownika mirley

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.