Forum: Compiler & IDEs Timer


von Tobias (Gast)


Lesenswert?

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.

von Stefan Hütter (Gast)


Lesenswert?

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!!

von Igor (Gast)


Lesenswert?

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.

von Igor (Gast)


Lesenswert?

Ah, Fehler:

"outp(0, TCNT1);" geht natürlich nicht, das muß an beiden Stellen 
heißen:

outp(0, TCNT1H);
outp(0, TCNT1L);

von Niki Hammler (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.