Go Down

Topic: Impulsgenerator? (Read 521 times) previous topic - next topic

DrDiettrich

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?

MicroBahner

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.
Gruß, Franz-Peter

combie

Quote
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.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

MicroBahner

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.
Gruß, Franz-Peter

Doc_Arduino

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.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

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

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

DrDiettrich

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

Doc_Arduino

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.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

DrDiettrich

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.

Doc_Arduino

Hallo,

egal wie du an dem falschen Ansatz rumdokterst, es wird dadurch nicht richtiger.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

DrDiettrich

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 :-)

postmaster-ino

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

Doc_Arduino

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.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

DrDiettrich

Auf der Hand liegt lediglich, daß Du keine große Ahnung hast, wie man mit der Hardware eines Controllers umgehen kann und sollte. Bleib doch bei Deinen Interrupts und laß andere Leute andere Lösungen bevorzugen, statt sie völlig unqualifiziert anzupissen :-(

Doc_Arduino

#29
Dec 11, 2019, 07:25 pm Last Edit: Dec 11, 2019, 09:06 pm by Doc_Arduino
Hallo,

ich nehme die Tür.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up