Impulsgenerator?

Mit dem richtigen Timer mode spielt die Hardware den Ton doch ganz von alleine ab, ohne ISR.

Hallo,

ja okay, wenn er OCR1A in dessen ISR aktualisiert passt das, Entschuldigung.
Beim Rest muss der TO einfach nochmal seinen Code lesen.
Ich würde ja der Einfachheit vorschlagen immer eine bool Variable negieren und diese am Pin ausgeben.

DrDiettrich:
Mit dem richtigen Timer mode spielt die Hardware den Ton doch ganz von alleine ab, ohne ISR.

Würde ich pauschal immer dafür plädieren. Wenn keine anderen Gründe vorliegen irgendeinen Mode mit OCRxn Buffer.

DrDiettrich:
Mit dem richtigen Timer mode spielt die Hardware den Ton doch ganz von alleine ab, ohne ISR.

Die ISR braucht er immer, um die Frequenz verändern zu können ( setzen von OCR1A ). Wie ich auch schon schrieb, kann er das Toggeln des Ausgangs der HW überlassen. Der Timer-Mode bleibt dabei aber derselbe (er will ja eine variable Frequenz, und kein PWM ), er muss nur den Ausgang entsprechend aktivieren ( in TCCR1A ). Allerdings ist er dann auf einen festen Pin ( hier 9 ) festgelegt. Macht er es per SW kann er den Pin selbst frei bestimmen.

Aber jetzt schau'n wer mal, was der TO zu dem Ganzen sagt :wink: .

Mehr als einen Pin braucht man ja selten mit der gleichen Frequenz. Zum Ändern der Frequenz ist IMO kein ISR notwendig, die Zugriffe erfolgen bei 16 Bit Zählern synchronisiert.

Hallo,

da muss ich nochmal einhaken. Man kann einen Frequenzgenerator ohne ISR inkl. Pulsweitenänderung bauen.
Hier in dem Fall müßte man nur die Pulsweite konstant auf 50% halten.
Das funktioniert zum Bsp. alles im Phase Correct Mode einwandfrei, weil die Compare Register gepuffert sind.
Dadurch kann man gefahrlos jederzeit die Einstellung ändern.
Ob das sich hier im Falle lohnt ist eine andere Frage. Möchte nur sagen es ginge auch ohne ISR. :wink:
Nach nochmaliger aktueller Überlegung würde ich an Stelle vom TO jedoch bei CTC bleiben.
Dann muss man sich nicht um die Pulsweitenanpassung kümmern. :slight_smile:

DrDiettrich:
Mehr als einen Pin braucht man ja selten mit der gleichen Frequenz. Zum Ändern der Frequenz ist IMO kein ISR notwendig, die Zugriffe erfolgen bei 16 Bit Zählern synchronisiert.

:o :o :o In Modi ohne gepufferte Compare Register macht der Timer Mist wenn du zufällig zur falschen Zeit den Comparewert änderst. Der Wert wird sofort übernommen. Wenn der TCNT zu dem Zeitpunkt schon drüber ist läuft der Timer kurzzeitig falsch. Deswegen ändert man hier im Fall CTC den Compare in der eigenen Compare ISR, da kann nichts schief gehen.

Oder man löscht TCNT nach der Änderung des OCRx.

Hallo,

DrDiettrich:
Oder man löscht TCNT nach der Änderung des OCRx.

ich habe lange überlegt wie du das meinen könntest, komme jedoch immer zu der Überzeugung das die Aussage keinen Sinn macht. Egal welcher Timermode.

a) ich habe eine Konstellation nicht auf dem Schirm (kann was übersehen haben)
b) ich denke du hast dich gedanklich verrannt (passiert mir auch manchmal)

Du müßtest jetzt dazu sagen in welchen Mode du wann den OCR ändern und TCNT nullen möchtest. ?
Dazu vielleicht noch ohne ISR? Ich sehe wie gesagt keine Möglichkeiten.

Dann schauen wir uns doch mal die allgemeine Timer Funktion an. Dazu schlagen jetzt alle das 16-bit Timer/Counter Block Diagram im 328er Datenblatt auf, bei mir Bild 16-1. Haben das alle gefunden?

Dort finden wir das Timer-Counter-Register TCNT, 2-3 Output Compare Register OCR und ein Input Compare Register ICR. Im Betrieb läuft TCNT von BOTTOM (0) bis TOP und wird dann zurückgesetzt oder wieder heruntergezählt. TOP gibt also die Frequenz vor und kann eine Konstante sein oder in ICR oder OCRA (CTC mode) vorgegeben werden. Wer Angst hat, daß eine zu lange Pause vorkommt weil TCNT höher ist als das neue TOP, kann nach dem Setzen von TOP den TCNT auf 0 löschen.

Wenn man das einmal begriffen hat, ist der Rest (PWM...) auch nicht mehr schwer zu verstehen.

Noch Fragen?

DrDiettrich:
Wer Angst hat, daß eine zu lange Pause vorkommt weil TCNT höher ist als das neue TOP, kann nach dem Setzen von TOP den TCNT auf 0 löschen.

Es kommt immer darauf an, wie exakt ich es beim Übergang der Frequenzen haben will. Auch das Rücksetzen führt dazu, dass ich eine Periode bekomme, die weder der alten, noch der neuen Frequenz entspricht.
Sauber geht es nur über die ISR, oder - wie schon angesprochen - über einen PWM mode, bei dem TOP durch OCR1A mit double buffering definiert wird. Um bei einem 50% PWM-Verhältnis zu bleiben, müssen dann aber immer beide OCR-Register parallel verändert werden. Da das aber nicht wirklich gleichzeitig möglich ist, können auch da race-Bedingungen auftreten.

Ob das alles im konkreten Anwendungsfall stört, ist eine andere Frage. Warten wir doch einfach mal was Kay dazu sagt.

Um bei einem 50% PWM-Verhältnis zu bleiben,

Wie kommst du auf die Idee, dass ein Tacho ein 50% Verhältnis sehen möchte

Zumindest der Threadtitel spricht eindeutig von Pulsen.
Und das ist auch das, wie ich Tachos kenne

Ich, für meinen Teil, habe mich entschieden nicht an der Lösungsfindung teilzunehmen, bis das Thema geklärt ist.

Da ist was dran. Ich hatte mich an dem Sketch im Ausgangspost orientiert - da wird ein Signal mit 50% Tastverhältnis erzeugt. Bei Impulsen gleicher Länge, aber unterschiedlicher Wiederholfrequenz sieht das alles wieder anders aus.
Ist wohl wirklich am besten wir warten mal ab was Kay sagt.

DrDiettrich:
Noch Fragen?

Hallo,
du hast meine Frage noch nicht beantwortet.
Zu welchen Zeitpunkt möchtest du TCNT nullen?
Woher weißt du (ohne ISR ?) das du es 'jetzt' tun mußt?
Von welchen Mode redest du in dem du das machen möchtest?
Der Anspruch ist saubere Frequenzen zu erzeugen und nicht irgendwas was danach aussieht.

Wegen den 50% Tastverhältnis. Ich glaube in seinem letzten Thread dazu wollte er nur verschiedene Frequenzen erzeugen.

Wegen den 50% Tastverhältnis. Ich glaube in seinem letzten Thread dazu wollte er nur verschiedene Frequenzen erzeugen.

Was er will, ist eine Sache.
Was er muss, evtl. eine andere.

Doc_Arduino:
du hast meine Frage noch nicht beantwortet.

Ich hab's versucht, aber Deine weiteren Fragen deuten an, daß Du mich nicht verstehst oder verstehen möchtest.

Der Anspruch ist saubere Frequenzen zu erzeugen und nicht irgendwas was danach aussieht.

Wo steht das? "eine Art Frequenzgenerator" läßt für mich jede Menge Optionen offen.

Hallo,

nach dem Auftritt in #15 habe ich mehr erwartet.

Frequenzgeneratoren kann man auf verschiedenen Wegen programmieren. Nur gehört deine nicht dazu.

Im CTC Mode kann man in der Compare ISR fehlerfrei den Comparewert ändern. TCNT wird automatisch genullt.

Mit deiner Methode ohne ISR änderst du ohne jede Kontrolle zu beliebigen Zeiten den Comparewert, du weist nicht wo der TCNT gerade steht. Dann kannste das TCNT nullen auch sein lassen. Die Chancen stehen 50 zu 50 das TCNT vorm manuellen Nullen näher an 0 oder näher am Überlauf ist. Egal was du machst, du erzeugst beim Frequenz ändern falsche Pulse.

Warum soll man das falsch machen wenn es richtig machbar ist?

Wenn du das für dich machst ist das dein Problem.
Wenn du das im Forum als Lösung darstellst interveniere ich.

Man muß den TCNT nicht zwangsläufig nullen, nur wenn er höher ist als das neue TOP. Dann kann man ihn auch auf einen Wert knapp unterhalb von TOP setzen, was einen sanften Übergang ergibt.

Hallo,

egal wie du an dem falschen Ansatz rumdokterst, es wird dadurch nicht richtiger.

Man kann TCNT sogar exakt auf den Wert setzen, mit dem das laufende Intervall mit der alten Dauer beendet wird. Damit sind Interrupts hier - wie so oft - nicht notwendig. Trotzdem danke für die Hilfestellung :slight_smile:

Hi

Da ich aber 'in diesem Moment' gar keine Ahnung habe, wo der Counter steht, ist's noch gar nicht klar, ob ich 'JETZT' einen Impuls brauche.
Da wäre Es IMHO besser, den Nächsten regulären Impuls abzuwarten (die alte Frequenz), um dann auf die Neue umzuschalten.
Wenn ich mittendrin egal was manipuliere, passt der Impuls weder zur alten, noch zur neuen Vorgabe - Jitter?

MfG

Hallo,

egal was du dir ausdenkst, es wird nur immer peinlicher für dich. Wenn du deine Theorien praktisch zu Ende denken würdest könntest du es verstehen. Dafür müßtest du jedoch von deinem Pferd runter. Du fummelst nachwievor ohne jeden Kontrollmechanismus zu einem x-beliebigen Zeitpunkt am TCNT rum. Die negativen Folgen für die Timerperiode liegen auf der Hand.