Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMega8 - [C] Częstotliwość fali prostokątnej na timer0

28 Sie 2012 16:36 1512 6
  • Poziom 8  
    Witam, mam problem z ustawieniem częstotliwości przebiegu wygenerowanego przy pomocy timer0. Chcę uzyskać falę o częstotliwości 36kHz (dla diody nadawczej IR). Moja ATMega8 jest taktowana zewnętrznym kwarcem 12MHz, fuse bity ustawione są tak: DE - low, D9 - high. Obliczyłem, że przy F_CPU równym np. 8MHz używając preskalera równego 1 powinienem uzyskać częstotliwość 31250Hz, bo 8000000Hz/256 (rozdzielczość pwm) = 31250Hz. Niestety w praktyce tak nie jest. Żeby to udowodnić użyłem preskalera równego 8. Otrzymałem przebieg o częstotliwości około 2Hz, a powinno być 3906,25Hz. Mogę jeszcze dodać, że nawet gdyby się okazało, że jednak procek chodzi na 1MHz to i tak zamiast 2Hz dioda migała by z częstotliwością równą 488,28125Hz (100000/256/8=488,28125). O co tutaj chodzi ? Proszę o pomoc.

    Jeszcze fragment kodu odpowiedzialny za ustawienie timera0 i przerwania:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 42  
    Przede wszystkim to zastanów się dlaczego do generowania nośnej usilnie chcesz pisać jakiś kod programu i obciążać tym program główny procesora, skoro można to zrobić CZYSTO sprzętowo za pomocą timera.

    Tylko nie Timera0 bo ATmega8 jest biedna w porównaniu do ATmegai88 gdyż timer0 nie posiada w niej trybu CTC.

    Tymczasem masz jeszcze timer2 i wystarczy że odpalisz go w trybie CTC, aktywujesz wyjście OC2 za pomocą bitów COM0x, obliczysz preskaler na 36kHz x2 - i masz sprzętowo pięknie generowaną nośną 36kHz, którą możesz dowolnie zatrzymywać lub startować - odpalając bądź zatrzymując timer bitami CS0x.

    Poczytaj sobie o trybie CTC. Uda ci się wygenerować dowolną nośną z tego zakresu sprzętową i nie potrzebujesz do tego celu nawet zewnętrznego kwarca bo i bez niego wszystko (pilot czy dekodowanie) będzie pięknie śmigać.
  • Poziom 8  
    Dzięki za rzeczowe i jasne wytłumaczenie. Wcześniej kombinowałem z timerem2 ale nie chciało mi wyjść i dioda świeciła się raz mocniej, raz słabiej w zależności od tego jak wiatr zawiał i nie wiedziałem czym to jest spowodowane. Przerobię układ, zaprogramuję i w razie czego napiszę jeszcze w tym topicu.
  • Poziom 8  
    Wczoraj zdążyłem przerobić układ i dopisałem w ATMedze taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ten program powinien teoretycznie generować falę 36kHz na wyjściu OC2 (PB3) ATMegi8. W rzeczywistości generuje coś innego, ale na szczęście coś generuje bo kiedyś nic nie działało. W ogóle to układ mam taki, że sygnał z wyjścia OC2 idzie przez rezystor 1k do baz dwóch tranzystorów pnp BC557. Z ich kolektorów sygnał idzie dalej przez rezystory 200R do dwóch diod IR (po jednej na tranzystor) i do masy. Brak potencjału na bazie otwiera tranzystor. No i w takiej konfiguracji diody się świecą na stałe (tzn. migają ale bardzo szybko i nie wiem z jaką częstotliwością). Postanowiłem sprawdzić co generuje wyjście, ustawiłem preskaler na 1024 a OCR2 na 255, po wgraniu programu zaobserwowałem lekkie pulsowanie (przygasanie) diod IR z częstotliwością kilku Hz. Potem ustawiałem obliczone i losowe wartości OCR2 na preskalerze równym 1 i sprawdzałem reakcję czujników SFH5110-36, ale bez efektu (czujniki testowane pilotem do TV). Mógłbym jeszcze zrobić tak, że po kolei będę kompilował program dla każdego ustawienia OCR2 (256 razy :)), ale czy to nie jest bez sensu ? Proszę o porady.
  • Pomocny post
    Poziom 42  
    Po pierwsze to staraj się przejrzyście pisać kod, bo sam się szybciej zakałapućkasz z takim stylem pisania jak wyżej:


    Kod: c
    Zaloguj się, aby zobaczyć kod


    to nie ma prawa nie działać - o ile oczywiście masz dobrze fusebity ustawione
  • Pomocny post
    Poziom 16  
    Tak przy okazji, to czemu upierasz się przy deklaracji F_CPU jako 8MHz, skoro pisałeś, że masz zewnętrzny kwarc 12MHz? To tak, nie działa, że wpisujesz sobie ile chcesz, a tyle masz. F_CPU to tylko deklaracja faktu, a nie życzenia.
  • Poziom 8  
    Hahaha działa! Wczoraj aku mi siadł w robocie i się nie mogłem o tym dowiedzieć, dzisiaj naładowałem, podłączyłem do programatora i sobie myślę: "no to testów ciąg dalszy..." a tu działa! Jedyne zmiany jakie wprowadziłem to F_CPU na 12MHz i OCR2 na 166. Ten kod który dzisiaj dałem to nie ten :). Dziękuję Wam za pomoc!