www.mikrocontroller.net

Forum: Compiler & IDEs Timer


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Hütter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, Fehler:

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

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

Autor: Niki Hammler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.