Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 11 lut 2025, o 12:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 20 lip 2017, o 22:06 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 30
Pomógł: 0

Witam wszystkich!

Proste, krótkie pytanko ma do szanownych kolegów.
Proszę o wskazanie kierunku w którym muszę podążyć aby efektownie wysterować np. 16 programowych kanałów PWM.
Obecnie dla np. 3 diod, zgodnie z kodami Pana Mirka, wszystko chodzi pięknie. Problem pojawia się gdy chce wysterować 16 diod - niestety cały kod umieściłem w przerwaniu (wiem że tak nie można) i robiąc pseudo test z osobną migającą diodą widzę że po prostu zapycham pamięć tym przerwaniem.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pytanie brzmi jak zrobić to za pomocą flagi? Jeżeli by chodziło o X diod z zwykłym ON/OFF to mniej/wiecej wiedział bym jak to wykonać, ale niestety jeżeli chodzi o PWM to w ogóle nie mogę sobie wyobrazić 'IDEI' jak by mogło i jak by musiało to działać.

Zamiana taktowania na zewnętrzne, zmiany trybów timerów, żonglowanie ustawieniami rejestrów odnośnie przerwań - nie pomaga. Czasem podczas zmieniania ustawień widać efekt poprawy działania (jeżeli np. mam tylko 8 diod) - ale to i tak nie ma znaczenia gdyż nawet bez żadnego wywoływania PWM'a w pętli gównej, tylko jedna dioda led + powyższy kod i zezwolenie na przerwania, powoduje że dioda nie miga co sekundę tylko strasznie "szaleje" xD.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 07:04 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 30
Pomógł: 0

Dzięki za odpowiedź ale nurtują mnie inne pytania.

Dajmy na to że mam taktowanie procka 16 MHz, preskaler np. 1, OCR np. 100 -> czyli przerwania co 80kHz (0,0125ms), dla PWM daje licznik 1 bajtowy i wychodzi ponad 300Hz dla PWM'ma (aż nadto).

Ale gdybym chciał jeszcze dodać komunikację przez bluetooth, obsługę wyświetlacza + kilka innych rzeczy to czy ten kod nie będzie wykonywał się za wolno?

Kod PWM od miejsca A do B, inne kody od B do C. Jeżeli cały kod A-C wykona się w więcej niż 0,075 ms (6*0,0125), to uzyskam i tak PWM 300/6 = 50 (bo co z tego że w kodzie od B-C przerwanie mi sie wykona z 5 razy jak nic z diodami nie będę robił) -> czyli powoli w miarę jak kod będzie rósł to moje oczko będzie widzieć migotanie - TAK?, z tego wniosek że muszę się pilnować, przerwania i tak nie musza być wykonywane tak często bo o ile kod będzie długi, bo będzie to zbyteczne. (pytam czy dobrze myślę).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 07:18 
Offline
Użytkownik

Dołączył(a): 19 sty 2014
Posty: 83
Pomógł: 2

Może łatwiej byłoby przy pomocy PCA9685 który posiada 16 kanałów PWM, sterowany przez I2C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 07:23 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 30
Pomógł: 0

Używałem kiedyś TLC5940 - fajny scalak i nawet bardzo fajnie wszystko działało - no ale cenna.
Tylko kiedyś, gdzieś (chyba nawet tutaj na forum) widziałem jeden komentarz mówiący o tym że "bez problemu można wysterować kilkanaście diod za pomocą programowych PWM'ów bez używania dodatkowych scalaków" więc pomyślałem że spróbuję, a że jestem dociekliwy to nurtują mnie pytania odnośnie wydajności takich rozwiązań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 17:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Oto kawałek mojego programu - użyłem 64 bitowego programowego PWM do sterowania 22 diodami - taka ozdoba świąteczna - coś ala meteor na atmega8. Działa. Może Ci się przyda.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 21:28 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 30
Pomógł: 0

Dzięki wielkie!

Proszę tylko o wyjaśnienie kodu w warunkach if(i==0), if(i==63), bo nie do końca rozumiem czemu tak ustawiasz bity a nie np. zerujesz całość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 21:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Całość zeruję, gdy licznik dojdzie do końca (no i została jakaś zaszłość dla licznika równego 0). Ustawiam port, gdy wartość licznika jest taka, jaka ma jasno świecić dioda. Czyli wychodzi PWM.
Dla przykładu - jeśli dla diody 1 wartość jest 1, to ta dioda świeci przez resztę "cyklu PWM", jeśli jest 32 - świeci przez połowę cyklu. Czyli jak w sprzętowym PWM - licznik liczy od zera i przy pewnej wartości ustawia port, gdy dojdzie do końca port zeruje.

Sorki - odpowiedź trochę nie trafiona.
Część diod świeci stanem wysokim, część niskim - aby spełnić warunki elektryczne procesora - czyli po prostu - aby go nie upalić, gdy zaświecą wszystkie diody.
Wypisałem sobie, dla jakich wartości portów wszystkie diody świecą, ctr+C ctr+V - wkleiłem to tam gdzie potrzebowałem. Nie chciało mi się pisać ponownie ustawień portów, więc aby je zgasić - zanegowałem bitowo wartości dla świecenia.
A jest dla 63 i 0, bo coś gdzieś zmieniłem i zapomniałem tu poprawić. Nie jest to "wersja wystawowa" więc w kodzie mam kilka takich "baboli". Ale działa - co roku na święta mam trzy prawie jedno-metrowe sztuki za oknem :) Córcia jeszcze mi podsunęła kilka "efektów" - jest fajnie :)
I to na mojej ULUBIONEJ atmega8

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lip 2017, o 22:34 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 30
Pomógł: 0

Ok - wyjaśniło się xD, ja mam HC595 więc gdy i==0 to porostu zeruje wszystko. Jest tylko jedno ale: co np. 1.5/2/2.5 obiegu niektóre/wszystkie diody migną - niezależnie w którym etapie wypełnienia są - ale to prawdopodobnie wina mojego kodu i muszę jutro przeanalizować i dobrze obliczyć potrzebne rzeczy do przerwań.

Może komuś się przyda więc zamieszczam kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oraz filmik krótki:
https://youtu.be/DnKn8blRsQU



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2017, o 08:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1967
Lokalizacja: Lipsko
Pomógł: 125

A nie można by tej litanii w przerwaniach umieścić w pętli for od 0 do 15 ? :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO