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



Teraz jest 22 wrz 2024, o 06:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 10 cze 2023, o 23:57 
Offline
Użytkownik

Dołączył(a): 22 lip 2018
Posty: 31
Pomógł: 0

Witam.

Próbuję wyprowadzić sygnał taktowania na PB3 na zasadzie podzielenia F_CPU = 8MHz za pomocą OCR0 przez 1.
Problem polega na tym, że od wartości OCR0 = 150 w dół, częstotliwość nie daje się podzielić. tzn. na wyjściu pojawia się sygnał 32 kHz.
O co tu chodzi??

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2023, o 08:56 
Offline
Użytkownik

Dołączył(a): 09 lip 2019
Posty: 108
Pomógł: 11

W trybie Fast PWM wartość TOP w licznika timera w trybie który użyłeś (Tryb 3) to 0xFF (255), czyli dzielisz częstotliwość zawsze przez 256 - więc na wyjściu bedziesz miał - jeśli dobrze liczę 31250 Hz.
Użyłbym trybu timera 2 - CTC, gdzie wartość TOP jest ustawiana na zawartość rejestru OCR0.
Niemniej jednak używając tej techniki nie uzyskasz na wyjściu częstotliwości zegara - maksymalną częstotliwością będzie częstotliwość zegara podzielona na pół (czyli 4 MHz). Jeśli koniecznie chcesz 8MHz, to można też użyć głównego zegara w częstotliwości 16MHz

Z tego co pamiętam jedyną możliwością wypuszczenia częstotliwości głównego zegara procka jest użycie sposobu który już Ci opisywałem w tym poście:
topic24493.html
Ale biorąc pod uwagę, że w Twoim kodzie jest użyty rejestr OCR0 (a nie OCR0A), to zakładam, że masz jakiś starszy procek, który tego akurat nie wspiera (przy okazji zadawania pytania warto podać na jakim dokładnie procku pracujesz - może to co nieco ułatwić :-) )

W nowszych prockach jest też tryb Fast PWM liczony do OCR0A (tryb 7), ale ten też nie jest pewnie wspierany w Twoim procku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2023, o 22:37 
Offline
Użytkownik

Dołączył(a): 22 lip 2018
Posty: 31
Pomógł: 0

moscow napisał(a):
W trybie Fast PWM wartość TOP w licznika timera w trybie który użyłeś (Tryb 3) to 0xFF (255), czyli dzielisz częstotliwość zawsze przez 256 - więc na wyjściu bedziesz miał - jeśli dobrze liczę 31250 Hz.
Użyłbym trybu timera 2 - CTC, gdzie wartość TOP jest ustawiana na zawartość rejestru OCR0.
Niemniej jednak używając tej techniki nie uzyskasz na wyjściu częstotliwości zegara - maksymalną częstotliwością będzie częstotliwość zegara podzielona na pół (czyli 4 MHz). Jeśli koniecznie chcesz 8MHz, to można też użyć głównego zegara w częstotliwości 16MHz

Z tego co pamiętam jedyną możliwością wypuszczenia częstotliwości głównego zegara procka jest użycie sposobu który już Ci opisywałem w tym poście:
topic24493.html
Ale biorąc pod uwagę, że w Twoim kodzie jest użyty rejestr OCR0 (a nie OCR0A), to zakładam, że masz jakiś starszy procek, który tego akurat nie wspiera (przy okazji zadawania pytania warto podać na jakim dokładnie procku pracujesz - może to co nieco ułatwić :-) )

W nowszych prockach jest też tryb Fast PWM liczony do OCR0A (tryb 7), ale ten też nie jest pewnie wspierany w Twoim procku.


Używam AtMegi 32



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2023, o 09:54 
Offline
Użytkownik

Dołączył(a): 22 lip 2018
Posty: 31
Pomógł: 0

elektrykapradnietyka napisał(a):
Użyłbym trybu timera 2 - CTC, gdzie wartość TOP jest ustawiana na zawartość rejestru OCR0.


W jednym z ćwiczeń z książki p. Mirek użył trybu FAST PWM gdzie jasność diody była wysterowana przez rejestr OCR0 (wtedy projekt zadziałał mi normalnie tak jak należy, nie rozumiem jak, bo zgodnie z tym co napisałeś to nie miało prawa zadziałać, byc może o czymś nie wiem)

elektrykapradnietyka napisał(a):
Niemniej jednak używając tej techniki nie uzyskasz na wyjściu częstotliwości zegara - maksymalną częstotliwością będzie częstotliwość zegara podzielona na pół (czyli 4 MHz).
\

Czy jesteś mi w stanie powiedzieć dlaczego tak się dzieje??
Chciałbym to zrozumieć skąd się biorą te ograniczenia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2023, o 11:01 
Offline
Użytkownik

Dołączył(a): 09 lip 2019
Posty: 108
Pomógł: 11

elektrykapradnietyka napisał(a):
elektrykapradnietyka napisał(a):
Użyłbym trybu timera 2 - CTC, gdzie wartość TOP jest ustawiana na zawartość rejestru OCR0.


W jednym z ćwiczeń z książki p. Mirek użył trybu FAST PWM gdzie jasność diody była wysterowana przez rejestr OCR0 (wtedy projekt zadziałał mi normalnie tak jak należy, nie rozumiem jak, bo zgodnie z tym co napisałeś to nie miało prawa zadziałać, byc może o czymś nie wiem)

elektrykapradnietyka napisał(a):
Niemniej jednak używając tej techniki nie uzyskasz na wyjściu częstotliwości zegara - maksymalną częstotliwością będzie częstotliwość zegara podzielona na pół (czyli 4 MHz).
\

Czy jesteś mi w stanie powiedzieć dlaczego tak się dzieje??
Chciałbym to zrozumieć skąd się biorą te ograniczenia.


Jeśli chodzi o jasność diody, to jak najbardziej wszystko działa jak należy. W trybie FAST PWM masz stałą częstotliwość na wyjściu (jak zauważyłeś ok. 32kHz, dla ATmegi32 tylko taki tryb FAST PWM jest dostępny) i rejestrem OCR0 zmieniasz współczynnik wypełnienia sygnału prostokątnego (powiedzmy dla uproszczenia od 0% do 100%).
Tryb FAST PWM masz ładnie rozrysowany na stronie 75 (obrazek 32) dokumentacji.
Ale to jest inny problem niż ten który jak rozumiem chcesz rozwiązać.

W datasheecie ATmega32 na stronie 80tej masz rozpisane w tabelce 38 wszyzstkie rodzaje trybów działania Timera 0 (i Timera 1) w ATmedze32.
Tryb 3 - FAST PWM - liczy od 0x00 do 0xFF (255), więc wyjściowa częstotliwość masz definiowaną właściwie przez prescaller.
Tryb 2 - CTC - liczy od 0x00 do wartości w OCR0 - czyli możesz ustawić ten rejestr tak, żeby wyzwalanie (compare match) Timera odbywało się co cykl procesora.
Na stronie 81 masz następną tabelkę nr. 39 - rejetrów COM01/COM00. Jednym z trybów jest przełączanie wyjścia OC0 na wyzwoleniu Timera (Toggle OC0 on compare match)
Biorąc pod uwagę, że co jeden cykl zegara wyzwalany jest timer, a w każdym takim przypadku zmieniana jest wartość wyjściowa z 1 na 0 lub 0 na 1 - to dostajemy podzielenie częstotliwości przez 2 - bo np. w pierwszym wyzwoleniu zmieni się z 0 na 1, w wyzwoleniu drugim z 1 na 0, w wyzwoleniu trzecim znów z 0 na 1 itd (wyzwolenia wykonują się po pełnym cyklu zegara, czyli po pełnym przejściu z niskiego na wysoki i z wysokiego na niski)
:-)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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