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



Teraz jest 28 mar 2024, o 22:08


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 25 wrz 2018, o 20:56 
Offline
Nowy

Dołączył(a): 15 maja 2017
Posty: 13
Pomógł: 0

Witam.
Mam problem z napisaniem programu do obsługi 3 diodami led.
Procesor to Attiny13.
Podłączenie:
PB0- KANAŁ1 (LED1)
PB1 -KANAŁ2 (LED2)
PB2- KANAŁ3 (LED3)
PB3- PRZYCISK(ZMI)
PB4- PRZYCISK (ZMII)
Częstotliwość: ok 5kHz. (9.6MHz + preskaler 8)
PWM z rozdzielczością 0-240.
Zasada działania:
1.Przy włączeniu wszystkie diody led wyłączone.
2.
I.)Jeśli przycisk ZMI(PB3)=0 oraz ZMII(PB4)=1 to:
A.)KANAŁ1(LED1) załącza się poprzez PWM 0-240 przez czas 120sekund.
B.)Jeśli LED1=240 to świeci ciągle przez czas 160 sekund.
C.)LED1 płynnie wyłącza się 240-0 przez 120sekund i od razu startuje program od pkt."A".

II.) Jeśli przycisk ZMI(PB3)=1 oraz ZMII(PB4)=1 to:
A.)KANAŁ1(LED1) załącza się poprzez PWM 0-240 przez czas 120sekund.
B.)Jeśli LED1=240 to świeci ciągle przez czas 120 sekund.
C.)LED1 wyłącza się płynnie 240-0 przez czas 120 sekund.
D.)KANAŁ2(LED2) załącza się poprzez PWM 0-240 przez czas 120sekund.
E.)Jeśli LED2=240 to świeci ciągle przez czas 120 sekund.
F.)LED2 wyłącza się płynnie 240-0 przez czas 120sekund i startuje program od pkt."A"

III.) Jeśli przycisk ZMI(PB3)=1 oraz ZMII(PB4)=0 to:
A.)KANAŁ1(LED1) załącza się poprzez PWM 0-240 przez czas 120sekund.
B.)Jeśli LED1=240 to świeci ciągle przez czas 90 sekund.
C.)LED1 wyłącza się płynnie 240-0 przez czas 120sekund.
D.)KANAŁ2(LED2) załącza się poprzez PWM 0-240 przez czas 120sekund.
E.)Jeśli LED2=240 to świeci ciągle przez czas 90 sekund.
F.)LED2 wyłącza się płynnie 240-0 przez czas 120 sekund.
G.)KANAŁ3(LED3) załącza się poprzez PWM 0-240 przez czas 120sekund.
H.)Jeśli LED3=240 to świeci ciągle przez czas 90 sekund.
I.)LED3 wyłącza się płynnie 240-0 przez czas 120sekund i startuje program od pkt."A"


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



Ostatnio edytowano 5 paź 2018, o 12:04 przez bobuss88, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2018, o 21:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Tak zapytam z ciekawości: jak chcesz uzyskać 3 sprzętowe kanały PWM skoro attiny13(V/A) posiadają tylko 2 sprzętowe PWM-y?

------------------------ [ Dodano po: 11 minutach ]

Dodatkowo próbujesz ustawić tryb licznika nr 5 czyli tryb Phase correct ze zliczaniem do wartości OCRA więc tak naprawdę masz w takiej konfiguracji tylko jeden kanał PWM bo w tym wypadku OCRA steruje okresem i rozdzielczością PWM a OCRB steruje wypełnieniem kanału B.

------------------------ [ Dodano po: 16 minutach ]

Pominę już fakt że np bit WGM02 znajduje się nie w rejestrze TCCROA a w rejestrze TCCROB, więc tak na prawdę ustawiasz tryb 1 czyli Phase Correct ze zliczaniem do maxa więc tu finalnie było by ok.

Tak czy inaczej na tiny13 nie uzyskasz 3 sprzętowych kanałów PWM.

------------------------ [ Dodano po: 30 minutach ]

Tak patrząc na ten Twój kod mam wrażenie że nie do końca wiesz jak działają te sprzętowe PWM-y bo każdy kanał próbujesz regulować rejestrem OCRA. A faktycznie jest tak że rejestr OCRA steruje kanałem pierwszym, OCRB steruje kanałem drugim, kanałem trzecim nie posterujesz bo go nima.
Ewentualnie możesz spróbować to zrobić na programowym PWM-ie...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2018, o 22:28 
Offline
Nowy

Dołączył(a): 15 maja 2017
Posty: 13
Pomógł: 0

Dla 2 led wykorzystałem OCRA I OCRB ale nie wiem jak sie zabrać za programowy pwm dla 3 kanałów. Tutaj program z obsługi 2 led.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 wrz 2018, o 19:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Widzisz, ja wskazuje Ci błędy a Ty nadal je powtarzasz. Tryb PWM nr. 5 nie wysteruje Ci 2 kanałów PWM bo rejestr OCR0A jest w tym trybie używany nie do regulacji wypełnienia ale czasu trwania okresu i rozdzielczości samego PWM-a. Zapewne mimo to Ci to działa bo bit WGM02 próbujesz ustawić w rejestrze TCCR0A, a faktycznie znajduje się on w rejestrze TCCR0B. Bit WGM02 jest bitem nr 3 w rejestrze B i na twoje szczęście w rejestrze A pod numerem 3 jest bit nie wykorzystany więc tak na prawdę ustawiasz tryb PWM nr 1 czyli PWM Phase Correct z licznikiem zliczającym do wartości 0xFF, i w tym trybie funkcjonalne są oba kanały.

Co do programowych kanałów PWM to można to zrobić na przerwaniu od licznika. Powołujesz do życia 4 zmienne z dopiskiem Volatile, pierwsza zmienna może być typu static i będzie to nasz licznik programowy który będzie co każde przerwanie zwiększana o 1.
Pozostałe 3 zmienne będą odpowiednikami rejestrów OCR0A i OCR0B - czyli zmienne przechowujące wartości poszczególnych kanałów PWM. W przerwaniu po inkrementacji licznika wstawiasz 3 warunki porównujące zmienną licznika programowego ze zmiennymi PWM i jeśli zmienna większa od licznika to ustaw "1" na pinie, jeśli mniejsza to ustaw "0" na pinie (lub odwrotnie jeśli chcesz mieć odwrócony stan). Powyższe będzie odpowiednikiem trybu FastPWM (jeśli zależy ci na trybie Phase Correct to musisz sobie dorobić warunek zmieniający cyklicznie kierunek zliczania licznika i odpowiednio dostosować warunki porównujące licznik ze zmiennymi PWM).
Musisz jeszcze dobrać częstotliwość z jaką wywoływane będzie przerwanie, tak by odstępy pomiędzy wywoływaniami przerwania były większe niż sam czas wykonywania przerwania bo inaczej wszystko będzie się przycinać.
Całość masz bardzo dobrze opisane przez Mirka w książce "Mikrokontrolery AVR Język C - podstawy programowania" potocznej zwanej BB


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2018, o 18:54 
Offline
Nowy

Dołączył(a): 15 maja 2017
Posty: 13
Pomógł: 0

znalazł by się ktoś kto by odpłatnie wykonał ten program? proszę na priv.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 21:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Tak analizując Twoje założenia, i kod który wrzuciłeś to jedno z drugim się nie pokrywa. W założeniach masz że najpierw dioda się rozjaśnia przez pewien czas, później świeci z PWM=240 przez pewien czas następnie gaśnie; natomiast w kodzie masz jeszcze ściemnianie przez pewien czas do 0 :shock:
I teraz tak, tu masz kod - przerobiony który wrzuciłeś i dostosowany do założeń:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeśli jednak chcesz mieć to ściemnianie to kod będzie wyglądał tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam nadzieję że chociaż przeanalizujesz dogłębnie ten kod...


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 11:13 
Offline
Nowy

Dołączył(a): 15 maja 2017
Posty: 13
Pomógł: 0

Bardzo dziękuję za kod do programu.
Tak w wszystkich opcjach led ma się płynnie rozjaśnić, następnie ciągle świecić a potem płynnie się wyłączyć.
Poprawiłem w pierwszym poście założenia programu.

Jutro sprawdze kod oraz przeanalizuję pracę działania.
Wstępnie nasuwa mi się pytanie. W jaki sposob jest przypisane pwm1 do pb0, pwm2 do pb1 oraz pwm3 do pb2?
Mam jeszcze pytanie odnośnie attiny85. Czy on posiada tylko 2pwm czy 3pwm? Nie do końca jest dla mnie zrozumiała notka katalogowa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2018, o 16:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Cytuj:
Wstępnie nasuwa mi się pytanie. W jaki sposob jest przypisane pwm1 do pb0, pwm2 do pb1 oraz pwm3 do pb2?
Na samym dole w procedurze obsługi przerwania masz warunki które w zależności od wartości zmiennych PWM1...3 oraz licznika zmieniają stan na odpowiadających im pinach.
Cytuj:
Mam jeszcze pytanie odnośnie attiny85. Czy on posiada tylko 2pwm czy 3pwm? Nie do końca jest dla mnie zrozumiała notka katalogowa.
Jak na moje oko ma 4 kanały PWM, choć na stronie microchipa w tabelce specyfikacji jest "5PWM" :shock:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2018, o 22:23 
Offline
Nowy

Dołączył(a): 15 maja 2017
Posty: 13
Pomógł: 0

Dziękuję bardzo. Program działa zgodnie z opisem. Program jest zrozumiały.



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 5 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