www.mikrocontroller.net

Forum: Compiler & IDEs Timer/Counter in C, AtMega16, STK500


Autor: Maloj (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Maloj (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Maloj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und wenn ich kein "delay.h" habe. Ich benutze IAR Systems und 
irgendwie kann ich da diesen "delay.h" nicht finden!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Maloj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE, mit dem NOP habe ich es realisiert!!!

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei IAR heißt die Funktion __delay_cycles(unsigned long int);

Michael

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.