El temporizador AVR no funciona tan rápido al cambiar la cantidad de PIN que se activan / desactivan

3

Estoy siguiendo el tutorial sobre los fenómenos AVR en temporizadores escritos por @Dean Camera . Su código dice:

#include <avr/io.h> 

int main (void) 
{ 
   DDRB |= (1 << 0); // Set LED as output 

   // TODO: Set up timer at Fcpu/64 

   for (;;) 
   { 
      // Check timer value in if statement, true when count matches 1 second 
      if (TCNT1 >= 15624) 
      { 
         PORTB ^= (1 << 0); // Toggle the LED 

         TCNT1 = 0; // Reset timer value 
      } 
   } 
}

Esto destella un LED. Edité el código para activar y desactivar todos los pines en PORTB, pero mi código "se ejecuta más lento", con los LED que aparecen menos brillantes. Mi código:

#include <avr/io.h>

int main(){
    DDRB= 0xFF;

    TCCR1B |= (1<<CS10) | (1 << CS11);

    PORTB = 0xFF;
for (;;) {
    if(TCNT1 >= 15624){
        PORTB = 0x00;
        TCNT1 = 0;
    } else {
        PORTB = 0xFF;
    }
    }
}

¿Puede alguien explicar por qué sucede esto? También hay una mejor manera de activar / desactivar los pines, esta es la única forma en que podría pensar. Solo estoy ejecutando esto en un STK500 con un mega 16L.

    
pregunta Dean

1 respuesta

5

A juzgar por tu código, estás haciendo lo siguiente:

Configurar el temporizador.

Iniciar bucle:    ¿Está el temporizador a (o más de) un segundo?        Sí:            Apague los LEDs,            Reiniciar el temporizador        No:            Enciende los LEDs. Repetir bucle.

Esto significa que los LED están encendidos durante todo el conteo del temporizador, luego se apagan en 1 segundo. Luego se vuelven a encender inmediatamente porque el temporizador ya no es > = 1 segundo.

En el ejemplo original, PORTB ^= (1 << 0); // Toggle the LED enciende el LED si está apagado, o se apaga si está encendido. Lo que deberías estar haciendo es algo como:

for (;;) {
    if(TCNT1 >= 15624){
        PORTB = ~PORTB;
        TCNT1 = 0;
    }
}

(No he probado este código, pero la teoría es sólida)

Cada segundo que pasa el temporizador se restablece y los LED se invierten. Puede precargar el PORTB con un valor, y todos los LED que estén apagados se encenderán, y los que estén encendidos se apagarán.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas