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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 1 cze 2025, o 22:01


    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: 121
    Pomógł: 12

    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: 121
    Pomógł: 12

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