Przejrzałem jeszcze raz koncepcję sterowania DB dla wersji LED i mam do Ciebie Damos pytanie.W tej koncepcji jest 28 linii odczytujących 2 rejestry wyjściowe,czyli mamy max.56 bajtów do dyspozycji.
Nie do końca.
Mamy 28 osobnych rejestrów z wejściem szeregowym i wyjściem równoległym. Taki jeden rejestr to właśnie "stack", ponieważ składa się ze stosu połączonych mniejszych układów.
Każdy "stack" ma maksymalną pojemność 60 bajtów, czyli 480 bitów. Nie ma minimalnej długości. 28 takich stacków daje nam w sumie
13 440 bitów (można wysterować
tyle diod LED lub
1680 wyświetlaczy 7-seg lub
280 zestawów każdy po 6 wyświetlaczy 7-seg :karpik - i to za pomocą jednej ATmegi16...)
Zapis odbywa się za pomocą 3 linii:
- pierwsza to CLK - czyli zegar
- druga to SDI - czyli Serial Data In
- trzecia to LE - czyli Latch Enable
Mamy więc 28 linii (odbiorników) odczytujących JEDEN sygnał wejściowy (wspólny dla nich) - linię SDI bit po bicie, zgodnie z sygnałem zegarowym generowanym przez uP (CLK).
Czyli jest to rejest szeregowo-równoległy o długości 448 bitów podzielony na pamięci 16 bitowe.
Nie do końca. Jest to 28
osobnych rejestrów . Każdy o
zmiennej długości (maksymalnie 480 bitów). Każdy z osobnym wyjściem równoległym.
Zapis następuje do 2 rejestrów wyjściowych określoną linią LE strobu w odpowiednim momencie czasowym.
Podawanie danych następuje do
wszystkich rejestrów w tym samym czasie. Zapis - tylko
jednego rejestru, za pomocą wybranej linii LE.
Jeśli chcemy zapisać ostatnie 2 bajty to musimy przesłać cały ciąg danych czyli 448 bitów.
Długość ciągu danych zależy od zdefiniowanej długości rejestru. Ogólnie - zawsze podaję tyle bitów, ile ma dany rejestr.
Jeśli chcemy zapisać pierwsze 2 bajty to możemy przesłać krótki ciąg danych czyli 2 bajty
Jest to ryzykowne. Przy zapisie za pomocą LE zmieniane są
wszystkie bity w rejestrze. Tak więc powinniśmy zawsze podać tyle bitów, jak długi jest rejestr. W przypadku rejestru 480 bitowego - trzeba podać tyle bitów. Jeśli podłączyliśmy odbiorniki tylko do pierwszych 2 bitów - możemy podać tylko 2 bity i wywołać zapis. Pozostałe bity poprostu nie będą widoczne na żadnym odbiorniku i można je ignorować. Należy jednak pamiętać, że każdy rejestr może mieć
inną długość.
Jeśli mamy zapas czasu na zapis oraz procedura zapisu wszystkich 448 bitów nie jest skomplikowana to można jedną linią LE zapisać wszystkie rejestry jednocześnie.
Nie. Każda linia LE jest osobna dla wszystkich rejestrów. W każdym rejestrze wywołujemy zapis osobno.
Wadą tej koncepcji jest to,że musimy czekać z odczytem zapisem tak długo,aż zostanie wysłany cały ciąg 448 1-480 bitów.Czy jest to realne z punktu widzenia programisty,czy może popełniam jakiś błąd?
Jest właśnie tak. Podajemy wszystkie bity (etap "write" ) a następnie a następnie zatrzaskujemy w rejestrze (etap "store"). Czasowo na uP wygląda to tak:
zapis rejestru 72 bitowego: 100.82 us (dla 1 linii to 9918 fps, dla wszystkich 28 to 354 fps)
zapis rejestru 480 bitowego: 339.7 us (dla 1 linii to 2943 fps, dla wszystkich 28 to 105 fps)
Tak więc szybkość samego uP wystarczy. Problemem będzie przepustowość USB dla HID low speed, USB ControlMessage oraz software'owej implementacji USB ma uP.
Maksymalna teoretyczna prędkość USB ctrlMessage dla low speed to 64 Kbps

To daje mniej niż 4 fps przy 13 tys. diod

Faktyczna szybkośc tej implementacji USB na ATmega16 jest mniejsza - jeszcze jej nie mierzyłem dokładnie. MJoy ma USB o prędkości poniżej 10Kbps...
Rozwiązaniem problemów szybkości jest sprzętowe USB. Pracuję nad tym w wolnych chwilach. Jeśli powstanie to będzie w 100% kompatybilne z softem na PC, który zrobię dla obecnego systemu. Jedynie wepniesz inny hardware do USB (zastępując kilka obecnych MB jedną MB mkII) i nie będziesz musiał NIC więcej zmieniać. Mimo zmiany/dodania hardware'u moduł widoczny na diagramie (
http://www.damos.k11.pl/LO/diagram/diagram_jako_image.png) jako "ControllerService" zachowa dokładnie
ten sam interface i aplikacje zewnętrzne nawet nie będą o tym wiedzieć.
Przypominam, że polecenia zapalenia/zgaszenia konkretnych diod wysyłasz do kontrolera a już on zajmuje się optymalną strategią update'owania tego na USB.
jeśli coś nadal nie jest jasne - proszę o pytania
