Hi,
los gehts hier
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR
oder im Datenblatt des Controllers.
Bsp.:
Wenn du deinem Timer einen Prescaler von 256 spendierst, dann
inkrementiert er intern noch mit 16MHz/256.
Verwendest du einen 16 Bit Timer dann kann der 2^16 Inkremente
akkumulieren, bevor er dir einen Interrupt liefert (Überlauf).
Das entspricht einer Zeit T = 1/(16MHz/256/65536) = 1,048576s.
Wenn du mit einem kleinen Jitter leben kannst dann könntest du das als
1s werten :)
In der ISR wird nun einfach ein Zähler inkrementiert, nennen wir ihn
TimerCnt (volatile verwenden ...).
Deine Funktion macht in etwa folgendes:
void delay_minutes(unsigned int minutes)
{
reset_timer(); // startet timer neu in setzt TimerCnt = 0
unsigned int WaitCnt = 60 * minutes;
while(WaitCnt < TimeCnt);
}
Besser wäre es aber, in der Timer-ISR einfach ein Flag zu setzen, was
deiner Hauptschleife (in main) sagt, dass nun etwas bestimmtes zu tun
ist. So könntest du in der main immer noch andere Sachen hinzufügen, die
nebenher auch erledigt werden. Wenn du so etwas wie oben in ein Programm
einbaust, dann kann dein Controller im Nicht-ISR-Kontext nichts mehr
nebenher machen - das ist schlechter Programmierstil weil es dir den Weg
auf Erweiterungen verbaut.
Gruß,
Alex