[BASCOM] Multipleksowanie wyświetlacza

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

[BASCOM] Multipleksowanie wyświetlacza

Post autor: Destroyer » 26 lut 2014, 19:29

Jestem w trakcie konstruowania zegara binarnego synchronizowanego z DCF 77. Wykonałem właśnie wyświetlacz na diodach LED połączonych wspólną anodą. Wzorując się na wyświetlaczach siedmiosegmentowych stosuję taką samą technikę do prezentowania cyfr tylko, że w formie binarnej na zbudowanym przeze mnie wyświetlaczu. Multipleksowanie wyświetlacza prawie działa. Wszystkie cyfry wyświetlają się dobrze, poza jedną, sterowaną przez tranzystor z portu PortD.3. Wyświetlają się na niej totalne bzdury.

Kod: Zaznacz cały

Wyswietlanie:

 Incr Mux
  If Mux = 4 Then Mux = 0

  Select Case Mux
    Case 0:
     Set Portd.3
      Wysw10 = Wyswh / 10
      Wysw10 = Lookup(wysw10 , Tabela)
      Porta = Wysw10
     Reset Portd.2

    Case 1:
     Set Portd.2
      Wysw1 = Wyswh Mod 10
      Wysw1 = Lookup(wysw1 , Tabela)
      Porta = Wysw1
     Reset Portd.1

    Case 2:
     Set Portd.1
     Wyswm10 = Wyswm / 10
     Wyswm10 = Lookup(wyswm10 , Tabela)
     Porta = Wyswm10
     Reset Portd.0

    Case 3:
      Set Portd.0
      Wyswm1 = Wyswm Mod 10
      Wyswm1 = Lookup(wyswm1 , Tabela)
      Porta = Wyswm1
      Reset Portd.3
  End Select

 Return
Tabela:
Data &B1111111 , &B1111110 , &B1111101 , &B1111100 , &B1111011       ' 0,1,2,3,4
Data &B1111010 , &B1111001 , &B1111000 , &B1110111 , &B1110110       '5,6,7,8,9
gdzie zmienne:
Wyswh - zmienna gdzie przypisuję godziny
Wyswm - zmienna minutowa

i odpowiednio
wysw10 - dziesiątki
wysw1 - jedności
wyswm10 - wyświetlanie dziesiątek w minutach
wyswm1 - wyświetlanie jedności w minutach.

Co może być przyczyną złego wyświetlania się segmentu sterowanego z PortuD.3?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 26 lut 2014, 21:03

A - błąd w układzie elektrycznym, źle podłączone segmenty, tranzystor sterujący ma przebicie etc.
W programie ustal sobie odświeżanie na 2Hz, i wyświetlaj jakąś cyfrę np. 1234 jeżeli ostatni ci nie będzie gasnął, to tranzystor nim sterujący, nie zamyka się, albo PortD.3 proca nie zmienia stanu (błąd w programie lub źle ustawiony port jako wejście), lub jest ubity. Potem jak tranzystor okaże się OK, to zmodyfikuj tak program aby kolejno wyświetlacz 0000, 1111, 2222 aż do 9999, jak ci sie rozleci ostatnia cyfra, to masz źle podłączone segmenty.
Tak najprościej bez żadnych przyżądów wyczaić błąd elektryczny w układzie.
B - błąd w samym programie. Nie wygaszasz - zapalasz dobrze ostatniej cyfry.
To są najczęstsze przyczyny, sprawdż je w kolejności od A do B.

Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

Post autor: Destroyer » 26 lut 2014, 22:10

W układzie elektrycznym jest wszystko tak jak powinno być. Sprawdzałem to zamieniając miejscami krzaczący się segment jedności sterowanego z PortuD.3 z dziesiątkami dobrze działającymi. Okazało się, że portD.3 źle steruje. Czyli wina leży po stronie programu. Wszystkie porty sterujące tranzystorami skonfigurowane są jako wyjścia. Zmieniałem nawet kolejność multipleksacji, czyli np. zacząłem od portu PortD.1 (czyli po Case 0 zaczyna się ustawianie portu PortD.1). Wtedy okazało się, że na porcie PortD.1 są problemy. Nie mogę jakoś rozgryźć tego twardego orzecha. To musi być jakaś pierdoła, której na razie nie mogę wyłapać.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 28 lut 2014, 19:07

To nie jest problem na portach D. Ogólnie wygaszaj sobie wyświetlacz przed zmiana portu.
Błąd jest w CASE 3, tam resetujesz portd.3, po czym w Case 0 od razu go spowrotem ustwiasz ?
Ja to zawsze robilem za pomocą rejestru przesuwnego wtedy ten problem nie występuje, trzeba tylko robić funkcję Shift i AND na porcie.

Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

Post autor: Destroyer » 28 lut 2014, 23:26

Ale to dziwne, bo w każdym Case resetuje, a potem ustawiam port i działa. Trzy z czterech segmentów działa poprawnie. Jestem chyba zbyt początkujący, by zrozumieć dlaczego ta jedna cyfra się poprawnie nie wyświetla. Ale przeglądając w internecie wiele przykładów multipleksacji wyświetlacza LED to zrobione są na instrukcji Case. I tak samo jak u mnie Port jest najpierw resetowany, a później ustawiany. A instrukcja Shift...hmm. nawet nie wiem jak się do niej zabrać :roll:

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 01 mar 2014, 21:31

Jaki to procesor, co robi reszta programu?
Możliwe że ten pin jest wykorzystany przez jakiś inny interfejs który przypadkowo włączyłeś (np. pin SS/EN w SPI) lub jest to rzecz zależna od źle ustawionych fusów (np. CKOUT czyli wyjście zegara systemowego albo JTAG).

Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

Post autor: Destroyer » 02 mar 2014, 10:11

Procesor to ATMega16A. Odkąd go mam nigdy nic nie zmieniałem w jego FuseBit'ach. Program tylko dekoduje sygnał z odbiornika DCF, przypisuje wartości godzin i minut do zmiennych i wyświetla godzinę w formie binarnej. Nie ma w nim jeszcze żadnych innych funkcji, gdyż najpierw chcę się uporać z tą nieszczęsną multipleksacją.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 02 mar 2014, 13:39

Ok, więc alternatywne funkcje pinów nie powinny przeszkadzać.
Ostatni pomysł jaki przychodzi mi do głowy, to kwestia co robi reszta programu. Może gdzieś przypadkiem dwukrotnie używasz jednej ze zmiennych albo zmieniasz tan pinu D3.
Jeśli możesz, zastąp pin D3 na D4 albo D5 i stosownie przełącz wyświetlacz.

Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

Post autor: Destroyer » 03 mar 2014, 0:54

Przeanalizowałem program. Żadna zmienna nie jest używana w niewłaściwy sposób. Przełączałem także piny. Zmieniałem kolejność wyświetlania np. od Portd.1 w Case 0. I co zauważyłem, że port, który jest w case0 ustawiany jako pierwszy źle wyświetla cyfry. Diody się zapalają słabym światłem, lekko przygaszonym. Już mi się skończyły pomysły :???:


Na zdjęciu powinna się wyświetlać godzina 23:36. Widać, że druga cyfra świeci słabiej i źle wyświetla cyfrę 3. Jak zacznę od np. Portd.0 to inne będą świecić cyfry OK, a pierwsza będzie się świeciła jak ta na zdjęciu, czyli wynika z tego, że od strony elektrycznej wszystko jest OK.

-------------------edit--------------------
Wstawiaj obrazki na forum bo jak widzisz są niewidoczne. Wojtek
Załączniki
IMG_8569.jpg
Ostatnio zmieniony 03 mar 2014, 9:32 przez Destroyer, łącznie zmieniany 2 razy.

Awatar użytkownika
timo66
Moderator
Posty: 1807
Rejestracja: 20 maja 2006, 19:15
Lokalizacja: 66'15" M.a.R.s.
Kontakt:

Post autor: timo66 » 03 mar 2014, 15:57

A może tak by zacząć od schematu? Może tam jest jakiś błąd?

Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

Post autor: Destroyer » 05 mar 2014, 14:03

Taka jak na załączonym poniżej zdjęciu jest idea połączeń wyświetlacza. Może jutro przeprowadzę eksperyment i przetestuję jak będzie się zachowywał tradycyjny wyświetlacz siedmiosegmentowy. Oczywiście zmienię tablicę znaków.
Załączniki
IMG_8570.JPG

Awatar użytkownika
timo66
Moderator
Posty: 1807
Rejestracja: 20 maja 2006, 19:15
Lokalizacja: 66'15" M.a.R.s.
Kontakt:

Post autor: timo66 » 05 mar 2014, 17:02

To zrezygnuj z PD3 :mrgreen:

PD0 = 4 diody
PD1 = 1+3 diody
PD2 = 3 diody

2^5 = 32 kombinacje
2^6 = 64 kombinacje

Czego chcieć więcej? No chyba że ja coś przeoczyłem, lub źle rozumie?

r-mik
-
Posty: 48
Rejestracja: 10 wrz 2011, 6:36
Lokalizacja: Warszawa

Post autor: r-mik » 06 mar 2014, 11:28

A gdzie rezystory ograniczające prąd bazy tranzystorów i diod led?

Awatar użytkownika
Destroyer
-
Posty: 37
Rejestracja: 01 sie 2005, 17:12
Lokalizacja: Lublin
Kontakt:

Post autor: Destroyer » 06 mar 2014, 15:02

Być może jest to jakaś myśl z ograniczeniem liczby portów. :wink: Jeśli chodzi o rezystory ograniczające to w rzeczywistym układzie są, natomiast ns rysunku ich nie ma. Po prostu miał to być schemat poglądowy. Czekam na większą płytkę stykową to trochę poeksperymentuję i przebuduje to wszystko. Może gdzieś zrobiłem błąd łączeniowy, którego nie widzę. Muszę sprawić by układ był bardziej przejrzysty :wink: Bo chyba w tej multipleksacji nie ma żadnej filozofii :wink:

mirekm42
-
Posty: 3
Rejestracja: 13 wrz 2013, 15:23
Lokalizacja: Rzeszów

Post autor: mirekm42 » 26 kwie 2014, 10:06


ODPOWIEDZ