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:
Das ist natürlich auch nur eine Möglichkeit von vielen...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 :) }
Gruß
mic







Zitieren

Lesezeichen