Guten Abend,
ich möchte meinen Timer Vorladen.
ldi temp, 100
out TCNT0, temp
Doch er löst kein interrupt aus.
Ich habe nun gelesen, dass das ein spezieller Modus ist und ich dann
TCNT0 vergleichen muss doch wo und wie.
Ich finde keine Beispiele das in assembler zu realisieren.
Wenn es "Dein" Timer ist, muss Du doch wissen, wie man ihn vorladen
muss! Vielleicht per Gericht!
SCNR
Jetzt mal im Ernst: Um welchen Controller/Prozessor handelt es sich
denn? Soweit mir bekannt, gibt es verschiedene Typen. ;-)
Ziemlich wirr.
"CTC mode" meint vermutlich nicht den "Counter Timer Circuit" des Z80,
sondern den Modus "Clear Timer on Compare Match" des AVR.
Bei diesem jedoch muss man weder etwas "vorladen", noch braucht man
einen Interrupt.
Also ein Attiny2313
Ich habe Prescaler 256 und 16MHz Takt aus einem externen Quarz. Soweit
funktioniert das.
Und nun dachte ich, ich muss nur im Timerregister schummeln um ihn zu
beschleunigen aber das mag er nicht.
Durch Google fiel öfter was von CTC Mode doch alle Beispiele sind in C
geschrieben und mein Programm ist in Assembler.
Ich brauche eine genaue zeitliche Abstimmung des Timers die Prescaler
sind zu grob.
Gustav schrieb:> Ich brauche eine genaue zeitliche Abstimmung des Timers die Prescaler> sind zu grob.
Du sprichst in Rätseln. Timer heißt die ganze Einheit aus Prescaler,
Counter, Capture & Compare Einheiten etc.
Was du vermutlich brauchst, ist ein Interrupt in festem zeitlichem
Abstand. Und ja, den kann ein Timer erzeugen. In einem groben Raster per
Überlauf bei der "natürlichen" Zählgrenze. Oder in einem viel feineren
Raster per Compare-Interrupt und Benutzung des CTC-Modus. Der Zähler
zählt dann von 0 bis zum geladenen Vergleichswert im Compare-Register.
Bei Gleichheit springt er zurück auf 0 und löst einen Interrupt aus.
Dazu muß man den Timer auf den CTC-Modus konfigurieren, das Compare-
Register laden, Taktquelle und Vorteiler passend wählen. Und natürlich
den richtigen Interrupt aktivieren. Steht alles im Datenblatt.
Bastler schrieb:> ich möchte meinen Timer Vorladen.
Nein, das möchtest du in aller Regel NICHT wirklich. Das war in ferner
Vergangenheit mal ein WorkAround für Primitivst-Timer, um diesen
näherungsweise sowas wie einen CTC-Modus beizubiegen.
Praktisch alle Timer aller näherungsweise modernen µC können aber von
Hause aus einen CTC-Modus, so daß dieser WorkAround heute so gut wie
niemals mehr angewandt werden muss, auch wenn er noch in Dutzenden oder
vielleicht sogar Hunderten von Tutorials im Web als Quasi-Zombie aus
einer anderen Zeit rumgeistert...
Man schaltet also moderne Timer einfach in den CTC-Modus und stattet das
CTC-Register mit dem erforderlichen Wert aus und wartet dann auf den
Overflow. Das war's. Maximal cleared man zuvor noch das Zählerregister.
Das ist aber schon nur bei recht speziellen Anwendungen nötig. Für
solche Anwendungen kann man tatsächlich auch den alten Trick verwenden,
das ist dann in etwa gleichwertig Scheisse, denn beides sorgt
gleichermaßen dafür, daß der Timer nicht mehr zu 100% berechenbar ist,
weil dadurch Software-Latenzen Einfluß auf den Timer gewinnen.
> Doch er löst kein interrupt aus.
Das ist ein ganz anderes Thema. Ob und wann ein Timer unter welchen
Umständen welchen Interrupt auslöst, das steht an genau einer Stelle: im
zuständigen Datenblatt.
> Ich finde keine Beispiele das in assembler zu realisieren.
Nicht schlimm, nur ein deutliches Zeichen dafür, daß du dir ein anderes
Hobby suchen solltest. Programmieren jedenfalls ist offensichtlich
schlicht nicht dein Ding, denn dafür sind gundlegende Kompetenzen bei
der Benutzung von Suchmaschinen heutzutage zwingende Voraussetzung. Und
schon über diese verfügst du ganz offensichtlich nicht. Von der
eigentlichen Programmierkompetenz mal ganz zu schweigen...
c-hater schrieb:> Man schaltet also moderne Timer einfach in den CTC-Modus und stattet das> CTC-Register mit dem erforderlichen Wert aus und wartet dann auf den> Overflow.
U. U. bis zum Sankt-Nimmerleins-Tag. Beim AVR zumindest würde da
gewiss kein Overflow triggern …
> Von der> eigentlichen Programmierkompetenz mal ganz zu schweigen...
Kann halt nicht jeder alles haben.
Jörg W. schrieb:> U. U. bis zum Sankt-Nimmerleins-Tag. Beim AVR zumindest würde da> gewiss kein Overflow triggern …
Doch, natürlich: den Overflow bezüglich des CTC-Registers. Der aber beim
AVR natürlich nicht notwendigerweise per TOVx-Flag gemeldet wird.
Manchmal aber doch, z.B. in diversen Fast-PWM-Modi...
Deswegen ja auch mein expliziter Hinweis zum jeweils zuständigen
Datenblatt bezüglich der Interruptauslösung. Und natürlich meine
Vermeidung jeglicher Erwähnung eines konkreten IRQ-Bits...
> Kann halt nicht jeder alles haben.
Genau. Manche Leute können nicht mal verstehend lesen und sind irgendwie
trotzdem Forumsmoderatoren geworden. Da fragt man sich: mit welcher
Berechtigung eigentlich?
c-hater schrieb:>> U. U. bis zum Sankt-Nimmerleins-Tag. Beim AVR zumindest würde da>> gewiss kein Overflow triggern …>> Doch, natürlich: den Overflow bezüglich des CTC-Registers.
Ah ja.
Heißt eben nur nicht so (und ist auch keiner, denn da läuft nichts
über), aber irgendwie war mir klar, dass du dich rauswinden würdest.
Hauptsache, anderen Leuten Unfähigkeit unterstellen.
c-hater schrieb:> Genau. Manche Leute können nicht mal verstehend lesen und sind irgendwie> trotzdem Forumsmoderatoren geworden. Da fragt man sich: mit welcher> Berechtigung eigentlich?
Was ist denn Dir für eine Laus über die Leber gelaufen? Warum so
stinkig? Haben sie Dich mal als Mod abgelehnt?
Threadbeobachter schrieb:> Was ist denn Dir für eine Laus über die Leber gelaufen? Warum so> stinkig? Haben sie Dich mal als Mod abgelehnt?
Der ist betriebsmäßig so drauf. So ein Zeuch kann man nur ausblenden.
Gustav schrieb:> Mist, mein Fehler war vermutlich ein Stackoverflow weil ich ihn nur> einmal und nicht mach jedem reset initialisiert habe.
Dieser Satz ergibt keinen Sinn.
Erstens entsteht durch eine nicht regelmäßige Initialisierung kein
Stackoverflow.
Zweitens braucht man einen Timer nur einmal zu initialisieren.
Man kann der Hardware sagen, welchen Wert sie regelmäßig laden muss.
Die viel größere Frage ist auch, wie sieht denn die komplette
Initialisierung des Timers aus?
Oder gar das komplette Programm.
Gruß
Jobst
Gustav schrieb:> Mist, mein Fehler war vermutlich ein Stackoverflow weil ich ihn nur> einmal und nicht mach jedem reset initialisiert habe.
Das ist völliger Quatsch, es interessiert den Stack nicht die Bohne, ob
Du eine Funktion Milionen mal aufrufst.
Ein Stackoverflow kann nur auftreten bei zu großen lokalen Daten oder
bei zu vielen Rekursionen.
In Assembler kann er außerdem bei dem Programmierfehler auftreten, daß
Call/Return oder Push/Pop Sequenzen unausgeglichen sind.
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.