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


Code:
/**************************************************************************************/
* 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
	}
}