Forum: Mikrocontroller und Digitale Elektronik Timer im CTC mode Vorladen Assembler


von Bastler (Gast)


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.

von Horst V. (hoschti)


Lesenswert?

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.  ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Gustav (Gast)


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.

von Gustav (Gast)


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.

von Gustav (Gast)


Lesenswert?

Mist, mein Fehler war vermutlich ein Stackoverflow weil ich ihn nur 
einmal und nicht mach jedem reset  initialisiert habe.

von Axel S. (a-za-z0-9)


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.

von Peter D. (peda)


Lesenswert?

Bastler schrieb:
> Doch er löst kein interrupt aus.

Dann zeig den kompletten Code (als Dateianhang!), hellsehen können wir 
nämlich nicht.

von c-hater (Gast)


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...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von c-hater (Gast)


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Threadbeobachter (Gast)


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?

von Hinterlader (Gast)


Lesenswert?

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.

von Jobst M. (jobstens-de)


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

von Peter D. (peda)


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.

von Axel R. (Gast)


Lesenswert?

Wurde schon nach der Software gefragt?
Schick mal als Anhang und dann sehen wir da mal rein...

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.