Hio. Ich versuch mich gerade an den Timern. Allerdings gibt's da ein kleines Problem. Ich verwende den Timer0 (8-Bit) eines ATMega32. Mit dem Tool rnAvr hab ich den Wert für OCR0 ausrechnen lassen. Jetzt schon mal die erste Frage: Wie ist die Formel zum berechnen von OCR0? Bei 7372800Hz und 1000 Interrupts pro Sekunde bekomme ich für OCR0 141 (mit einem Vorteiler von 64). Ich generiere dann im Programm “Output Compare0 Interrupts”. Dann hab ich noch ne extra Methode zum schlafen, welche mit dem Timer zusammenarbeitet. Nur schläft mein Programm bei einer Einstellung von 1 Sekunde über 40 Sekunden! Warum? Schaut euch doch bitte den Code an und sagt mir was falsch ist. (Hinweis: Das ist nur ein kleiner Ausschnitt. Wenn ihr den Code mit einem Atmega testen wollt müsst ihr ggf. ein paar Header-Dateien einbinden.) Kann es vielleicht sein, dass OCR0 nicht richtig berechnet ist? Das wichtige hab ich mit // eingerahmt.
Danke!


Code:
uint8_t cmd;

volatile uint32_t countTimer0;
volatile uint32_t tmpCountTimer0;

SIGNAL(SIG_OUTPUT_COMPARE0)
{
	countTimer0++;
	tmpCountTimer0++;
}

inline void sleep_millisec(uint16_t milliseconds)
{
	//  tmpCountTimer0 wird in der ISR oben inkrementiert
	tmpCountTimer0 = 0;
	while(tmpCountTimer0 < milliseconds)
		asm volatile ("nop");		// Nichts tun
}


int main(void)
{
	// Initializes the timer Timer0: ////////////////////////////////////////////////////
	TCCR0 = (1<<WGM01) | (1<<CS01) | (1<<CS00);	// CTC und Prescaler 64
	OCR0 = 141;	// Mit rnAVR berechnet
	TIMSK |= (1<<OCIE0);	// Interrupt aktivieren
	////////////////////////////////////////////////////////////////////////////////
	
	//  Initialize USART and enable interrupts:
	usart_init();
	sei();
	
	// Mainloop:
	for(;;) {
		cmd = usart_recieveChar();
		
		switch(cmd) {
			case 's':	rncontrol_ledon(0);				// Diese Funktion aktiviert eine LED
						sleep_millisec(1000);
						rncontrol_ledoff(0);		// Diese Funktion deaktiviert eine LED
			case 'd':	rncontrol_ledon(0);
						sleep_millisec(2000);
						rncontrol_ledoff(0);
			case 'l':	rncontrol_ledon(0);
						sleep_millisec(15000);
						rncontrol_ledoff(0);
		}
	}
	
	
	return 0;
}

Gruß
Lutz