Пришлось снова поднимать старую тему...
Не работает асинхронный таймер на Atmega8535.
Фьюзы запрограммированы так:
CKOPT=0, CKSEL=F, SUT=2.
Основной кварц - 16МГц.
Часовой кварц припаян на соответствующие ножки мк без конденсаторов.
Код
#pragma vector=TIMER2_OVF_vect
__interrupt void TIMER2_OVF_ISR()
{
PORTD ^= (1 << GREEN);
}
void Initialise()
{
delay_ms(1000);
// Timer2 initialisation with a second external clock (32,768kHz) driving it
// Set Timer/Counter2 to be asynchronous from the CPU clock
ASSR |= (1 << AS2);
TCNT2 = 0x00;
TCCR2 = 0x05; //(1 << CS22) | (0 << CS21) | (1 << CS20); // prescale the timer to be clock source/128 to make it
// exactly 1 second for every overflow to occur
//while(ASSR & ((1 << TCR2UB) | (1 << TCN2UB))); // Wait until TCNT2, TCCR2B is updated
TIFR |= (1 << TOV2); // Clear TC2 interrupt flag
TIMSK |= (1 << TOIE2); // set 8-bit Timer/Counter2 Overflow Interrupt Enable
MCUCR = (1 << SE); // Idle по команде __sleep()
__enable_interrupt(); // allow all enabled interrupts
}
void main()
{
Initialise(); // set up I/O registers, flags & variables
for(;;)
{
//Idle. Спать до следующего прерывания
__sleep();
}
}
Если раскоментировать строчку while(ASSR & ... , то программа остается в этом цикле навсегда.
Без этой строчки программа работает, но не запускается прерывание таймера2.
Эрраты на Atmega8535 нет. Какие будут соображения?