[bascom] multiplexowanie diod - jak najprościej?
[bascom] multiplexowanie diod - jak najprościej?
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
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 (4.89 KiB) Przejrzano 12415 razy
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 ?
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 ?
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?).
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?).
Można by było napisać to tak:
Nie jest to jeszcze szczyt minimalizacji...
W praktyce zamiast opóźnienia lepiej sterować wyświetlaniem multipleksowanym w przerwaniach od przepełnienia licznika.
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
EndW praktyce zamiast opóźnienia lepiej sterować wyświetlaniem multipleksowanym w przerwaniach od przepełnienia licznika.
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.Ertew pisze:... Z drugiej strony, jak się procesor zawiesi to może wysterować kilka diod na stałe i je spali.
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.
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.
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ę.
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ę.
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.
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.
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.
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.
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.
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.
