La interrupción de desbordamiento del temporizador 0 no funciona en ATtiny10

Estoy tratando de usar la interrupción de desbordamiento Timer0 para hacer un pequeño proyecto. Utilicé un temporizador de este tipo en el ATtiny45 y funcionó, pero con el ATtiny10 no hubo resultado.

Así que probé un programa fácil de parpadeo de LED e incluso eso no funcionó.

Aquí está el código simple:

#define F_CPU 1000000UL  // 1 MHz

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

volatile uint16_t overflow_val=0;

ISR (TIMER0_OVF_vect){
  overflow_val++;
}

int main(void){
  DDRB = (1<<PB1);
  // Timer0 normal mode
  TCCR0A = 0x00;
  // Start timer with presc 1:1024
  TCCR0B = (1<<CS02) | (1<<CS00);
  TCNT0 = 0;
  TIMSK0 |= (1 << TOIE0);
  sei();

  for(;;){  
    if(overflow_val >= 1)
        {
            if(TCNT0 >= 145){
                PORTB ^= (1 << PB1);
                TCNT0 = 0;
                overflow_val = 0;
            }
        }
  }
  return 0;
}

Espero que alguien pueda ayudarme. ¡Gracias!

EDITAR1:

cambié de línea

TCCR0B = (1<<CS02) | (1<<CS00);  

alinear

TCCR0B = (1 << CS01);  // clk/8

en mi código para lograr un desbordamiento cada 0.524 segundos. Pero el LED no parpadea en absoluto.

EDIT2:

Aquí está el tamaño:

>avr-size test_attiny10_2.ino.elf
   text    data     bss     dec     hex filename
    138       0       2     140      8c test_attiny10_2.ino.elf

EDIT3:

Cambié mi declaración if en la principal de la siguiente manera:

int main(void){

  ...

  TCCR0B = (1 << CS01);

  ...

  for(;;){
    if(TCNT0 >= 0xFFFE)
        {
                PORTB ^= (1 << PB1);
                TCNT0 = 0;
        }
  }
  return 0;
}

¡Ahora mi LED está parpadeando todos los 0.524 segundos como debería!

Así que algo anda mal con mi variable volátil unit16_t overflow_val . No solo lo probé directamente en el hardware, sino que también hice una simulación con atmelstudio. Además, en la simulación, el programa nunca ingresa la declaración if si uso la variable overflow_val para alternar el LED.

EDITAR 4

Creo que algo no está bien con mi ISR ​​fkt. Probé el siguiente código y nunca encendí el LED.

#define F_CPU 1000000UL  // 1 MHz

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint8_t ovf_counter = 0;

void ioinit(void){
    // PB1->outputs
    DDRB = (1<<PB1);

    // Start timer with presc 1:64
    TCCR0B = (1<<CS01) | (1<<CS00);
    // Initialize counter Overflow at 0xFFFF
    TCNT0 = 0;

    // Enable global interrupts
    sei(); 
}

int main(void){
    ioinit();
    TIMSK0 |= (1<<TOIE0);
      while(1){        
        if(ovf_counter>=2){
          PORTB = (1<<PB1);
          ovf_counter=0;    
        }
      }
}

ISR(TIMER0_OVF_vect){
  ovf_counter++;
  TCNT0 = 0;
}

no sé lo que está mal

Si verifico en el bucle while (1) el estado del registro de contador TCNT0, funciona. Entonces, el contador se desborda como debería, pero nunca ingresa en un evento de desbordamiento de la función ISR (TIMER0_OVF_vect) .

Muy poca RAM para usar interrupciones en C. Publique lo que muestra avr-size en su elfo. Especialmente las secciones de datos y bss.
¿Está vinculando en el archivo de inicio crttn10.o?
¿Estás seguro de que esperaste lo suficiente? Parece que tardaría unos 67 segundos en desbordarse. google.com/…
No soy un tipo de AVR, pero sospecho que necesita habilitar interrupciones globalmente: avrfreaks.net/forum/tut-newbies-guide-avr-interrupts?page=all
@ScottSeidman la sei();llamada hace eso.
Agregué ahora el tamaño en mi comentario. Cambié mi prescaler. Uso sei() para habilitar globalmente las interrupciones. LED no funciona.
Vaya, me lo perdí. ¡Lo estaba buscando específicamente y no lo vi!
¿alguien tiene otra idea de por qué no funciona?

Respuestas (2)

Encontré mi error. Solía:

ISR(TIMER0_OVF_vect){. . .}

en lugar de

ISR(TIM0_OVF_vect){. . .}

¡Ahora funciona! En el desbordamiento del temporizador 0, se ejecutará la rutina de interrupción. Gracias por tu ayuda

Puede parecer similar, pero ATtiny45 Timer/Counter0 es de 8 bits (necesita contar hasta 256 + 1 para el desbordamiento), por lo que, por ejemplo, si espera una interrupción de desbordamiento cuando CLK = 1 MHz, el preescalador 1024 tardará aproximadamente 0,26 segundos.
ATtiny10 Timer/Counter0 es de 16 bits (cuenta hasta 65536). Para la misma configuración que la anterior (reloj de 1 MHz, preescalador 1024), da 256 veces 0,26 segundos = casi 67 segundos para desbordarse (como lo menciona bigjosh).

Hola, cambié ahora el prescaler para tener clk/8 con la línea TCCR0B = (1 << CS01); Entonces tendré un desbordamiento cada 0.524 segundos. Pero no puedo ver el LED parpadeando.