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.
Mist, mein Fehler war vermutlich ein Stackoverflow weil ich ihn nur einmal und nicht mach jedem reset initialisiert habe.
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: > Doch er löst kein interrupt aus. Dann zeig den kompletten Code (als Dateianhang!), hellsehen können wir nämlich nicht.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.