Dokładnie tak. W przeciwnym przypadku blokujesz procesor na cały czas. Tu zresztą też warto to policzyć. Jeśli masz SPI 2x z max prędkością, to masz zaledwie 16 taktów pomiędzy kolejnymi przesłaniami, biorąc pod uwagę że wejście w przerwanie trwa 4 takty, coś się marnuje na prolog/epilog faktycznie może być bardziej sensowne wysłanie wszystkich 3 na raz. Natomiast jeśli stosujesz preskaler na SPI to już niekoniecznie.
Pracuje dalej nad projektem (mało czasu mam więc trwa to tak długo).
Przeprowadzam obliczenia i ciągle nie mogę zrozumieć ile trwa ta transmisja po SPI.
Co określa prędkość? Rejestry 74hc.. mają podaną wartość częstotliwości SH_CL 100MHz. Atmega działa z kwarcem 11Mhz.
Ile trwa wysłanie jednego byte'u a ile całego kompletu 4 byte'ów?
Ile taktów zegara procesora albo ile licząc w czasie us ?
Do SPI masz preskaler, który służy do generowania zegara SPI. Najszybciej jak się da, to wysyłanie kolejnych bitów co 2 takty zegara CPU, więc cały bajt to 16 taktów CPU.
Nie, zatrzask latch powoduje przesunięcie danych z rejestru na wyjścia układu.
Dlatego też latch dajesz dopiero po przesłaniu wszystkich n bajtów dla n układów - wtedy dopiero masz opóźnienie.
Oczywiście zatrzaśnięcie danych generuje pewne opóźnienie, związane chociażby z koniecznością programowego wygenerowania sygnału zatrzaskującego. Ale to jest jednokrotny proces dla wszystkich zatrzasków.
tmf:
ad 2. Tak. Najlepiej byłoby te dane posortować - i tak ci się to opłaci, bo sortujesz raz, a zyskujesz przy każdym przeglądaniu listy. Ponieważ nie sortujesz całej listy, nową wartość tylko wstawiasz więc masz max log n porównań, czyli 5, nie jest źle.
Ciągle sobie chyba sam utrudniam życie. Nie wychodzi mi to tak jak powinno.
Sprawę rozwiązuję tak:
- tworze tablice dwuwymiarową (kanały PWM + odpowiadające im wartości OCR)
- następnie tworzę tablicę która będzie zawierać odwołania do tablicy powyżej określająca kolejność dla konkretnego elementu tj kanału PWM.
Tablicy dwuwymiarowej nie mogę segregować bo zmienne będą się zmieniać np za pomocą pilota OCR.
Chyba że mam utworzyć UNIE ?
Segregowanie rzucam do pętli głównej a w przerwaniu Compare Match wyłączam tylko kolejne kanały PWM (tak jak pisałeś).
Ponieważ temat stanął w miejscu podsumuję tylko że udało mi się osiągnąć rezultat.
Posiadam 32 kanały PWM sterowane przez ATMEGA32. Wykorzystałem, tak jak kolega wspomniał, przerwania TIMER2 overflow oraz compare match jak i również przerwanie zakończernia transmisji SPI. Mimo usilnych prób optymalizacji nie udało się zwiększyć odświeżania. Byłem zmuszony użyć prescalera 1024 co dało mi odświeżanie 42 Hz dla kwarcu 11MHz. Jednak nie sprawia to żadnego problemu.
Całe sortowanie i przygotowanie danych do wysłania przeniosłem do funkcji którą załączam po każdej zmianie wartości któregoś z kanałów. Przerwania tylko wysyłają gotowe pakiety - w każdym przerwaniu compare match pobieram gotowy unsigned long 32 bitowy.
Przy ustawieniu prescalera na 256 widać nachodzenie kolejnych przerwań i tym samym wadliwe działanie kanałów o zbliżonej wielkości, np. 120 i 122 (ten o wartości 120 powoduje zanik przerwania 122).
Pozdrawiam i dziękuję za pomoc! Gotowym projektem pochwalę się za kilka miesięcy Oby... ;P
To świetnie, że się udało. Przy okazji - skoro w tej tablicy dane masz posortowane, to po zmianie jakiejś wartości nie trzeba wykonywać całej, kosztownej funkcji sortującej - wystarczy proste przelecenie tablicy i porównanie wartości. Algorytmem opartym o bisekcję będziesz miał złożoność obliczeniową na poziomie log n, gdzie n jest wymiarem tablicy.
Musiałbym mieć przykład. Ja sprawdzam każdy kanał (0-31)i każdą wartość PWM (0-255) i robię sobie tablicę:
dane_SPI[idx]
gdzie idx jest kolejnym numerem przerwania. Jeśli kilka kanałów ma tą samą wartośc to idx jest mniejsze. Maksymalnie może być 31.
Niestety przy każdej zmianie tworze cały pakiet od nowa.
Dodano po 7 [minuty]:
A swoją drogą mam pytanie tmf:
Zainteresowały mnie diody RGB 3W. Chciałbym ze 3 szt podłączyć. Czyli zając 9 kanałów PWM. Jednak prądy widzę że są dość duże a na forum to różnie piszą.
Jak je podłączyć najrozsądniej?
Poprzez 74hc sterować 9 tranzystorami BC337, następnie oporniki (nie wiem jaka wartość?) i do diod RGB. Zasilacz do tego, pewnie z 1 A :/ ??
To zależy od konkretnych parametrów diody, zwykłe, białe diody 3-watowe, mogą pracować przy prądzie 1 A lub nawet większym, BC337 może nie podołać, lepiej by było zastosować jakiś tranzystor unipolarny. Można to zrobić na 74HC595 i sterować tranzystorami, ale nie przez PWM, bo wtedy trzeba tranzystorem sterować bezpośrednio z procesora, albo wyczarować jakiś skomplikowany kod, który pozwoli uzyskać niezależne sterowanie tym rejestrem tak, żeby na każdym pinie mieć sygnał o odpowiednim wypełnieniu, raczej nie warte zachodu.
Trzeba też pamiętać o prądzie na kanał (kolor) i dobrać tranzystor, który taki prąd może przełączać i o ewentualnym radiatorze, zależnie od tego, co w karcie katalogowej piszą.
Zastosuj MOSFETa, przy tak mizernym prądzie i zastosowaniu tranzystora logic level straty są pomijalne. W dodatku MOSFET na takie małe prądy będzie w mikroskopijnej obudowie.