Hallo,
Ich weiß nicht so genau, ob ich Dein Problem richtig verstanden habe, aber ich habe verschiedene Zeiten und wait Funktionen gleichzeitig gebraucht, und habe eine einfache Lösung bei Butterfly Code gefunden und zwar wird als Basis der Timer 0 verwendet, der alle 10 ms überläuft.
Code:
#include "timer0.h"
#include <avr/io.h>
#include <avr/interrupt.h>
static uint8_t CountDownTimer[COUNTDOWNTIMERZAHL];
void Timer0Init(void) {
uint8_t a;
for (a=0;a<COUNTDOWNTIMERZAHL;a++)
CountDownTimer[a] = 255;
TCNT0 = 256-156; /*Ergibt Timing von 10 mS*/
TCCR0 = (1<<CS02)|(1<<CS00); /*Prescaller 1024*/
TIMSK |=(1<<TOIE0);
}
ISR (TIMER0_OVF_vect) {
TCNT0 = 256-156;
uint8_t a;
for (a=0;a<COUNTDOWNTIMERZAHL;a++) {
if (CountDownTimer[a] != 255 && CountDownTimer[a] != 0)
CountDownTimer[a]--;
}
}
uint8_t AllocateCountdownTimer(void) {
uint8_t a;
for (a=0;a<COUNTDOWNTIMERZAHL;a++) {
if(CountDownTimer[a]==255) {
CountDownTimer[a] = 0;
return a+1;
}
}
return 0;
}
void SetCountdownTimer(uint8_t timer, uint8_t value){
cli();
CountDownTimer[timer-1] = value;
sei();
}
uint8_t GetCountdownTimer(uint8_t timer){
uint8_t value;
cli();
value = CountDownTimer[timer-1];
sei();
return value;
}
void ReleaseCountdownTimer(uint8_t timer) {
cli();
CountDownTimer[timer-1] = 255;
sei();
}
und hier die passende Header Datei
Code:
#ifndef __TIMER0_H__
#define __TIMER0_H__
#include <avr/io.h>
#define COUNTDOWNTIMERZAHL 5
void Timer0Init(void);
uint8_t AllocateCountdownTimer(void);
uint8_t GetCountdownTimer(uint8_t timer);
void SetCountdownTimer(uint8_t timer, uint8_t value);
void ReleaseCountdownTimer(uint8_t timer);
#endif /*__TIMER0_H__*/
Eine kurze Erklärung:
Timer0Init() setzt den Timer in Gang und macht Platz für maximal COUNTDOWNTIMERZAHL Timer.
AllocateCountdownTimer() reserviert dann einen Timer und wird etwa so aufgerufen
Code:
uint8_t my_timer = AllocateCountdownTimer();
mit SetCountdownTimer(uint8_t timer, uint8_t value) kann man dann einen Timer mit einem Wert belegen.
Will ich z.B. einen Timer, der 200ms läuft macht man es so
Code:
SetCountdownTimer(my_timer,20); /*20*10mS ergibt 200 mS*/
man kann jetzt hin und wieder im Programm testen, ob der Timer schon abgelaufen ist
Code:
if (GetCountdownTimer(my_timer)) {
/*Tue was, die Zeit ist um*/
}
mit
Code:
ReleaseCountdownTimer(my_timer);
wird der Timer wieder gelöscht.
Gruß Sebastian
Lesezeichen