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

Wartość OCR2 dla przebiegu 10Hz w Atmega32 - czy poprawna?

midcoastt 24 Kwi 2020 11:40 678 3
REKLAMA
  • #1 18643058
    midcoastt
    Poziom 1  
    Przy użyciu timera2 i trybu CTC chciałem uzyskać przebieg prostokątny o częstotliwości 10Hz. Czy dobrze dobrałem wartość OCR2, aby uzyskać taką częstotliwość?


    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    volatile uint16_t i;
    int main(void)
    {
       DDRD |= (1<<PD7);
       PORTD |= (1<<PD7); 
       TCCR2= (1 << WGM21) | (1 << CS21) | (1 << CS22)| (1 << CS20); 
       OCR2 = 98;// 100000/1024 = 97,65625 
       TIMSK = (1 << OCIE2); 
       sei(); 
    
       while(1)
       {
          i++;
       }
    }
    ISR(TIMER2_OVF_vect) 
    {
       OCR2 = 98; 
       if(PORTD) PORTD <<=1;
       else PORTD = 1; 
    }
  • REKLAMA
  • #2 18643909
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 18643925
    midcoastt
    Poziom 1  
    emarcus napisał:
    midcoastt napisał:
    Przy użyciu timera2 i trybu CTC chciałem uzyskać przebieg prostokątny o częstotliwości 10Hz. Czy dobrze dobrałem wartość OCR2, aby uzyskać taką częstotliwość?



    Nie wygląda abyś to zrobił poprawnie i otrzymał spodziewany effekt.
    Po pierwsze:
    Jeżeli wyjście kierujesz na pin PD.7, który jest skojarzony z wyjściem Timera2 (OC2) nie ma potrzeby stosowania interruptu, w którego obsłudze zmienisz stan wyjścia(toggle). Timer to zrobi dla ciebie ustawiając odpowiednio bit COM20 (zgodnie z tabelą 51) w rejestrze TCCR2.
    Potrzeba stosowania interruptu wystąpi w przypadku gdybyś zechciał tą falę generować i wysłać na inny, dowolnie wybrany pin.
    Druga rzecz, to obliczenie wartości OCR2.
    Zauważ że generowana fala ma mieć częstotliwość 10 Hz, to okres jej wyniesie 100 ms i ponieważ tą falę praktycznie ‘składasz’ z półokresów poprzez funkcję ‘toggle’ to timer winien tą funkcję wykonywać co 50 ms. (czyli co pół okresu).
    Zatem, jeżeli taktowanie procesora F(clk) = 1 MHz, to masz dwie możliwości wyboru prescalera i ‘sparowanej’ do niego wartości OCR2.
    Prescaler = 256; OCR2=194; // (195.3 – 1) , oraz
    Prescaler = 1024; OCR2=48; // (48.8 – 1)
    Podobne wyniki otrzymasz podstawiając wartości do wzoru w datasheet str. 120
    W podsumowaniu:
    Cały program przyjmie ‘mocno skrócona’ formę, ograniczoną tylko do:
    - ustawienia portu PD.7 jako wyjście
    - określenia górnej wartości OCR2 dla Timera2.
    - konfiguracja Timera2, co możesz zrobić w jednej linii wpisując w jego rejestr TCCR2 gotową wartość (dec.) przygotowaną po wypełnieniu wszystkich bitów tabeli podanej w datasheet dla TCCR2 str. 125.
    Timer2 pozostanie w defaultowym trybie synchronicznym.
    Pętla główna programu pozostanie pusta.

    e marcus


    Czyli wartość OCR2 = 98 wykonywała częstotliwość 5Hz?
  • #4 18644318
    Konto nie istnieje
    Poziom 1  
REKLAMA