Salut,

haette gern eine Timerfunktion, der ich einen float-Wert uebergeben kann und die mir dann x Sekunden wartet, also universal fuer 0.0001 .. 65535 sec zu verwenden ist. Am PC schaff ich das auch problemlos, die Werte werden anscheinen einwandfrei gesetzt, nur am AVR gibts eine Endlosschleife...

Code folgt:
Code:
uint8_t prescalerValues[] = PRESCALER_VALUES;
uint8_t timerValues[] = TIMER_VALUES;

#define WAIT 1

uint8_t mode = 0;
uint8_t overflow = 0;

ISR ( _VECTOR(5) ) {

	TCCR2 = 0;

	if ( mode == WAIT ) overflow = 1;
	
}

void waitTime(float time) {

	mode = WAIT;

	uint8_t ctr;
	for (ctr = 0; ctr < 5; ctr++) {
	
		for (time; (uint8_t) time > 0; time--) {
		
			TCNT2 = 65535 - timerValues[ctr];
 			TCCR2 = prescalerValues[ctr];
 			while ( !overflow ) {}
			overflow = 0;
			TCCR2 = 0;
			
		}
		
		time *= 10;
	
	}
	
	mode = 0;

}
void initTimers() {

	TIMSK |= ( 1 << TOIE2 );
	sei();

}
Aufzurufen einfach im Sinne

initTimers();
wait(n.m);

PRESCALER_VALUES und TIMER_VALUES beschreiben die Ticks, die der Timer fuer einen bestimmten Prescaler ablaufen muss, um 1, 0.1, 0.01 etc sec zu brauchen; das wird dann (int) time mal wiederholt und auf die naechste Nachkommastelle weitergerueckt.
Frage ich TOV2 direkt ab, funktionierts uebrigens genauso wenig.

Gruss und Danke im Voraus,
David