Hallo
In der Hauptschleife auf die ISR zu warten ist nicht so optimal. Basierend auf dem Code von oben würde ich das etwa so angehen:
Code:
// Vier LEDs ansteuern mit Timer 0 21.3.2010 mic
#include <nibobee/iodefs.h>
#include <avr/interrupt.h>
volatile uint8_t p=0; // Auf diese Variable greift die ISR und das Programm zu!
int main(void)
{
TCCR0 = (1<<CS02) | (1<<CS00); // Normal Mode, kein OC0-Pin, prescaler /1024
TIMSK |= (1<<TOIE0); // Timer0 Overflow-Interrupt erlauben
DDRB |= 0x0f; // alle Leds sind Ausgang
PORTB &= ~0x0f; // und low
enable_interrupts();
while(1)
{
if(!p)
{
p=4*57; // alle 4 Sek. (atomar weil byte!)
PORTB ^= 0x0f; // alle LEDs umschalten
}
// nix zu tun
}
}
ISR(TIMER0_OVF_vect)
{
static uint8_t led0=0, led1=0, led2=0, led3=0;
if(led0) led0--; else { PORTB ^= 1; led0=57; } // eine Sek.
if(led1) led1--; else { PORTB ^= 2; led1=57/2; } // 1/2 Sek.
if(led2) led2--; else { PORTB ^= 4; led2=57/3; } // 1/3 Sek.
if(led3) led3--; else { PORTB ^= 8; led3=57/4; } // 1/4 Sek.
if(p) p--; // Usertimer :)
}
Das ist natürlich auch nur eine Möglichkeit von vielen...
Gruß
mic
Lesezeichen