Hi, kann mir wohl jemand erklären wie das mit dem Timer funktioniert ? Ich programmiere in C und möchte das z.B. jede Sekunde durch den Timer eine Funktion ausgeführt wird. So das in der anderen Zeit permanent ein Programm ausgeführt wird. Ich bekomme das nicht hin. Für Antworten binich sehr dankbar.
Hi, Meine Idee wäre: 8bit-Timer initialisieren auf CK/1024, seinen Wert auf null setzten, Owerflow Interupt enablen. Wenn interupt ausgelöst wird, eine globale Variable um eins erhöhen. Wenn die variable den wert 30 erreicht hat, ist ungefär 1 Sekunde vergangen( ca. 2 ms weniger) dann einfach deine routine ausführen, Variable löschen, das ganze von vorne. Ich hofe es hilft dir was. Wenn irgendwer meint es geht einfacher oder meine Idee nicht so gut findet, dann bitte posten!!
Einfacher und präziser geht's mit nem 16bit-Timer (8535 oder 8515 bei 8MHz): SIGNAL(SIG_OUTPUT_COMPARE1A) // wird jede Sekunde aufgerufen { // was halt alle Sekunde passieren soll outp(0, TCNT1); // Counter zurücksetzen nicht vergessen } int main(void) { outp(4, TCCR1B); // clock/256 outp(0x7a, OCR1AH); // Zähle bis... outp(0x12, OCR1AL); // 31250 (8000000/256) sbi(TIMSK, OCIE1A); // Output Compare Interrupt A einschalten outp(0, TCNT1); // Counter zurücksetzen } Ich hoffe ich habe nichts vergessen, ich hab das jetzt nur schnell mal zusammengeklopft.
Ah, Fehler: "outp(0, TCNT1);" geht natürlich nicht, das muß an beiden Stellen heißen: outp(0, TCNT1H); outp(0, TCNT1L);
Hallo! Für Timer1 könntest du es so machen: // Hier solltest du dein Intervall reinschreiben. Diese Daten gelten für 3111us bei 4Mhz wenn der Prescale Faktor auf 2 eingestellt ist outp(0xF9, TCNT1H); outp(0xED, TCNT1L); outp(2, TCCR1B); // Timer (1) starten SIGNAL(SIG_OVERFLOW1) { deine_zu_startende_funktion(); } Den Timer kannst du wieder abstellen mit: outp(0 , TCCR1B); Ich glaube aber das der Timer1 eher für kürzere (Präzesionszeiten) gedacht ist, sicher bin ich mir da aber nicht. Niki
Der Timer 0 ist für sehr kurze Zeiten schlechter geeignet da kein Auto-Reload möglich ist, wodurch Ungenauigkeiten entstehen. Beim Timer 1 kann man diese Problem dadurch umgehen dass man das Output Compare-Register verwendet. MfG Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.