Wybaczcie ze tak późno pisze ale służba nie drużba. Chociaż mówią że „robota nie Gołota, nie ucieknie”
Udało mi się uzyskać rezultat mimo to martwi mnie ilość pamięci potrzebnej na tą operację.
A więc po kolei:
1. Najpierw ustawiam PWM:
Zaloguj się, aby zobaczyć kod
2. A tu inicjalizacja SPI z podwojoną prędkością:
Zaloguj się, aby zobaczyć kod
3. A tu przerwanie w którym inicjujemy dodatkowy licznik dla celów PWM:
Zaloguj się, aby zobaczyć kod
4. Funkcja która wykonuje przesłanie 32 bitów do rejestrów 74hc..
Jak widać wysyłam dwie paczki które są dzielone dodatkowo na dwie mniejsze po 8 bitów. Próba wysyłania jednej zmiennej uint32_t kończyła się ciągle problemami oraz zaobserwowałem dużo większym wygenerowanym kodem. (Oczywiście zdaję sobie sprawę że paczka jest niepoukładana tzn bity mi się mieszają w stosunku do pinów ale to kwestia dopracowania wysyłki od starszego czy nowszego bitu oraz odpowiednich przesunięć– mi na tym nie zależy)
Zaloguj się, aby zobaczyć kod
5. No i pozostała nam pętla główna w której to realizuję całe PWM. RED GREEN BLUE są zadanymi szerokościami impulsu w formacie jednego bajta.
Zaloguj się, aby zobaczyć kod
Jedynie takim sposobem udało mi się zrealizować 32 kanały PWM poprzez 74hc... Tworząc wysyłkę SPI 32 bitową i dzieląc ją w funkcji po 8 bitów dla rejestru SPDR wiecznie kończyło się to niepowodzeniami – np. tylko 2 rejestry działały. Po podzieleniu na DANE_SPI i DANE_SPI2 każdy po 16 bitów wszystko zaczęło działać. Zaobserwowałem też mniejsze zużycie pamięci. Myślę że podzielę wysyłkę dla każdego rejestru z osobna czyli 4 razy 8 bitów. Tj SendSpi (rejestr1, rejestr2, rejest3, rejestr4)
Szkoda tylko że całość ostatecznie wylądowała w funkcji głównej. Pierwsze próby odbywały się w przerwaniu – tam gdzie licznik się zwiększa (licznik++) Ale KLAPA! Tworzyło to pewne przerwanie w przerwaniu i doprowadzało do zawieszenia. Twierdze że się zawieszał bo nie reagował pilot RC ale najprawdopodobniej to była kwestia zajętości procesora i tym samym brak możliwości obsłużenia pilota RC. Tu ważna była ilość kanałów PWM. 16 maksymalnie!!
To samo dotyczy warunków. 8 jeszcze w przerwaniu działa ale dodanie kolejnych... katastrofa! Za długo!
Wszystko odbywa się w pętli głównej no i tym samym warunki są sprawdzane wielokrotnie a wysyłka paczki SPI może się powtarzać (licznik pozostaje const a paczkę wysyłam kilkakrotnie.) Pozostało mi dodanie kolejnego warunku który będzie sprawdzał czy licznik się zmienił od ostatniego razu tak aby nie „męczyć” procesora PWM i ponawianiem wysłania tego samego bajtu(ów).
6. Zdziwiłem się że nie działa coś takiego ??:
Zaloguj się, aby zobaczyć kod
Kompilator mi na to nie pozwala generując warning a program po załadowaniu nie działa prawidłowo. Maksymalnie przesunięcia mogę dokonać do 16 bitów włącznie. Nie wiedziałem że to nie możliwe ?????
7. Zaproponujcie jakąś optymalizację. Staram się zbudować bardzo wiele zadań dla mojego procesorka i strata dobrych paru % pamięci mnie przeraża. Szczególnie ta ilość warunków IF (32 razy to samo) ;(
Jestem „świerzakiem” w temacie mikrokontrolerów więc dziękuję za wyrozumiałość
PS. Kolejny krok to zbudowanie MENU dla mojego LCD. Jak rozwiązać tą sprawę? Widząc wpływ warunków IF na pamięć procesorka widzę że będzie ciężko. Zewnętrzną pamięć dla menu ??
Kod umieszczamy w odpowiednich tagach (syntax) - poprawiłem.
Poza tym, kuleje interpunkcja - kropka to nie wszystko.
[zumek]