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?
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
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?
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
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..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.