Ein Teil deiner Aufgabe erledigt folgender Code.
In timer.h werden Grundeinstellungen gemacht:
Interrupt-Rate und mit welcher Taktfrequenz gefahren wird.
timer.h:
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_ */
In timer.c::init_timer1() wird Timer1 so initialisiert, daß er INTERRUPTS_PER_SECOND mal pro Sekunde einen Interrupt auslöst:
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));
}
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/interrupt.h>
#include <avr/signal.h>
#include "timer.h"
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
...
}
Der Rest ist eigener Gehirnschmalz...
Lesezeichen