Forum: Mikrocontroller und Digitale Elektronik MSP430 DCO Drift


von crash (Gast)


Lesenswert?

Hallo,

ich arbeite mit dem MSP430F2330. Genauer gesagt mit zweien.
Um eine Datenübertragung(434MHz) in einem möglichst genau festgelegten 
(und kurzem) Zeitfenster zwischen den MSPs zu ermöglichen habe ich ein 
Programm geschrieben, das die beiden Clocks syncronysiert.
Das funktioniert auch ganz gut, nur habe ich jetzt ein Problem mit dem 
Drift der DCO ... oder genauer gesagt mit der Ungleichheit der beiden 
DCOs in den beiden Controllern.

Zum besseren Verständnis ein Beispiel:
Beide MSPs sollen alle 1000ms Daten austauschen.
Dazu werden die CLKs syncronysiert und beide können so gleichzeitig ein 
kurzes Zeitfenster öffnen um zu kommunizieren.
MSP-A hat aber eine ca 1% schnellere DCO-Frequenz als MSP-B.
-> nach einer Sekunde hat sich das Zeitfenster zwischen A und B bereits 
verschoben und die Syncronisation war für die KATZ!

Wie möche ich mein Problem lösen?
1)Schön wäre natürlich ein Quarz, aber in meinem Projekt ist dafür kein 
Bauraum vorhanden.
2)die DCO "nachstellen":
Ich habe mir überlegt die Abweichung zu ermitteln und die Einstelleung 
von zB DCO-A an die Frequenz von DCO-B anzupassen.

Leider hab ich nicht rausfinden können wie man das am besten anstellt 
...
Im User Guide hab ich ein Diagramm gefunden, auf dem die möglichen 
Frequenzen dargestellt sind, auf die man den DCO einstellen kann.
Aber ich denke diese Einstellungsmöglichkeit ist zu grob ?
Die MSP-s laufen momentan bei 1,2MHz ... 1% davon sind 12kHz ... laut 
Datenblatt des MSP kann die Abweichung aber auch kleiner sein als 1% ...



Meine Frage also:
Wie kann ich die DCO Frequenz nachjustieren, am besten in 
Einstellschritten die <10kHz sind?


Danke fürs Lesen,
crash

von Ernst (Gast)


Lesenswert?

Kannst du die nicht einfach mit zwei Leitungen verbinden, und die 
Leitungen togglen und der eine gibt dadurch dem anderen vor, wann Daten 
übernommen werden. Die zweite Leitung ist halt deine Datenleitung.

von Helmut L. (helmi1)


Lesenswert?


von crash (Gast)


Lesenswert?

Hallo,

danke für eure Ideen und die Recherche, aber eine Kabelverbindung ist 
nicht möglich (gekapselte Syteme) und der Quarz ist im Verglech zum 
vorhandenen Platz ... ich will nicht sagen riesig, aber definitiv zu 
groß ...

Es muss irgendwie per Software gelösst werden.

Darum bitte ich immernoch um Antworten auf die Fragen:
-Kann man die DCO-Frequenz eines MSP430x2xxx Controllers in Schritten 
<10kHz einstellen?
-Wenn ja, wie macht man das am besten?


Liebe Grüße,
crash

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es gibt eine Beispielapplikation, bei der der DCO eines MSP430 mit einem 
externen 32kHz-Quarz nachgestellt wird.
Anstelle des Quarztaktes kann in Deinem Fall der zweite Controller ein 
Signal mit seinem DCO erzeugen, das für den ersten Controller die 
Referenz ist.

Das Konzept findet sich in SLAC015 von TI, z.B. im Codebeispiel 
fet140_uart03_09600.c

Dort wird mit ACLK und Timer_A3 ein Interrupt mit etwa 4 kHz (32kHz/8) 
generiert. Im Interrupthandler wird überprüft, wie viele Takte der DCO 
inzwischen erzeugt hat und bei Abweichungen entsprechend nachjustiert.

Der Mechanismus sollte sich leicht auf Deine Anwendung übertragen 
lassen, erfordert allerdings eine Signalverbindung zwischen beiden 
Controllern.

von Ernst (Gast)


Lesenswert?

Rufus t. Firefly schrieb:
> Dort wird mit ACLK

Na dann hat er ja auch den Quarz mit dran

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hatte ich mich so undeutlich ausgedrückt?

Anstelle des Quarztaktes ist der vom "Master"-MSP430 erzeugte Takt zu 
verwenden, der mit dessen DCO erzeugt wird.

von crash (Gast)


Lesenswert?

Hallo,

Danke Rufus und Ernst für eure Beiträge.

Falls ich Rufus richtig verstanden habe, ist die Idee anstelle des 
Quarzes das DCO Signal des anderen MSPs zu verwenden.
Ist es denn realistisch über die eine Funkverbindung ein solchens Signal 
zu übertragen? Funkchip ist der CC1101 von TI.
Momentan arbeite ich mit dem Paket-Handler den der Chip zur Verfügung 
stellt.
Wenn ich einzelen Bits schicken würde bedeutet das erstens viel Overhead 
und zweitens muss ich die Infos aus dem RXFIFO auslesen.
Wenn beide MSPs bei der "selben" Frequenz laufen, kann das garnicht 
gehen oder?

Ich hatte mir überlegt dass zB MSP-A 2 Pakete an MSP-B sendet.
MSP-A misst (Zählerstand von TAR) die DCO-Takte zwischen den beiden 
"Paket gesendet"-Interrupts, MSP-B misst die Zeit zwischen den beiden 
"Paket erhalten"-Interrupts. MSP-A vergleicht den Zählerstand den er von 
MSP-B bekommen hat mit seinem eigenen und kann so die Abweichung in % 
feststellen und seine eigene Frequenz nachstellen. Das würde ohne ein 
Quarz zu verwenden den (vielleicht herstellungsbedingten) Offset 
zwischen den CLK_Frequenzen entfernen.
Falls es dann zu einer Spannungs bzw. Tempschwankung kmmt, könnte man 
die Funktion erneut ausführen.

Ist es prinzipiell möglich die Frequenz der DCO in Intervallen <10kHz 
einzustellen?


Es grüßt,
crash

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

crash schrieb:
> Falls ich Rufus richtig verstanden habe, ist die Idee anstelle des
> Quarzes das DCO Signal des anderen MSPs zu verwenden.

So war das gemeint.

> Ist es denn realistisch über die eine Funkverbindung ein solchens Signal
> zu übertragen?

Funkverbindung? Wo kommt die denn plötzlich her und warum erwähntest Du 
die nicht gleich im ersten Beitrag?

Das ändert die Situation grundlegend. Lässt sich aus dem verwendeten 
Funkchip irgendein Singal im kHz-Bereich gewinnen? Das könntest Du 
analog zum Quarzsignal zur DCO-Stabilisierung beider Controller 
verwenden - oder gleich als Takt (je nach Frequenz).

von Helmut L. (helmi1)


Lesenswert?

Aus dem Pin GDO0 oder GDO2  kann man sich den Quarztakt des Chip 
dividiert durch 192 ausgeben lassen.

von NoWay (Gast)


Lesenswert?

Das wird nicht funktionieren. Entweder die Daten müssen nicht in 
Echtzeit gesendet werden und der TX & RX "treffen" sich dann irgendwann 
mal wieder oder der Empfänger muss +- auf bleiben um den Sender zu 
empfangen. Dann direkt synchronisieren der Clocks und schlafen legen.
Ohne einen externen Quarz etc. kannst du die Clocks in allen CPUs 
vergessen. Da es dir um Platz und ich denke auch um LowPower geht, musst 
du die beiden beim "Treffen" synchronisieren. Im Fehlerfall, wenn sie 
sich mal, aus welchen Gründen auch immer, nicht getroffen habe, muss der 
RX sowieso länger auf bleiben.

von crash (Gast)


Lesenswert?

Hallo,

ein herzliches Danke für alle weteren Antworten.

Rufus t. Firefly schrieb:
> Funkverbindung?
crash schrieb:
> eine Datenübertragung(434MHz)
Ich gebe zu, das hätte ich genauer schreiben können.


Rufus t. Firefly schrieb:
> Lässt sich aus dem verwendeten
> Funkchip irgendein Singal im kHz-Bereich gewinnen? Das könntest Du
> analog zum Quarzsignal zur DCO-Stabilisierung beider Controller
> verwenden -
Helmut Lenzen schrieb:
> Aus dem Pin GDO0 oder GDO2  kann man sich den Quarztakt des Chip
> dividiert durch 192 ausgeben lassen.
Eine sehr gute Idee :)
Das werde ich mal genauer durchdenken.


NoWay schrieb:
> Da es dir um Platz und ich denke auch um LowPower geht, musst
> du die beiden beim "Treffen" synchronisieren. Im Fehlerfall, wenn sie
> sich mal, aus welchen Gründen auch immer, nicht getroffen habe, muss der
> RX sowieso länger auf bleiben.
Danke für diesen Einwand, genau das möchte ich durch die Syncronisation 
vermeiden.
Und da die Syncronistion auch Strom verbraucht möchte ich diese so 
selten wie möglich durchführen.
Darum meine Frage nach der Feineinstellung der DCO.


Vielen Dank nochmals an alle die geholfen haben!
Ich werde jetzt mal versuchen eure Ideen umzusetzen.

Eine Frage bleibt aber noch offen:
???Kann man die DCO-Frequenz in Intervallen <10kHz einstellen???



Liebe Grüße und viel Spass beim Fusball heute,
crash

von Tobias K. (kurzschluss81)


Lesenswert?

Sach mal die 2er Famile sollte doch für den DCO Parametrierwerte im 
Flash Segment A enthalten mit denen du die DCO Frequenz relativ genaue 
einstellen kannst.

von Jörg S. (joerg-s)


Lesenswert?

Tobias Korrmann schrieb:
> Sach mal die 2er Famile sollte doch für den DCO Parametrierwerte im
> Flash Segment A enthalten mit denen du die DCO Frequenz relativ genaue
> einstellen kannst.
Gegenseitig abdriften werden sie aber trotzdem.




> Zum besseren Verständnis ein Beispiel:
> Beide MSPs sollen alle 1000ms Daten austauschen.
> Dazu werden die CLKs syncronysiert und beide können so gleichzeitig ein
> kurzes Zeitfenster öffnen um zu kommunizieren.
> MSP-A hat aber eine ca 1% schnellere DCO-Frequenz als MSP-B.
> -> nach einer Sekunde hat sich das Zeitfenster zwischen A und B bereits
> verschoben und die Syncronisation war für die KATZ!
Aber wenn der eine MSP Daten empfangen hat, kann er sich doch auf den 
Zeitpunkt des empfangens sychonisieren. Also immer 1000ms Abstand von 
der letzten Kommunikation und nicht vom Power On Reset.

von Johnny B. (johnnyb)


Lesenswert?

Genau, das Zeug driftet eh immer auseinander, selbst wenn Du einen noch 
so genauen Quarz nimmst. Daher muss sowieso was gemacht werden, dass 
Sich Deine Geräte immer wieder neu synchronisieren.
Überlege Dir mal, wie UARTS / asynchrone, serielle Schnittstellen 
funktionieren. Da wird jeweils mit dem Startbit synchronisiert.
Sowas ähnliches müsstest Du wohl mit Deiner Funkverbindung auch machen.
Der Empfänger muss sich also nicht erst nach einer Sekunde einschalten, 
sondern schon ein wenig früher um eine genügend grosse Reserve zu haben, 
damit auch noch im Worstcase alles empfangen werden kann.

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.