Forum: Mikrocontroller und Digitale Elektronik Compare Latches


von Del (Gast)


Angehängte Dateien:

Lesenswert?

kann mir jmd auf hochdeutsch erklären, was diese compare latches machen? 
Suche nach einer Möglichkeit,das die Eigenschaft eines Timer (z.B. Wert 
von CCR0) zu einem bestimmten Zeitpunkt zu ändernh. Ich weiß nicht, ob 
dass das Gesuchte ist.

von Del (Gast)


Lesenswert?

Del schrieb:
> kann mir jmd auf hochdeutsch erklären, was diese compare latches
> machen?
> Suche nach einer Möglichkeit,das die Eigenschaft eines Timer (z.B. Wert
> von CCR0) zu einem bestimmten Zeitpunkt zu ändernh. Ich weiß nicht, ob
> dass das Gesuchte ist.

hat jedmand eine Ahnung

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


Lesenswert?

Del schrieb:
> kann mir jmd auf hochdeutsch erklären, was diese compare latches machen?
> Suche nach einer Möglichkeit,das die Eigenschaft eines Timer (z.B. Wert
> von CCR0) zu einem bestimmten Zeitpunkt zu ändernh. Ich weiß nicht, ob
> dass das Gesuchte ist.

Ist es nicht. Die Compare Register der Timer sind gepuffert. Die Puffer 
heißen Compare Latch. Und die von dir eingekreisten Bits bestimmen, wann 
der geschriebene Wert vom Latch ins Register übertragen wird. Falls dir 
"Compare" nichts sagen sollte - RTFM!

Wenn du ernsthaft Hilfe erwartest, dann beschreibe genau was du tun 
willst. Irgendwelche Timereinstellungen zu einem genauen Zeitpunkt 
ändern zu wollen, ist seltenst eine gute Lösung.

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> Wenn du ernsthaft Hilfe erwartest, dann beschreibe genau was du tun
> willst. Irgendwelche Timereinstellungen zu einem genauen Zeitpunkt
> ändern zu wollen, ist seltenst eine gute Lösung.

zur Erzeugung eines PWM Signals mit variabler Frequenz. D.h., dass ich 
nach jeder Periode sowohl die Frequenz als auch Pulsbreite ändere, indem 
ich in der ISR eines zweiten Timers eine entsprechende Variable ändere. 
Die Wechselzeit des zweiten Timers sollte dabei natürlich schneller sein 
als die Frequenz, dass das eign Signal erzeugt. Wenn ich aber jz die 
Frequenz über die Variable auf eine kleinere Frequenz einstelle, kann 
das zum Überlauf führen.

von Peter D. (peda)


Lesenswert?

Das Latch hat den Sinn, daß der neue Comparewert erst beim Nulldurchgang 
gültig wird.
Wird ohne Latch ein kleinerer Comparewert geladen, kann dieser schon 
vorbei sein und dann muß der Timer ne volle Runde machen, die bei 32Bit 
schon ne kleine Ewigkeit dauert.

von Peter D. (peda)


Lesenswert?

Del schrieb:
> Die Wechselzeit des zweiten Timers sollte dabei natürlich schneller sein
> als die Frequenz, dass das eign Signal erzeugt.

Eher umgekehrt. Ein Wechsel sollte wenigstens eine PWM-Periode abwarten, 
besser mehrere. Mit eingeschaltetem Latch ist auch kein schnellerer 
Wechsel möglich.

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


Lesenswert?

Del schrieb:
> Axel S. schrieb:
>> Wenn du ernsthaft Hilfe erwartest, dann beschreibe genau was du tun
>> willst. Irgendwelche Timereinstellungen zu einem genauen Zeitpunkt
>> ändern zu wollen, ist seltenst eine gute Lösung.
>
> zur Erzeugung eines PWM Signals mit variabler Frequenz. D.h., dass ich
> nach jeder Periode sowohl die Frequenz als auch Pulsbreite ändere

Wenn der Timer deines µC einen PWM-Modus hat, wo das eine 
Compare-Register die Periodendauer vorgibt und ein anderes den 
PWM-Umschaltzeitpunkt, dann sind diese Latches genau das richtige.

Du kannst damit dann zu einem beliebigen Zeitpunkt innerhalb des 
PWM-Zyklus die beiden Register ändern und am Ende des aktuellen 
PWM-Zyklus werden die Werte aus den Latches in die Register übernommen.

> indem
> ich in der ISR eines zweiten Timers eine entsprechende Variable ändere.

Dazu brauchst du keinen zweiten Timer. Öfter als einmal pro PWM-Zyklus 
brauchst du die Werte ja nicht zu ändern.

von lukker (Gast)


Lesenswert?

Peter D. schrieb:
> Das Latch hat den Sinn, daß der neue Comparewert erst beim
> Nulldurchgang
> gültig wird.
> Wird ohne Latch ein kleinerer Comparewert geladen, kann dieser schon
> vorbei sein und dann muß der Timer ne volle Runde machen, die bei 32Bit
> schon ne kleine Ewigkeit dauert.

das ist GENAU das was ich meine =)

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> Wenn der Timer deines µC einen PWM-Modus hat, wo das eine
> Compare-Register die Periodendauer vorgibt und ein anderes den
> PWM-Umschaltzeitpunkt, dann sind diese Latches genau das richtige.
>
> Du kannst damit dann zu einem beliebigen Zeitpunkt innerhalb des
> PWM-Zyklus die beiden Register ändern und am Ende des aktuellen
> PWM-Zyklus werden die Werte aus den Latches in die Register übernommen.

arbeite mit dem MSP430 f5529, wäre echt sexy zu wissen wie das geht. Die 
timer verfügen über eine PWM funktion, mir ist trotzdem nicht so ganz 
klar wie du das meinst

von Del (Gast)


Lesenswert?

Peter D. schrieb:
> Eher umgekehrt. Ein Wechsel sollte wenigstens eine PWM-Periode abwarten,
> besser mehrere. Mit eingeschaltetem Latch ist auch kein schnellerer
> Wechsel möglich.

aber wie kann man dann eine flüssig steigende Frequenz realisieren?

von DasTutWeh (Gast)


Lesenswert?

Del schrieb:
> arbeite mit dem MSP430 f5529, wäre echt sexy zu wissen wie das geht.

Das Rumgeblödel nennst du arbeiten?

Du kannst keine Frage verständlich stellen, kannst kein Datenblatt 
lesen, verstehst keine Erklärungen, ... du kannst eigentlich nur 
rumirren und rumsülzen!

Sexy ist das ganz sicher nicht, eher eine Zumutung!
Warum Talentfreie wie du, z.B. nicht lieber Hunde ausführen gehen, 
verstehe ich nicht.
Dem Hund wäre dein Gesülze doch egal, aber uns nicht!

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


Lesenswert?

Del schrieb:
> Peter D. schrieb:
>> Ein Wechsel sollte wenigstens eine PWM-Periode abwarten,
>> besser mehrere. Mit eingeschaltetem Latch ist auch kein schnellerer
>> Wechsel möglich.
>
> aber wie kann man dann eine flüssig steigende Frequenz realisieren?

Streng genommen: gar nicht. Der Teilerfaktor ist eine ganze Zahl, damit 
kannst du nur diskrete Frequenzen erzeugen. Beim Wechsel gibt es dann 
immer einen Sprung.

Vielleicht erzählst du einfach mal, was die eigentliche Aufgabe ist.

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> Streng genommen: gar nicht. Der Teilerfaktor ist eine ganze Zahl, damit
> kannst du nur diskrete Frequenzen erzeugen. Beim Wechsel gibt es dann
> immer einen Sprung.

haha immer diese Missverständnisse =)

ich möchte eine Frequenzband diskret durchlaufen. Von 100 Hz bis 2000 
Hz.Das macht z.b. timer B. Habe meine Wechselzeit auf 2000 Hz gelegt 
(GRUND DAFÜR IST DOCH KLAR? möchte nach jeder periode eine neue Frequenz 
einstellen können)(das macht timer A) . D.h. dass alle 2000 Hz eine ISR 
aufegrufen wird, in der die nächste Frequenz dem CCR-Register des timer 
B zugewiesen wird.
Würde entsprechend CLLD_1 setzten
Jetzt das Problem: wie würde man den diesen PWM Generator realisieren, 
wenn man für Timer A kleine Zeiten wählt. und zwar so kleine zeiten, 
dass ein Wechsel der CCR-werte MEHRMALS erfolgt, bevor die erste Periode 
durchlaufen wurde. (das ist bei 2000 Hz der fall)
normalerweise würden ja die Werte immer wieder überschrieben werden,
sodass nur der Wert übernommen wird, der im Moment des Nulldurchganges
gesetzt wurde

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


Lesenswert?

Del schrieb:
> Axel S. schrieb:
>> Streng genommen: gar nicht. Der Teilerfaktor ist eine ganze Zahl, damit
>> kannst du nur diskrete Frequenzen erzeugen. Beim Wechsel gibt es dann
>> immer einen Sprung.
>
> haha immer diese Missverständnisse =)
>
> ich möchte eine Frequenzband diskret durchlaufen. Von 100 Hz bis 2000
> Hz.Das macht z.b. timer B. Habe meine Wechselzeit auf 2000 Hz gelegt
> (GRUND DAFÜR IST DOCH KLAR? möchte nach jeder periode eine neue Frequenz
> einstellen können)

Das ergibt keinen Sinn. Eine Frequenz kannst du nur für ein 
periodisches Signal angeben. Wenn du eine Frequenz von 100Hz ausgeben 
willst, dann kannst du frühestens nach Ablauf einer Periode die Frequenz 
ändern. Also maximal mit 100Hz und nicht mit 2kHz.

> Jetzt das Problem: wie würde man den diesen PWM Generator realisieren,
> wenn man für Timer A kleine Zeiten wählt. und zwar so kleine zeiten,
> dass ein Wechsel der CCR-werte MEHRMALS erfolgt, bevor die erste Periode
> durchlaufen wurde. (das ist bei 2000 Hz der fall)

Wenn du am Timer (sagen wir mal: am Endwert) mehrfach innerhalb einer 
Periode herumstellst, dann wird das bestenfalls bewirken, daß du frühere 
Einstellungen überschreibst, bevor sie irgendeinen Effekt gehabt haben 
können. Es kann aber auch passieren, daß der Timer den Endwert 
überspringt. Einfaches Beispiel: ein 8-Bit-Timer, eingestellt auf den 
Endwert 100. Der Timer läuft los. Als er bei 80 ist, setzt du den 
Endwert auf 50. Jetzt wird der Timer bis 255 laufen, auf 0 
zurückspringen und erst im nächsten Durchlauf den Endwert von 50 
respektieren.

Und genau um so etwas zu vermeiden, sind die Compare-Register 
typischerweise gepuffert. Damit man sie nicht innerhalb des laufenden 
Zyklus überschreiben kann.

> normalerweise würden ja die Werte immer wieder überschrieben werden,
> sodass nur der Wert übernommen wird, der im Moment des Nulldurchganges
> gesetzt wurde

Das ist nicht "normalerweise". Das ist das was passiert, wenn du den 
Timer so konfigurierst, daß die Compare-Register erst beim Überlauf des 
Timers aus den Latches geladen werden.

"Normal" ist der ungelatchte Fall, wo du direkt in das Compare-Register 
schreibst. Ohne Latch.

von rocket (Gast)


Lesenswert?

Axel S. schrieb:
> Das ergibt keinen Sinn. Eine Frequenz kannst du nur für ein
> periodisches Signal angeben. Wenn du eine Frequenz von 100Hz ausgeben
> willst, dann kannst du frühestens nach Ablauf einer Periode die Frequenz
> ändern. Also maximal mit 100Hz und nicht mit 2kHz.

genau, das Signal vom dem ich rede, verändert seine Frequenz und seine 
Pulsbreite, sobald eine Periode durchlaufen wurde. Wie ein PWM Signal 
mit variabler Frequenz.Die Wechselzeit soll mindestens genauso schnell, 
wie die größte Frequenz sein, damit nach jeder Frequenz die Periode 
geändert wird. Deswegen 2000Hz

Axel S. schrieb:
> Das ist nicht "normalerweise". Das ist das was passiert, wenn du den
> Timer so konfigurierst, daß die Compare-Register erst beim Überlauf des
> Timers aus den Latches geladen werden.
>
> "Normal" ist der ungelatchte Fall, wo du direkt in das Compare-Register
> schreibst. Ohne Latch.

genau. das meinte ich

Axel S. schrieb:
> Es kann aber auch passieren, daß der Timer den Endwert
> überspringt. Einfaches Beispiel: ein 8-Bit-Timer, eingestellt auf den
> Endwert 100. Der Timer läuft los. Als er bei 80 ist, setzt du den
> Endwert auf 50. Jetzt wird der Timer bis 255 laufen, auf 0
> zurückspringen und erst im nächsten Durchlauf den Endwert von 50
> respektieren.

das Verhalten konnte ich auch so beobachten. Aber wie löse ich das 
Dilemma mit der Wechselzeit.


Übrigens, danke das du die Geduld hast.

von Del (Gast)


Lesenswert?

rocket schrieb:
> Aber wie löse ich das
> Dilemma mit der Wechselzeit.

Mit Dilemma ist gemeint, das ich nach jeder Periode eine neue 
Pulsbreite, und Frequenz haben möchte will.

Ich hatt es noch nicht scharf formuliert: das frequenzband wird diskret 
in 50 Hz-Schritten durchlaufen.

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


Lesenswert?

Del schrieb:
> rocket schrieb:
>> Aber wie löse ich das
>> Dilemma mit der Wechselzeit.
>
> Mit Dilemma ist gemeint, das ich nach jeder Periode eine neue
> Pulsbreite, und Frequenz haben möchte will.

Welches Dilemma? Wurde doch schon gesagt:

Axel S. schrieb:
> Wenn der Timer deines µC einen PWM-Modus hat, wo das eine
> Compare-Register die Periodendauer vorgibt und ein anderes den
> PWM-Umschaltzeitpunkt, dann sind diese Latches genau das richtige.
>
> Du kannst damit dann zu einem beliebigen Zeitpunkt innerhalb des
> PWM-Zyklus die beiden Register ändern und am Ende des aktuellen
> PWM-Zyklus werden die Werte aus den Latches in die Register übernommen.

Und nein, du brauchst keinen zweiten Timer. So konfigurieren, daß die 
Latches beim Nulldurchgang übernommen werden. Den Überlauf-Interrupt für 
den Timer aktivieren und in der ISR die neuen Werte für TOP und PWM in 
die Compare-Latches schreiben. Die werden dann am Ende des gerade 
laufenden Zyklus aktiv.

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> So konfigurieren, daß die
> Latches beim Nulldurchgang übernommen werden.

das würde ich dann durch setzen vonn CLLD_1 eins machen

Axel S. schrieb:
> Den Überlauf-Interrupt für
> den Timer aktivieren

 weiß ich nicht, was du meinst. du meinst die ISR, wenn CCRO erreicht 
ist?

Axel S. schrieb:
> TOP

top?

von Del (Gast)


Lesenswert?

würde es reichen wenn ich es in der ISR von CCR0 mache?

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> Den Überlauf-Interrupt für
> den Timer aktivieren

wenn man es so macht wie du beschreibst, würde es doch zu keinem 
Überlauf kommen. Kannst du mir das nochmal erklären?

von Del (Gast)


Lesenswert?

hat vllt noch jemand anderes einen Plan, was Axel meinte?

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


Lesenswert?

Del schrieb:
> Axel S. schrieb:
>> Den Überlauf-Interrupt für
>> den Timer aktivieren
>
> wenn man es so macht wie du beschreibst, würde es doch zu keinem
> Überlauf kommen. Kannst du mir das nochmal erklären?

Wenn der Zähler den konfigurierten TOP Wert erreicht und zurück auf 0 
springt, dann ist das im Prinzip auch ein Überlauf. Ich schau jetzt 
nicht für dich ins Manual deines µC, um nachzusehen für welche 
Timer-Events da jeweils in Interrupt generiert werden kann und wie der 
Hersteller das Event genannt hat.

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> Wenn der Zähler den konfigurierten TOP Wert erreicht und zurück auf 0
> springt, dann ist das im Prinzip auch ein Überlauf. Ich schau jetzt
> nicht für dich ins Manual deines µC, um nachzusehen für welche
> Timer-Events da jeweils in Interrupt generiert werden kann und wie der
> Hersteller das Event genannt hat.

ah okay, du hast mit Überlauf einfach etwas anderes gemeint. So wie du 
es beschreibst, ist es der Interrupt von CCR0. Danke Dir. Aber das 
bedeutet auch, das der Timer, wenn er anfängt zu zählen, zweimal die 
gleiche Periode/ Frequenz hat,bis der neue gesetzt wird.

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


Lesenswert?

Del schrieb:
> Aber das
> bedeutet auch, das der Timer, wenn er anfängt zu zählen, zweimal die
> gleiche Periode/ Frequenz hat,bis der neue gesetzt wird.

Nicht notwendig.

Du setzt Frequenz und Pulsweite, startest den Timer und setzt sofort die 
Werte für die nächste Periode. Ab dann in der ISR. Du kannst das ja in 
eine eigene Funktion verpacken, die du einmal aus dem Hauptprogramm und 
danach immer aus der ISR aufrufst.

Dann brauchst du den Code (und die Logik) nicht zu duplizieren.

von Del (Gast)


Lesenswert?

Axel S. schrieb:
> Du setzt Frequenz und Pulsweite, startest den Timer und setzt sofort die
> Werte für die nächste Periode. Ab dann in der ISR. Du kannst das ja in
> eine eigene Funktion verpacken, die du einmal aus dem Hauptprogramm und
> danach immer aus der ISR aufrufst.
>
> Dann brauchst du den Code (und die Logik) nicht zu duplizieren.

habe ich verstanden, danke dir!

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.