Estoy siguiendo el tutorial sobre fanáticos de AVR en Timers escrito 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 hace parpadear un LED. Edité el código para encender y apagar todos los pines en PORTB pero mi código "funciona más lento", y los LED parecen 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;
}
}
}
¿Alguien puede explicar por qué sucede esto? También hay una mejor manera de encender/apagar los pines, esta es la única forma que se me ocurrió. Solo estoy ejecutando esto en un STK500 con un mega 16L.
A juzgar por su código, está haciendo lo siguiente:
Configurar temporizador.
Iniciar ciclo: ¿Está el temporizador en (o más de) un segundo? Sí: apaga los LED, restablece el temporizador No: enciende los LED. 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 lo 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 reinicia y los LED se invierten. Puede precargar PORTB con un valor, y cualquier LED que esté apagado se encenderá, y cualquiera que esté encendido se apagará.
toby jaffey
Decano
jon l
Decano