Sorry, hatte die Hälfte des Code vergessen
Anmerkungen stehen im Code
main.c
Code:#include <avr/io.h> #include <avr/interrupt.h> #include "timer.h" // ISR für Timer1-OutCompare1A-IRQ // Wird IRQS_PER_SECOND mal pro Sekunde aufgerufen SIGNAL (SIG_OUTPUT_COMPARE1A) { // count the number of IRQs, starting with 0. static uint8_t irq_num_10ms; // 10 Milli-Sekunden sind voll. if (++irq_num_10ms == IRQS_PER_10MS) { irq_num_10ms = 0; // Countdown-Timer erniedrigen job_timer_10ms (); } } // our entry point after RESET and initialization of globals int main (void) { // init Timer1 to make IRQs init_timer1(); // enable IRQs globally sei(); // main loop // Die main-Schleife realisiert einen Blinker: // Am Anfang jeder Stunde wird 1 Minute lang mit 1/2 Hz geblinkt. // main ist frei von Warteschleife(n)! :-) // LED_AN; und LED_AUS; sind NICHT definiert und nur zur Verdeutlichung while (1) { // in countdown_t (time.h) folgende Komponenten hinzufügen: // .min.stundenzaehler // macht Stunden // .sek.blinken // macht die gesamte blinkdauer // .ms10.blink_led // macht die Blinkfrequenz if (0 == count.min.stundenzaehler) { // Stundenzähler ist abgelaufen: // neu aufziehen // min.* wird im Minutentakt erniedrigt // und eine Stunde hat 60 Minuten // (Auflösung 1 Sekunde) count.min.stundenzaehler = 60; // Mach was... // blinken auf 1 Minute aufziehen // (Auflösung 10ms) count.sek.blinken = 60; } // Am Anfang jeder Stunde wird 1 Minute lang im Sekundentakt // (also mit 1/2 Hz) geblinkt if (count.sek.blinken) { // Es wird geblinkt // Falls blink_led abgelaufen ist: // wieder aufziehen auf 2 Sekunden (200*10ms) if (0 == count.ms10.blink_led) count.ms10.blink_led = 200; // Das eigentliche Blinken // 1. Sekunde --> LED ist an // 2. Sekunde --> LED ist aus if (count.ms10.blink_led <= 100) LED_AUS; else LED_AN; } else { // Falls die LED noch an ist LED_AUS; } } // main loop // we will never come here. No return needed (would be dead anyway). }
Lesezeichen