Timer/Counter in C, AtMega16, STK500

Gast #1423347
Hallo Gemeinde,

ich habe folgendes Problem. Und zwar will ich delay(ms)Funktion haben 
weiss aber nicht wie ich es Anstellen soll. Kann mir jemand einen 
kompletten Code in C schicken/reinstellen. Ich habe schon Tausende Foren 
gelesen aber bin daraus nicht schlauer geworden! Habe STK500 und 
AtMega16.

Vielen Dank im Vorraus
#1423354
Maloj schrieb:
> Hallo Gemeinde,
>
> ich habe folgendes Problem. Und zwar will ich delay(ms)Funktion haben
> weiss aber nicht wie ich es Anstellen soll. Kann mir jemand einen
> kompletten Code in C schicken/reinstellen. Ich habe schon Tausende Foren
> gelesen aber bin daraus nicht schlauer geworden!

Und was an den Timern hast du nicht verstanden?

* Du konfigurierst dir einen Timer, so dass er dir einen Interrupt
  in bekannten Zeitabständen auslöst.

* In der Interruptroutine zählst du eine eigene Variable als Zähler
  hoch (oder runter je nachdem)

* Da du weißt, in welchen Zeitabständen die ISR aufgerufen wird,
  kannst du auch ausrechnen, wie weit diese Zählvariable zählen
  muss, damit eine bestimmte Zeit vergangen ist.
  (Im Grunde: Wenn du alle 3 Sekunden zählst, und ich danebenstehe
  und abwarte bis 2 Minuten 12 Sekunden vergangen sind, dann warte ich
  bis du bis 24 gezählt hast. Denn dazu brauchst du 24 * 3 = 72 Sekunden
  und das sind wiederrum die gewünschten 2 Minuten 12 Sekunden)

* In der Hauptschleife wird
  + ausgerechnet wie weit die Zählvariable zählen soll bzw.
    von welcher Zahl aus die Zählvariable auf 0 herunterzählen soll
  + abgewartet, bis die Zählvariable den gewünschten Wert
    erreicht hat


Bei welchem der Schritte hast du Schwierigkeiten?
Gast #1423371
Hi DANKE für die ausführliche Beschreibung. Ich bin ein Neunling in C. 
Ich verstehe schon alle Schritte die du aufzählst, kann aber die noch 
nicht  in C-Umsetzen. Diese Funktion brauche ich für einen LCD-Display!

Vielen Dank im Vorraus
#1423374
Maloj schrieb:
> ich habe folgendes Problem. Und zwar will ich delay(ms)Funktion haben

Ich würd da einfach mal im Includeverzeichnis in der "delay.h" stöbern, 
klingt schonmal nicht schlecht, oder?

Und siehe da, "void _delay_ms(double __ms)" scheints zu wuppen.


Timer nimmt man eher, wenn nicht an der Stelle gewartet werden soll oder 
keine Fehlerakkumulation auftreten darf (RTC).


Peter
#1424010
Dann sieht man in die Doku ob es etwas Gleichwertiges gibt.

Wenn auch das fehlschlägt, dann sieht man in der Doku nach, wie man 
einen NOP (=No operation) machen kann, die vom Compiler nicht 
wegoptimiert wird. Den benutzt man dann in einer Schleife um längere 
Wartezeiten zu erreichen.

Da man aber wahrscheinlich nicht der erste ist der das Problem hat, kann 
man natürlich auch den Weg gehen, erst mal google zu befragen. Zb mit 
dem Suchstring "IAR AVR delay" und die ersten 10 oder 20 Einträge 
durchforsten, ob sich was findet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.