Forum: Mikrocontroller und Digitale Elektronik Frage zur timer-programmierung


von fksystems (Gast)


Lesenswert?

Ich möchte einen timer programmieren (einmal at90s1200 und einmal
attiny11).

dieser soll bei überlauf mir einen interrupt aktiveren, in dem ich eine
prozedur liegen habe.

die sache ist so:
der timer fängt bei 0 an zu zählen und zählt bis 255.
jetzt habe ich einen timer, der von 0-255 zählt.

problem jetzt:
was aber ist, wenn ich einen timer will, der mir beispielsweise genau
alle 57 ticks durch überlauf einen interrupt aktiviert?

muß ich dann das timer-zähl register auf den wert 198 vorbelegen?
ist das richtig so?

aber was ist, wenn der timer jetzt übergelaufen ist? fängt er dann
nicht jedes mal wieder an, bei null loszuzählen?

heißt das dann, daß ich den timer nach jedem überfluß wieder auf
beispielsweise 198 vorbesetzen muß ?

wenn ja, wie realisiere ich das dann? wie sorge ich dafür, daß der
timer auch genau auf den wert 198 vorbelegt wird, wenn er überläuft,
und nicht mal, wenn er gerade, je nachdem wieviele befehle vorher
abgearbeitet wurden, schon gerade auf dem wert 3 oder 7 statt 0 steht?

weiß jemand, wie man sowas macht?

wie kann ich mit dem timer das auslösen von interrupts nach anderen
zeiten als nur genau nach "255 ticks" oder so erreichen?

von Frank Linde (Gast)


Lesenswert?

Bei den größeren AVR-Typen mit 16-Bit Timern gibt es erweiterte
Möglichkeiten, aber der 8-Bit-Timer funktioniert so. Die Zusammenhänge
hast Du korrekt verstanden.

Wann Du den Timerwert schreibst, hängt vom Anwendungsfall ab. Wenn es
um  gleichmäßige Zeitabstände geht (so habe ich Deine Frage
verstanden), dann solltest Du den Timerwert sofort am Beginn der ISR
neu setzen.

Kritisch wird es nur, wenn der Timer erneut überläuft, während die ISR
noch abgearbeitet wird - dann knallt es natürlich. Das spricht dann
aber für einen Fehler im Lösungsansatz für Deine Software.

Wenn Du ganz exakt arbeiten willst, solltest Du Dir auch noch den
Abschnitt "Interrupt response time" (oder so ähnlich) im Datenblatt
durchlesen.

Gruß, Frank

von fksystems (Gast)


Lesenswert?

hm.. was würde denn passieren, wenn der timer weiter erhöht wird, wärend
mein interrupt läuft? ist dann nur nicht mehr die zeit exakt oder führt
das dann zu datenverlust bei der programmausführung, weil der timer
register oder werte benutzt, die wärend der interrupt-ausführung für
was anderes benutzt werden?

sonst könnte ich das doch so machen:
interrupt wird ausgeführt, wenn timer überläuft.
der erste mögliche befehl im interrupt, den ich benutzen kann, setzt
mir den timer auf einen anderen wert als null.

in diesem wert werden bereits die verlorenen taktzyklen berücksichtigt,
die seit nullsetzen des timer bis hin zu diesem befehl vergangen sind.

geht das?
wenn die befehle im inhalt des interrupts bis zum ausführen des befehls
für die timer-setzung immer die selbe menge an takten verschlingen und
auch das aufrufen des interrupts immer die selbe menge an zyklen
verschlingt, müßte es doch gehen.

diese menge, wieviele zyklen da vergehen, steht bestimmt irgendwo in
irgendeinem datenblatt und mit dem avr-studio könnte ich es
herausfinden.

aber die frage ist:
werden vom null-setzen des timers an bis zur ausführung des interrupts
immer die selbe anzahl an zyklen vergehen oder köntne schon bis zur
ausführung des interrupts eine unterschiedliche anzahl an zyklen
vergehen?

von leo9 (Gast)


Lesenswert?

Wenn du nicht (seht tief) in die Trickkiste greifen willst ist es nicht
möglich eine konstante Zeit von Überlauf bis zur Exekutierung der
Zuweisung zu garantieren (der Trick arbeitet mit der Stromspar-Modi).
Die einfache Lösung ist: in der Int-Routine den Wert vom Timer nicht
vorsetzen, sondern einfach die 198 addieren. Dann ist es egal ob die
Routine bei Zählerstand 4, 5 oder sonstwas erreicht wird (zumindestens
solange, als die Addition nicht den Overflow auslöst, also 245 bei
prescaler 1 geht sicher schief).

güsse leo9

von fksystems (Gast)


Lesenswert?

hm.. und eine additions-anweisung benötigt immer einen takt? oder
benötigt die auch mal 2 takte? aber wenn sie mehr als einen takt
benötigt, braucht er doch immer die selbe menge an ticks, um die
addition durchzuführen oder?

..also nicht, daß er zu 4 die zahl 60 addieren will, und nach der
addition bereits hätte 65 oder 67 im registern stehen müssen, oder so
die hälfte des registers geschrieben wird und nur irgendein müll
rauskommt..

>stromsparmodus

genau den wollte ich zusätzlich benutzen können, um den controller die
leeren takte über in den stromsparmodus schicken zu können..

von Frank Linde (Gast)


Lesenswert?

Eine ADD- oder ADC-Anweisung benötigt immer die gleiche Anzahl
Taktzyklen.

Gruß, Frank

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.