Jako, ze wyjaśnienia na priv. dla vito_zm okazały się nie dość jasne - opiszę tu rozwiązanie, do wymyślenia którego "zmusił" mnie Codeking

Tutaj schemat - prawie gotowy. Podłączenie ponad 250 "odnóży" i pogrupowanie ich w bus'y przerosło, mój wolny czas
http://www.damos.k11.pl/LO/led_multiplex/schemat.png (uwaga - duży !

Gniazda po prawej- (nie podłączone do końca) są wyjściami do poszczególnych zespołów wyświetlaczy (dziwny układ wyjść to zachowana wsteczna kompatybilność z modułami z FSBUS'a). W każdym zespole jest 8 wyświetlaczy - bo UDN obsługuje tyle anod. Dodatkowo w każdym sezpole jest 8 wejść do poszczególnych segmentów świecących pojedynczego wyświetlacza LED - jak w normalnym rozwiązniu multiplexowanym (Zając i Vito będą wiedzieć o co chodzi). Taki "zespół" wyświetlaczy 7SEG mających osobne anody i połączone równolegle odpowiadające sobie segmenty nazwę "zespołem" (wyświetlaczy 7-mio segmentowych).
Jak na schemacie widać: uP steruje wspólnymi anodami za pomocą drivera prądowego UDN2982 (current - nie sink).
Wszystkie "zespoły" wyświetlaczy współdzielą ten sterownik: (a raczej są z niego sterowane)
- wszystkie pierwsze wyświetlacze w zespole są sterowane przez linię BA1 (buferred anoda 1)
- wszystkie drugie wyświetlacze w zespole są sterowane przez linię BA2 (buferred anoda 2)
- wszystkie trzecie wyświetlacze w zespole są sterowane przez linię BA3 (buferred anoda 3)
- wszystkie czwarte wyświetlacze w zespole są sterowane przez linię BA4 (buferred anoda 4)
- wszystkie piąte wyświetlacze w zespole są sterowane przez linię BA5 (buferred anoda 5)
- wszystkie szóste wyświetlacze w zespole są sterowane przez linię BA6 (buferred anoda 6)
itd - do ostatniego..
Oznacza to, że wszystkie "pierwsze" zapalą się w tym samym czasie, wszystkie "drugie" też razem (bo są sterowane z tego samego wyjścia IC5).
Teraz pora na pytanie - co spowoduje, że po podaniu plusa do wspólnej anody zapalą się jakieś segmenty na "zasilonych" wyświetlaczach?
Otóż... uP przed podaniem plusa na anodę wypełni danymi układy: IC1, IC2,IC3,IC4,IC6, IC7,IC8,IC10 - jest to 8 sztuk MBI5026.
Każdy z MBI ma 16 wyjść podzielone (logicznie, nie fizycznie) na dwie grupy po 8. Każda z tych grup obsługuje inny "zespół" zasilając jego "współdzielone" katody. Oczywiście - jak to wynika z idei multiplexowania w danym kwancie czasu w każdym "zespole" zaświecą się segmenty tylko jednego wyświetlacza - tego, który akurat będzie miał wysterowaną anodę.
Tak więc praca uP będzie polegać na:
1 - zapisaniu wszystkich rejestrów MBI.
2 - zgaszeniu poprzednio zasilonych anod
3 - zatrzaśnięciu danych w rejestrach MBI
4 - zapaleniu anod pod nowym indeksem (następny wyświetlacz w "zespole")
5 - powrót do punktu 1 w celu wyświetlenia danych na następnym wyświetlaczu.... i tak w kółko.
Na czym polega "odmienność" rozwiązania w stosunku do zwykłego multipleksowania jednego zespołu ?

Otóż:
1 - wszystkie 8 rejestrów współdzieli sygnał zegarowy generowany przez uP (jedna nóżka uP na wszystkie układy)
2 - wszystkie 8 rejestrów współdzieli sygnał LE generowany przez uP (jedna nóżka uP na wszystkie układy)
3 - każdy z 8-miu rejestrów ma OSOBNĄ linię dla danych wejściowych (pin 2) - więc każdy ma osobny strumień danych wejściowych, podawanych szeregowo.
4 - wszystkie linie danych (DATA1-DATA8), sterujące poszczególne rejestry są podłączone do tzw. "PORTU 8-mio bitowego" w uP. Każdy bit w tym porcie to osobna "nóżka" uP (DATA1-DATA8). Ta "nóżka" to źródło danych wejściowych dla jednego z układów MBI.
5 - wszystkie 8 bitów na porcie ustawiam w ciągu 3 cykli zegarowych przepisując jeden bajt z pamięci (
ta pamięć jest uprzednio wypełniona danymi odebranymi przez I2C) do tego właśnie portu. Powoduje to jednoczesne wystawienie danych do wszystkich 8-miu układów MBI - zyskujemy bardzo dużo na prędkości. Zauważcie, że nie ma znaczenia, czy sterujemy jednym ukłądem, czy 8-mioma, bo zapisuję i tak cały bajt (8 bitów).
6 - rejestry MBI mają wspaniałe "zatrzaski", które umożliwiają przygotowywanie nowych danych "w tle" podczas, gdy obserwatorowi prezentowane są poprzednio "zatrzaśniete" dane. Czas przygotowania nowych danych podczas świecenia poprzednio ustawionych danych pozwala na "rozżarzenie" się diod świecących bez generowania sztucznych pętli opóźniających (nie wiem, jaki jest czas reakcji LED'ów na podanie i odcięcie zasilania - jeśli na poziomie 0,5 ms to było by świetnie) .
7 - rejestry MBI mają wbudowane sterowanie (regulację) prądu dla każdego z 16 wyjść, co pozwala zrezygnować z lutowan rezystorów - (normalnie jest potrzebnych 8 rezystorów na każdy "zespół" w celu sterowania prądem każdego pola świecącego na wyświetlaczu 7SEG) - wystarczy jeden rezystor na każdy rejestr. (tzn. jeden rezystor na dwa zespoły)
8 - rejestry MBI mają 16 wyjść - więc każdy z nich "obsługuje" 2 "zespoły" wyświetlaczy LED (po 8 na każdy)
9 - rejestry MBI mogą pracować z zegarem 25 MHz, co grubo przerasta możliwości ATmegi

10 - wszystkie zespoły są sterowane w tym samym czasie - więc ich ilość NIE wpływa na jasność świecenia (współczynnik wypełnienia jest ten sam) ! Wpływ na jasność ma jedynie ilość cyfr w "zespole".
Dodatkowo zatrzaski pozwalają skrócić czas przełączania:
- zakładamy, że nowe dane są gotowe do zatrzaśnięcia, i numer nowej anody też jest już przygotowany - i wtedy
- wyłączamy "poprzednią" anodę (1 cykl zegarowy)
- zatrzaskujemy dane w rejestrach MBI (1 cykl zegarowy)
- włączamy nową anodę (1 cykl zegarowy)
Wtedy czas zgaszenia wszystkich wyświetlaczy to zaledwie 3 cykle zegarowe ! (przy 8 MHz to 0,38 us)
Koszt CPU to odczyt z pamięci i przepisanie danych do portu. Całą robotę odwalają rejestry MBI.
Tak więc za pomocą jednego uP ATmega8, 8-miu MBI5026, jednego UDN2982 i 8-miu rezystorów można obsłużyć 16 zespołów wyświetlaczy po 8 cyfr każdy (sumarycznie: 128 cyfr). W przypadku ATmega16 ilość tę można podwoić (albo 32 zespoły po 8 cyfr, albo 16 zespołów po 16 cyfr).
Ze wstępnych obliczeń wychodzi mi, że zegar 8MHz (wewnętrzny oscylator RC w uP) wystarczy z nawiązką.
Plusy:
- Układ jest bardzo podatny na rozszerzenia: ustawiając szeregowo rejestry MBI (np. do każdego już istniejącego dopinamy kolejny) możemy również podwoić ilość sterowanych wyświetlaczy (ATmega8 - 256 cyfr, ATmega16 512 cyfr). To wszystko dotyczy jednej DB. Takich płytek można podłączyć po I2C 120... (przy kaskadzie to nawet 262 000 cyfr) :karpik
- Oczywiście - nic nie stoi na przeszkodzie wariantu minimalnego: ATmega8, podłączamy tylko 1 układ MBI5026 a do niego tylko jeden "zespół" pokazujący (mający) tylko jeden wyświetlacz 7SEG (jedna cyfra) - to nadal będzie działać.
- można "załatwić" kokpit jedną DB
- Przy realizacji 16-tu "zespołów" po 8 lub mniej cyfr średni koszt części oraz PCB na jeden "zespół" to ok. 5-8PLN. Dużo taniej niż gotowiec za 40 PLN.
Minusy - jeszcze nie gotowe i nie przetestowane

vito_zm - czy teraz wyjaśniłem nieco składniej ?
