[bascom] multiplexowanie diod - jak najprościej?

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!
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

[bascom] multiplexowanie diod - jak najprościej?

Post autor: matrix » 18 lip 2012, 12:01

Potrzebuję drobnej pomocy. Mam 32 diody połączone w czwórkach co daje 8 sekcji. Jak najprościej w bascomie zmultiplexować je tak by zapalały się kolejno? Ale nie jedna po drugiej tylko kolejno wszystkie w górę.

Ja napisał bym to na select case, ale czy nie da się łatwiej? Poniżej podaję schemacik.

Oczywiście nie oczekuję gotowej odpowiedzi a jedynie podpowiedzi.
Po lewej są sekcje D7...D0 a po prawej B0...B3
Załączniki
multiplexowanie.png
multiplexowanie.png (4.89 KiB) Przejrzano 12420 razy

lukas15
-
Posty: 57
Rejestracja: 21 lis 2011, 20:08
Lokalizacja: Wąbrzeźno

Post autor: lukas15 » 18 lip 2012, 12:23

Codzi ci o to żeby te które się już zapaliły nie gasły :?:

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 18 lip 2012, 12:51

Dokładnie tak. Sygnałem wejściowym będzie ilość impulsów w jednostce czasu. Im więcej impulsów tym większa ilość diod ma się zapalić.

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

Post autor: kayron » 18 lip 2012, 15:17

Czyli po prostu ma to być linka analogowa. wszystko zależy jak to masz podpięcie do procesora. Jeżeli linie D0..D7 to jeden cały port, to jest to kwestia przesuwania ZERA w prawo lub lewo, jak tam ci pasować będzie, i podawania prawidłowych danych na B0..B3.
Natomiast jeżeli masz to podpięte, na łapu capu, gdzie było wygodniej na PCB, to sterownie może być kłopotliwe.
PS. Jaki proc to uciągnąć i jak to jest do niego podpięte ?

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

Post autor: Ertew » 18 lip 2012, 17:07

Typowe podejście (1):
Wysterowujesz kolejno każdy tranzystor sterujący anodami i dla niego zaświecasz tyle diód LED ile potrzebujesz. Rozwiązanie proste ale kiepskie, ponieważ diody są sterowane z małym wypełnieniem (1/8) i żeby dobrze świeciły trzeba dać mniejsze rezystory. Z drugiej strony, jak się procesor zawiesi to może wysterować kilka diód na stałe i je spali.

Typowe podejście (2):
Musisz dołożyć 4 tranzystory sterujące każdą ósemką LEDów ponieważ porty procesora są za słabe. Załączasz kolejno jedną z czterech ósemek i wybierasz która z diód ma świecić. Rozwiązanie trudniejsze programowo, ale masz większe wypełnienie dla diód (1/4).

Podejście nietypowe (3):
Też musisz dołożyć 4 tranzystory sterujące każdą ósemką LEDów.
Multiplekserowanie dzielisz tylko na dwa etapy:
W pierwszym od strony katod załączasz wszystkie diody, od strony anod wybierasz te czwórki diód które są pełne (powinny w nich świecić wszystkie diody).
W drugim od strony anod załączasz kolejną czwórkę, tą w której nie ma kompletu, i dla niej załączasz wybrane anody.
Rozwiązanie skomplikowane, ale masz najwyższe możliwe wypełnienie (1/2) przez co migotanie diód będzie mniej dokuczliwe, za to musisz sprawdzić czy nie przekroczysz prądu dopuszczalnego LEDów jeśli liczyłeś rezystory do przypadku 1 lub 2.

Powiedz jak i czym to sterujesz, to pomożemy uruchomić ten wskaźnik wysterowania (prędkości?).

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 18 lip 2012, 17:09

Można by było napisać to tak:

Kod: Zaznacz cały

'-------------------------------------------------------------------------------
Dim Value As Byte
Dim Tmp0 As Byte
Dim Tmp1 As Byte
Dim I As Byte
'-------------------------------------------------------------------------------
Do
  Value = 12                      'wartość do wyświetlenia od 0 do 32
  Tmp1 = Value
  For I = 0 To 7
    Tmp0 = &HFF
    If Tmp1 <= 32 Then
      Shift Tmp0 , Left , Tmp1
      Tmp1 = Tmp1 - 4
    End If
    Print Bin(tmp0) ; " " ;      'Zamiast print podstawienie LSB zmiennej Tmp0 do portu "katod LED"
    Tmp0 = &HFF
    Tmp0 = 2 ^ I
    Tmp0 = Not Tmp0
    Print Bin(tmp0)              'Zamiast print podstawienie zmiennej Tmp0 do portu "adresu, baz Pnp"
    'Opóźnienie np. Waitms 
  Next I
Loop
End
Nie jest to jeszcze szczyt minimalizacji...
W praktyce zamiast opóźnienia lepiej sterować wyświetlaniem multipleksowanym w przerwaniach od przepełnienia licznika.
Ertew pisze:... Z drugiej strony, jak się procesor zawiesi to może wysterować kilka diod na stałe i je spali.
Spalenie diod nie jest możliwe ze względu na rezystory ograniczające prąd. Inna sprawa że przy jednoczesnym włączeniu tranzystorów sumaryczny prąd wypływający do pinów sterujących katodami przy przekroczeniu dopuszczalnego prądu może te piny uszkodzić. Można linie magistrali sterującej bazami tranzystorów podciągnąć sprzętowo np.drabinką rezystorową do plusa zasilania (emiterów). Sterowanie linijką LED można jeszcze rozwiązać stosując trzy sztuki bajtowych rejestrów przesuwnych.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 18 lip 2012, 19:27

Anody kolejnych czwórek to od pierwszej czwórki-PORTD.7 do ostatniej czwórki-PORTD.0 .
Katody to porty B7 do B4.
Chciałbym napędzić to atemga8.

Na szybko napisałem to na select case. Mam 34 kroki w których wpisuję w odpowiednich krokach odpowiednie wartości na porty. Ale jeszcze nie wiem jak to wyjdzie bo nigdy nie multiplexowałem niczego za pomocą procka.

No i kod jest dość dłuuuuuuugi.

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

Post autor: Ertew » 18 lip 2012, 19:58

Podłączenie prawidłowe, na cały port i pół drugiego.
Dałeś albo możesz dać dodatkowe tranzystory przy katodach? Bez nich może być na styk z możliwościami prądowymi procesora.


Podziel żądaną wartość przez cztery albo przez osiem (maskowanie i przesunięcie bitowe), dostaniesz część całkowitą i resztę z dzielenia.
Mając tak rozbitą wartość zadaną, możesz sporo skrócić program.


Co do multipleksowania, zatrudnij timer generujący przerwanie kilkaset razy na sekundę.

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

Post autor: kayron » 18 lip 2012, 20:45

Ogólna idea sterowania w formie obrazkowej jest taka. Ta zmienna LONG to wartość którą chcesz wyświetlić. PS/. Na obrazku w kroku 3 jest mały blad, powinno być AND 00001111.
Obrazek

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 18 lip 2012, 21:28

Tranzystory przy katodach z pewnością się pojawią.

Co do działania to czaję trochę obrazek, ale nie do końca. Zastanawia mnie po co zmienna long i temp ?

Ja zrobiłem to tak że wpisuję na porty to co kolejno ma się wydarzyć, czyli:
jeśli mają się zaświecić 3 diody z pierwszej czwórki to włączam pierwszą czwórkę i wpisuję 3 zera na piny 7 do 5.

Jeśli mają się na przykład zaświecić już dwie czwórki to najpierw włączam pierwszą czwórkę i wpisuję 0 na piny 7 do 4, następnie to gaszę i włączam drugą czwórkę wpisując odpowiednią ilośc zer na piny od 7 do 4.

Szczerze nie wiem jak to będzie pracować. W tym przypadku u mnie kod jest zupełnie teoretyczny.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 18 lip 2012, 21:39

Nie wiem czy dobrze rozumiem założenia... Diod jest 32. Jakie wartości maksymalne może przyjąć zmienna do wyświetlenia? Bo idea z rysunku Kayrona zakłada że kolejne bity w zmiennej Long reprezentują wartość do wyświetlenia. W przypadku wartości w zmiennej Long równej =2 czyli &b00000010 wyłuskanie z maskę &b00001111 da w wyniku &b00000010 po Shift Left 4 wartość wysłana na port będzie się równać &b00100000. Więc w pierwszym kroku zostaną zaświecone trzy LED'y, a nie
dwie. W takim razie nie będzie to wyświetlacz nie będzie działał jako linijkowy tylko binarne przedstawienie zmiennej Long. Czy dobrze rozumiem? I co do instrukcji Shift Right 8 na zmiennej Long w trzecim kroku to nie da ona wyniku jak na rysunku bity mniej znaczące nie zostaną przepisane do części bardziej znaczącej.
Aby osiągnąć taki efekt należało by użyć instrukcji Rotate, tylko nie pamiętam czy można stosowac ją do zmiennych większych niż bajtowe.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 18 lip 2012, 22:54

Do wyświetlenie będą a raczej są 34 punkty. Co do samego sygnału wejściowego a raczej jego zakresu to na obecną chwilę nie ma to znaczenia. Poza tym nawet tego nie wiem.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 19 lip 2012, 0:06

34 punkty? Na schemacie jest przecież 32 LED'y. Nie chodziło mi o sygnał wejściowy tylko o pojemność zmiennej do przechowywania "nieprzerobionej do wyświetlania" wartości. Jeżeli punktów jest 34 lub 32 to zmienna bajtowa przecież wystarczy.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 19 lip 2012, 6:35

32 diody są na schemacie ale ja u siebie mam 34. Nie rysowałem dwóch dodatkowych żeby nie zaburzać przejrzystości schematu. Poza tym dwie ostatnie nie będą multiplexowane tylko sterowane bezpośrednio z pinów procesora.
Co do zmiennej przechowujacej sygnał wejściowy to sam szczerze nie wiem czego mam się spodziewać. Nie wiem jeszcze ile max impulsów tam wychodzi.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 19 lip 2012, 9:39

Jeżeli będą 32 multipleksowane diody i dwie sterowane bezpośrednio i będą wyświetlać ten "sam słupek" to dla tych dwóch diod trzeba będzie dobrać rezystory ograniczające prąd by nie było różnicy w jasności świecenia.

ODPOWIEDZ