2012-12-19 5 views
0

Этот фрагмент кода написан для Atmega8 взято из clapper circuit using Atmega8. Может ли кто-нибудь конвертировать этот фрагмент кода для Atmega16 с небольшим объяснением. Поскольку я пытаюсь реализовать то же самое для Atmega16 и иметь некоторые проблемы с частью таймера.Реализация кода таймера для Atmega8 в Atmega16

#define BURST_TIME 70 
#define READY_TIME 150 
#define TIME_OUT 300 

void timer_init() 
{ 
    TIFR |= (1<<TOV0);  
    //set interrupt on overflow 
    TIMSK |= (1<<TOIE0); 
    TCNT0 = 223; 
} 

ISR (TIMER0_OVF_vect) 
{  
    TCNT0 = 223; 
    timer++; 

    if (timer == BURST_TIME) 
    { 
     burst = 1; 
     ready = 0; 
    } else if (timer == READY_TIME) 
    { 
     burst = 0; 
     ready = 1; 
    } else if (timer == TIME_OUT) 
    { 
     timer = 0; 
     burst = 0; 
     ready = 0; 
     first = 0; 
     stop_timer(); 
    } 
} 

void start_timer() 
{ 
    TCCR0 |= (1<<CS02); 
} 

void stop_timer() 
{ 
    TCCR0 &= ~(1<<CS02); 
} 

ответ

2

Попробуйте использовать Atmel Листки для чипсов и сравнение Таймера регистров, вы найдете все, что вам нужно

Atmega8: http://www.atmel.com/images/doc2486.pdf Полезного: Регистрация Основной Страницы 280

ATMEGA16: http://www.atmel.com/Images/doc2466.pdf Полезно: Сводная информация о реестре Страница 331

Вы хотите использовать таймер 0, то есть 8-разрядный таймер (Страница 71 на Atmega16)

Теперь давайте попробуем проанализировать код немного

TIFR |= (1<<TOV0); // TIFR Thats the Timer/Counter0 Interrupt Flag Register 
        // TOV0: Timer/Counter0 Overflow Flag 
        // The bit TOV0 is set when an overflow occurs in Timer/Counter0. 
        // Datasheet page: 86 

TIMSK |= (1<<TOIE0); // Timer/Counter Interrupt Mask Register 
         // TOIE0: Timer/Counter0 Overflow Interrupt Enable 
         // When the TOIE0 bit is written to one, and the I-bit in the `status Register is set, the 
         // Timer/Counter0 Overflow interrupt is enabled 

TCNT0 = 223; // TCNT0: 0 to 255 or 0x00 to 0xFF 
      // with each clock it increases by 1 
      // when the register hits 255, a Timer-Overflow is triggerd (ISR...) 
      // The flag can be queried or used to trigger an interrupt. 
      // Datasheet Page 85 

TCCR0 |= (1<<CS02); // TCCR0: Timer/Counter Control Register 
        // CS02: Bit 2:0 – CS02:0: Clock Select 
        // This means that your running the Timer with a        
        // Prescaler of 256 (CPU frequency/256) 
        // This line starts the Timer! 
        // Datasheet Page: 85 

ISR (TIMER0_OVF_vect) // will be executed when a overflow is triggerd 
{ 
    // Do something 
    // Keep the execution time short in this section 
}