2015-08-30 3 views
1

Я смотрел описание бит режима генерации формы волны в Atmega328 Datasheet. У меня есть два сомнения. 1. Что такое обновление OCRx (отмечено 1 на прилагаемом изображении). OCRx написан программистом. Это означает, что даже после написания, он обновляется только в TOP или Bottom в случае PWM-режимов? 2. В режиме CTC TCNT очищается от сравнения. MAX всегда 0xFF. Тогда как флаг TOV может генерировать MAX? Когда TCNT = OCRA, TCNT очищается правильно? Я отметил это как 2 на рисунке. enter image description hereФлаг переполнения в режиме CTC в AVR

Дополнительная информация для поддержки комментарий:

void timer0LEDBlinkTestCTCMode (void) 
{ 
    DDRB|=(1<<0);// // Set LED port as Output to toggle the LED. 
    DDRB|=(1<<1);// // Set LED port as Output to toggle the LED. 

    OCR0A = 0xff; 
    TIMSK0 |= (1<<OCIE0A)|(1 << TOIE0); // Output Compare Interrupt Enable for TimerCounter0 Compare Match A 
    TCCR0A |= 1<<(WGM01); // Mode = CTC: WGM01=1, WGM00=0 in TCCR0A and WGM02=0 in TCCR0B 
    sei();    // Enable global interrupt 

    // Timer is activated as soon as the clock source is selected 
    TCCR0B = (1<<CS02)|(1<<CS00); // Timer Prescaler Clock/1024, TCCR0B: CS00 - 1, CS01 - 0, CS02 - 1 

} 

//This is the ISR for Compare Mode A 

ISR(TIMER0_COMPA_vect) 
{ 
    sei();      // Enable the interrupt because both interrupts may occur simultaneously. 
    PORTB ^= 1<<0; 
} 


ISR (TIMER0_OVF_vect) // timer0 overflow interrupt 
{ 
    sei(); 
    PORTB^=1<<1; // Toggle the LED 
} 

ответ

2
  1. Correct. OCRx имеет двойную буферизацию, но буферизация отключена в обычном режиме и режиме CTC.
  2. TCNT не может достичь MAX (и, следовательно, TOV не может произойти), если OCRA не равно MAX.
+0

Спасибо. Прерывание переполнения Прекрасно работает, если я делаю OCRA = 0xff. Добавлен код в оригинальной публикации. PortB.1 переключается только в том случае, если OCRA = 0xff –