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


von Maloj (Gast)


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

von Karl H. (kbuchegg)


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?

von Maloj (Gast)


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

von Peter D. (peda)


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

von Maloj (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Maloj (Gast)


Lesenswert?

DANKE, mit dem NOP habe ich es realisiert!!!

von Michael W. (retikulum)


Lesenswert?

Bei IAR heißt die Funktion __delay_cycles(unsigned long int);

Michael

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.