logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega32: Różnica częstotliwości na OC1B - oscyloskop pokazuje 63Hz zamiast 122Hz

squelch 13 Maj 2017 21:49 1179 23
REKLAMA
  • #1 16474397
    squelch
    Poziom 11  
    Witam podłączyłem oscyloskop do wyjścia OC1B i wgrałem do megi 32 taki kod
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na oscyloskopie pokazuje czestotliwosc 63Hz a zgodnie ze wzorem F_CPU/65536 wychodzi 8000000/65536=122Hz
    Dlaczego?
  • REKLAMA
  • Pomocny post
    #2 16474418
    excray
    Poziom 41  
    Ustawiłeś "toggle" dla pinu czyli: 8000000/65536/2 = 61Hz. Wszystko się zgadza.
  • #4 16474446
    excray
    Poziom 41  
    squelch napisał:
    pierwszy impuls będzie miał 800cykli preskalera a pozostałe impulsy już po 65536 tak dobrze myślę

    Dla wyjścia OC1B - tak. Dla wyjścia OC1A pierwszy impuls będzie po 65000 cyklach. Zmieniając te 2 wartości zmieniasz przesunięcie fazowe między przebiegami.
  • #5 16475532
    yokoon
    Poziom 29  
    excray napisał:
    Ustawiłeś "toggle" dla pinu czyli: 8000000/65536/2 = 61Hz. Wszystko się zgadza.


    A skąd się wzięła ta wartość 65536?
  • #6 16475534
    excray
    Poziom 41  
    A bo tyle stanów potrafi przyjąć licznik 16-bitowy. 2^16=65536.
  • REKLAMA
  • #7 16475556
    yokoon
    Poziom 29  
    excray napisał:
    A bo tyle stanów potrafi przyjąć licznik 16-bitowy. 2^16=65536.


    Tylko, że to w trybie overflow, natomiast tu są rejestry OCRx więc to chyba tryb CTC.
  • REKLAMA
  • #8 16475558
    excray
    Poziom 41  
    yokoon napisał:
    Tylko, że to w trybie overflow, natomiast tu są rejestry OCRx więc to chyba tryb CTC.

    Chyba jednak nie. To bity WGM określają w jakim trybie pracuje licznik, a nie fakt użycia, bądź nie użycia rejestrów OCR.
  • REKLAMA
  • #9 16475568
    yokoon
    Poziom 29  
    excray napisał:
    yokoon napisał:
    Tylko, że to w trybie overflow, natomiast tu są rejestry OCRx więc to chyba tryb CTC.

    Chyba jednak nie. To bity WGM określają w jakim trybie pracuje licznik, a nie fakt użycia, bądź nie użycia rejestrów OCR.


    To w takim razie gdzie się podział prescaler 256?
  • #10 16475576
    excray
    Poziom 41  
    yokoon napisał:
    To w takim razie gdzie się podział prescaler 256?

    Przecież w kodzie wyraźnie jest napisane:
    TCCR1B|=_BV(CS10);
    czyli bez preskalera lub jak kto woli preskaler 1. Nie sugeruj się komentarzami.
  • #11 16475585
    yokoon
    Poziom 29  
    Chyba masz rację, sugerowałem się komentarzami.Autor postu chyba sam nie wie o co mu chodzi. W C ja stosuję inne zapisy bez _BV.
  • #12 16475599
    excray
    Poziom 41  
    yokoon napisał:
    W C ja stosuję inne zapisy bez _BV.

    Ja też. I nie rozumiem tej polityki z _BV. Jak dla mnie łatwiej jest zapisać 1<<7 niż _BV(7). Zresztą, całe to przesuwanie bitów w AVR to pomyłka.
  • Pomocny post
    #14 16475799
    yokoon
    Poziom 29  
    squelch napisał:
    na początku miałem 256 a potem zmieniłem na 1, i komentarza niezmieniłem


    Kolego post swój tytułujesz Tryb Normal mode to po co używasz rejestry OCRx?
  • #15 16475811
    excray
    Poziom 41  
    Przecież w Normal Mode też można używać rejestrów OCRx. Na przykład do generowania 2 przebiegów 50% przesuniętych względem siebie o dowolną fazę regulowaną właśnie przez OCRx.
  • Pomocny post
    #16 16475824
    yokoon
    Poziom 29  
    excray napisał:
    Przecież w Normal Mode też można używać rejestrów OCRx. Na przykład do generowania 2 przebiegów 50% przesuniętych względem siebie o dowolną fazę regulowaną właśnie przez OCRx.


    Czy w Atmega8 i Timer0 też można?
  • #17 16475835
    excray
    Poziom 41  
    W każdym. Tylko trzeba pamiętać, że aktualizacja OCR w tym trybie jest natychmiastowa więc zmiany w czasie działania mogą powodować paskudny jitter.
  • Pomocny post
    #18 16475858
    yokoon
    Poziom 29  
    excray napisał:
    W każdym. Tylko trzeba pamiętać, że aktualizacja OCR w tym trybie jest natychmiastowa więc zmiany w czasie działania mogą powodować paskudny jitter.


    No to nie wiedziałem, nie spotkałem nigdy takiego zastosowania w Atmega8 i Timer0.
    Uważałem, że może pracować tylko w trybie overflow.
  • #20 16475885
    excray
    Poziom 41  
    Bo pracuje w trybie overflow. Ale jak spojrzysz do DSa to też możesz ustawić różnie zachowania nóżek dla tego trybu przy porównaniu:
    Atmega32: Różnica częstotliwości na OC1B - oscyloskop pokazuje 63Hz zamiast 122Hz
    Oczywiście fakt porównania nie wpływa na licznik TCNT w tym trybie. On liczy sobie dalej aż do przepełnienia i tak od nowa w kółko.
  • Pomocny post
    #21 16476378
    landy13
    Poziom 31  
    excray napisał:
    Bo pracuje w trybie overflow. Ale jak spojrzysz do DSa to też możesz ustawić różnie zachowania nóżek dla tego trybu przy porównaniu:
    Atmega32: Różnica częstotliwości na OC1B - oscyloskop pokazuje 63Hz zamiast 122Hz
    Oczywiście fakt porównania nie wpływa na licznik TCNT w tym trybie. On liczy sobie dalej aż do przepełnienia i tak od nowa w kółko.
    Pokazujesz tabelkę dla Timera1. Pokaż taką dla Timera0, bo o to pytają koledzy wyżej.
  • Pomocny post
    #22 16476398
    excray
    Poziom 41  
    landy13 napisał:
    Pokazujesz tabelkę dla Timera1. Pokaż taką dla Timera0, bo o to pytają koledzy wyżej.

    A myślisz, że ona się czymś więcej różni, niż jedną cyferką w nazwie bitów?
  • Pomocny post
    #23 16476433
    landy13
    Poziom 31  
    Różni się tym, że nie istnieje.
  • Pomocny post
    #24 16476475
    excray
    Poziom 41  
    EDIT> Dopiero teraz zauważyłem, że dyskusja w trakcie zmieniła się z atmegi32 na atmegę8. Atmega8 nie ma pinu OCR0, a co za tym idzie nie ma też bitów precyzujących zachowanie tego nieistniejącego wyjścia.
REKLAMA