Ein Teil deiner Aufgabe erledigt folgender Code.
In timer.h werden Grundeinstellungen gemacht:
Interrupt-Rate und mit welcher Taktfrequenz gefahren wird.
timer.h:
In timer.c::init_timer1() wird Timer1 so initialisiert, daß er INTERRUPTS_PER_SECOND mal pro Sekunde einen Interrupt auslöst:Code:#ifndef _TIMER_H_ #define _TIMER_H_ #define XTAL_PHI 8000000 #define INTERRUPTS_PER_SECOND 10000 #define INTERRUPTS_PER_MILLISECOND (INTERRUPTS_PER_SECOND / 1000) extern void init_timer1 (void); #endif /* _TIMER_H_ */
Nach Aufruf von init_timer1() und sei() kannst du zB Zähler in der entsprechenden Interrupt-Routine erhöhen oder was dir sonst noch einfällt, und den in deiner main-loop abtesten/zurücksetzen, etc.Code:#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include "timer.h" void init_timer1() { /* tmr1 is counter */ TCCR1A = 0; #if defined (__AVR_AT90S2313__) // Timer1 running on full MCU clock // Clear on CompareMatch TCCR1B = _BV (CS10) | _BV (CTC1); #elif defined (__AVR_ATmega8__) // Mode #4 für Timer1 (Manual S. 97) // und full MCU clock TCCR1A = 0; TCCR1B = _BV (WGM12) | _BV (CS10); #else #error Dont know how to setup timer1 #endif // set PoutputCompare to get desired Timer1 frequency OCR1A = (unsigned short) ((uint32_t) XTAL_PHI / INTERRUPTS_PER_SECOND); // output compare interrupt for timer 1 timer_enable_int (_BV (OCIE1A)); }
Der Rest ist eigener Gehirnschmalz...Code:#include <inttypes.h> #include <avr/interrupt.h> #include <avr/signal.h> #include "timer.h" SIGNAL (SIG_OUTPUT_COMPARE1A) { ... }






Zitieren


Lesezeichen