surfer
01.02.2005, 09:03
Bin wieder auf ein neues "Problemchen" gestossen.
Ich hab mir eine Timer Routine geschrieben, bei der ich den Timer Initialisieren kann und danach die Zeit in ms angeben kann und eine Verzögerung mit der gewünschten Zeit bekomme. Ich habe fix meinen 4MHz Quarz eingestellt und den Prescaler 1024 gewählt. Nun habe ich das Problem, dass ich auf die ms etwa 1/2 ms abweichung habe. Das macht bei 10ms fast schon eine ganze ms aus.... und ich möchte irgendwann mal eine Uhr machen (jajaja, DCF77 wäre auch eine Möglichkeit). Aber ich will halt eine Timer-Routine, auf die ich immer wieder zurückgreifen kann....
Hier mal mein Code. Ich könnte mir denken, dass die Abweichung von den vielen Rechenbefehlen kommt. Gäbe es eine andere Möglichkeit das alles zu programmieren oder wäre es besser in Assembler ein paar Stellen zu schreiben? Danke
/************************************************** ************************************/
* Erstelldatum: 31.01.2005
* Programmname: timer-src.c
* Funktion: Timer-Routine für ms-genaue Zeitschleifen
************************************************** *************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
volatile float a,i,time;
SIGNAL(SIG_OVERFLOW1)
{
a=0;
}
void timer_init(void)
{
TIMSK=0x80;
TCCR1B=0x05;
}
void timer_set(void)
{
i=4000000/1024;
i=1/i;
i=time/i;
i=65536-i;
TCNT1=i;
}
void timer(float zeit_ms)
{
i=0;
a=1;
time=zeit_ms/1000;
timer_set();
sei();
while(a);
cli();
TCNT1=i;
return;
}
/*---------------------- Testprogramm ------------------------------------------------*/
int main(void)
{
DDRC=0xFF; // PORTC als Ausgang definieren
PORTC=0x00; // Alle LED's aus
timer_init(); // Timer initialisieren
while(1) // Endlosschleife
{
timer(10); // 10ms warten
PORTC=0xFF; // Alle LED's an
timer(10); // 10ms warten
PORTC=0x00; // Alle LED's aus
}
}
Ich hab mir eine Timer Routine geschrieben, bei der ich den Timer Initialisieren kann und danach die Zeit in ms angeben kann und eine Verzögerung mit der gewünschten Zeit bekomme. Ich habe fix meinen 4MHz Quarz eingestellt und den Prescaler 1024 gewählt. Nun habe ich das Problem, dass ich auf die ms etwa 1/2 ms abweichung habe. Das macht bei 10ms fast schon eine ganze ms aus.... und ich möchte irgendwann mal eine Uhr machen (jajaja, DCF77 wäre auch eine Möglichkeit). Aber ich will halt eine Timer-Routine, auf die ich immer wieder zurückgreifen kann....
Hier mal mein Code. Ich könnte mir denken, dass die Abweichung von den vielen Rechenbefehlen kommt. Gäbe es eine andere Möglichkeit das alles zu programmieren oder wäre es besser in Assembler ein paar Stellen zu schreiben? Danke
/************************************************** ************************************/
* Erstelldatum: 31.01.2005
* Programmname: timer-src.c
* Funktion: Timer-Routine für ms-genaue Zeitschleifen
************************************************** *************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
volatile float a,i,time;
SIGNAL(SIG_OVERFLOW1)
{
a=0;
}
void timer_init(void)
{
TIMSK=0x80;
TCCR1B=0x05;
}
void timer_set(void)
{
i=4000000/1024;
i=1/i;
i=time/i;
i=65536-i;
TCNT1=i;
}
void timer(float zeit_ms)
{
i=0;
a=1;
time=zeit_ms/1000;
timer_set();
sei();
while(a);
cli();
TCNT1=i;
return;
}
/*---------------------- Testprogramm ------------------------------------------------*/
int main(void)
{
DDRC=0xFF; // PORTC als Ausgang definieren
PORTC=0x00; // Alle LED's aus
timer_init(); // Timer initialisieren
while(1) // Endlosschleife
{
timer(10); // 10ms warten
PORTC=0xFF; // Alle LED's an
timer(10); // 10ms warten
PORTC=0x00; // Alle LED's aus
}
}