Timer im CTC mode Vorladen Assembler

Gast #4789651
Lesenswert?
• ▲
▼
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.
Gast #4789661
Lesenswert?
• ▲
▼
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.
Gast #4789664
Lesenswert?
• ▲
▼
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.
#4789868
Lesenswert?
• ▲
▼
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.
Gast #4790302
Lesenswert?
• ▲
▼
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...
Moderator Persönliche Seite #4790349
Lesenswert?
• ▲
▼
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.
Gast #4790433
Lesenswert?
• ▲
▼
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?
Moderator Persönliche Seite #4790468
Lesenswert?
• ▲
▼
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.
Gast #4790483
Lesenswert?
• ▲
▼
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?
#4790723
Lesenswert?
• ▲
▼
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
#4790883
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren