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



Teraz jest 11 mar 2026, o 13:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 12 lut 2012, o 00:04 
Offline
Nowy

Dołączył(a): 29 sty 2012
Posty: 18
Pomógł: 0

Witam
Jako że to mój pierwszy post, przedstawię się. Nazywam się Dawid, jestem z Wrocławia. Aktualnie próbuje swych sił w programowaniu w języku C.

Mam pewien problem z obsługą PWM w Atmega8. Chciałem wykorzystać wszystkie 3 sprzętowe pwm. Napisałem taki kod:

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


No i nie działa to tak jak powinno. Diody na PB1(OC1A) i PB3(OC2) działają, zapalają się i gasną. A dioda na pinie PB2(OC1B) ciągle się świeci. Próbowałem inaczej ustawiać tryby i nic. Moglibyście mnie naprowadzić co nie tak napisałem w kodzie? Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2012, o 00:17 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Jaką częstotliwością taktujesz procka ? Fusebity ustawione poprawnie ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2012, o 00:43 
Offline
Nowy

Dołączył(a): 29 sty 2012
Posty: 18
Pomógł: 0

Taktowanie 8MHz z wbudowanego oscylatora. W fusebitach nic nie zmieniałem oprócz taktowania. W ksiązce napisane było by tylko taktowanie zmienić, więc tak zrobiłem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2012, o 01:21 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Ok powtarzasz błąd, który już był opisywany na forum zdaje się.

Po pierwsze w ogóle nie zajrzałeś do noty PDF do rejestrów Timera1 żeby:

1. wybrać tryb Fast PWM (Mode 5) - :idea: podpowiedź: bity WGM12 i WGM10 są w różnych rejestrach i dotyczą panie kochany Timera1 - a ty jakbyś próbował oddzielnie ustawiać jakiś Timer1A i Timer1B ... Zajrzyj do noty na rejestry TCCR1A i TCCR1B OK?

2. Jeden Timer1 obsługuje 2 PWM'y a załączasz je bitami COM1x0 i COM1x1 czyli dla kanału A i B

3. Tak samo preskaler ustawia się tylko raz dla całego timera1 za pomocą bitów CS1x ... Ale zajrzyj do noty PDF w jakim one znajdują się rejestrze. A ty sobie nie wiedzieć niestety na jakiej podstawie niefrasoblwie raz ustawiasz jakiś

Kod:
TCCR1A |= (1<<CS10);


a raz

Kod:
TCCR1B |= (1<<CS10);


Skąd taki pomysł ??? Widziałeś kiedyś w rejestrze TCCR1A bity CSxx ???

no przecież wystarczy otworzyć notę PDF dla ATmega8, wejść w rozdział:

16-bit Timer/Counter1

a potem jak zwykle zajrzeć do rejestrów w ostatnim podrozdziale:

16-bit Timer/Counter Register Description

i tam w kolejnych podrozdziałach masz przepięknie opisane po kolei rejestry wszystkie dla Timera1

to stamtąd musisz pozyskać informacje a nie wymyślać sobie na czuja ustawianie jakichś bitów.

toż zobacz co się stanie po takiej linicjce:

Kod:
TCCR1A |= (1<<CS10);


w rejestrze TCCR1A nie ma bitu CS10 no ale CS10 to stała dosłowna o wartości = 0 czyli wyjdzie:

Kod:
TCCR1A |= (1<<0);


a to spowoduje że ustawisz na wartość = 1 bit WGM10, bo to on jest w rejestrze TCCR1A na pozycji 0

mam nadzieję, że jak to poanalizujesz troszkę to sporo ci się rozjaśni ;)

Ale jak coś - to pytaj dalej.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2012, o 20:59 
Offline
Nowy

Dołączył(a): 29 sty 2012
Posty: 18
Pomógł: 0

Wszystko stało się jasne. Dziękuje bardzo za uwagę :) Następnym razem będę bardziej kierował się tym co napisane jest w dokumentacji, a nie swoją myślą "a może się uda" :)

To jeszcze chciałbym się jednego upewnić. Chodzi o programowy PWM. A dokładniej o 9 bitową rozdzielczość. Rozumiem więc że przykładowa zmienna do sterowania pwm o nazwie np pwm1 może otrzymywać wartości od 0 do 511 która będzie porównywana z licznikiem PWM?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2012, o 21:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

No tak skoro 9-bit to taki właśnie zakres 512 ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2012, o 10:09 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Hej.
Żeby nie zakładać nowego wątku podpinam się pod ten.
Bawię się w sprzętowe PWM (atmega 32). Z tego co rozumiem, dla OC0 jest pin PB3, dla OC2 jest PD7. Napisałem najprostszy program, gdzie ustawiłem szerokość impulsu OCR0=15 ->działa ok. Natomiast gdy chcę użyć OC2, dioda od PB3 świeci mi pełną jasnością (mimo, że ją zakomentowałem->dlaczego?), a nie świeci mi w ogóle dioda podłączona do pinu PD7.
Co robię nie tak? 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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2012, o 11:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Po pierwsze to jak można ustawiać kierunek dwóch różnych pinów należących do dwóch różnych portów poprzez jeden rejestr ???? hmmm???

DDRB |= (1<<PD7) | (1<<PB3);

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2012, o 11:56 
Offline
Użytkownik

Dołączył(a): 20 lut 2012
Posty: 28
Pomógł: 0

Faktycznie, ale głupotę zrobiłem. Nic dziwnego, że nie miało prawa działać :D
Już jest ok, dzięki wielkie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2014, o 22:07 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Dawid90 czy mógłbyś umieścić poprawiony kod na forum ?

pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2014, o 00:53 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Miałem chwile czasu , wklejam fragment kodu (reszta w książce) ustawienia Timera 2 dla Atmega 8 zewnętrzny kwarc 8 000 000

Kod:
// SPRZĘTOWY PWM - 1 KANAŁ OC2 (PB3) ATMEGA 8
      // ustawienie końcówki OC2 (PB3) sprzętowy PWM jako WYJŚCIE
      DDRB |= (1<<PB3);
      // ustawienia TIMER2 w Fast PWM
      TCCR2 |= (1<<WGM21)|(1<<WGM20);      // tryb Fast PWM
      TCCR2 |= (1<<COM21)|(1<<COM20);            // clear at TOP
      TCCR2 |= (0<<CS22)|(0<<CS21)|(1<<CS20);               // preskaler = 1

      OCR2=255;                     // wygaszenie diody w kanale PWM



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2014, o 06:19 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

cocaine2012 napisał(a):
TCCR2 |= (0<<CS22)|(0<<CS21)|(1<<CS20);               // preskaler = 1


kolego ta linia jest niestety bez sensu dlatego że takie operacje przesunięć bitowych

Cytuj:
(0<<CSx)


nie mają sensu - zastanów się .... zero po lewej stronie nie spowoduje ustawienie zera gdy wcześniej była tam jedynka. A to że w tym przypadku wydaje ci się że to działa - to TYLKO za sprawą tego - że po resecie procka wszystkie bity CS są = 0. W efekcie końcowym zadziała tylko to z tego twojego kodu:

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


i tak należy napisać żeby móc powiedzieć że ustawiasz preskaler = 1

teraz jaśniej ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2014, o 00:07 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Tak zgodzę się , wpisałem tak żeby łatwiej było mi zmieniać w programie preskaler na różne wartości .

Chce jeszcze odpalić Timer 1 kanał A i B ten program coś nie działa nie mogę wyłapać błędu .

Kod:
// SPRZĘTOWY PWM - 1 KANAŁ OC1B (PB2) 8 bit , ATMEGA 8  8 000 000

      // ustawienie końcówki OC1B (PB2) sprzętowy PWM jako WYJŚCIE
      DDRB |= (1<<PB1);
      // ustawienia TIMER1 w Fast PWM
      TCCR1A |= (0<<WGM11)|(1<<WGM10);      // tryb Fast PWM 8 bit
      TCCR1A |= (1<<COM1A1)|(0<<COM1A0);            // clear at TOP
      TCCR1A |= (0<<CS12)|(0<<CS11)|(1<<CS10);               // preskaler = 1

      OCR1A = 255 ;                  // wygaszenie diody w kanale PWM


Wydaje mi się że wg datasheet jest wszystko dobrze ustawione a dioda się tylko świeci stale .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2014, o 03:50 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

sprawdzałeś w nocie PDF w jakich rejestrach są te bity?

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


czy tak jak wielu początkującym wydaje ci się że kanał A to rejestr TCCR1A natomiast kanał B to TCCR1B ??? bo na tym wielu zjada zęby zamiast zajrzeć do noty

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 mar 2014, o 19:55 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Pytanie na pytanie , tak zajrzałem do noty (której niestety nie do końca rozumiem) i jak większość początkujących "nie chce zjeść na tym zębów" Myślałem że to tak działa TCCR1A , TCR1B zajrzałem jeszcze raz do noty . Nie wiem gdzie jest błąd , jakaś mała podpowiedź ? Gdzie szukać odpowiedzi ? Na której stronie ?

pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 mar 2014, o 22:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W nocie do Atmegi8 w rozdziale 16-bit Timer/Counter Register Description masz wszystkie rejestry dotyczące Timera1 i trybów jego pracy. Aby Timer1 pracował w trybie Fast Pwm z pwm-em na kanale A i B rejestry powinny być ustawione w ten sposób
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Porównaj sobie ustawienia timera z pdf-em to ci się trochę rozjaśni.
W twoim przykładzie ewidentnie pomieszałeś rejestry.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 mar 2014, o 23:10 
Offline
Użytkownik

Dołączył(a): 12 mar 2012
Posty: 38
Pomógł: 0

Teraz już rozumiem , patrząc w notę nie dostrzegłem że dla kanału A i B Timera 1 ustawienie preskalera to rejestr TCCR1B a ustawienie Compare output modes dla obu kanałow to TCCR1A a ja szukałem innych magicznych rzeczy w nocie ...



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: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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