Hi @ all,
ich bin auf dem Gebiet der µC Programmierung und bräuchte eure Hilfe:
Ich habe einen MSP430FR5739 und möchte den Comparator_D in Betrieb
nehmen.
Meine Platine habe ich mit dem MSP wie folgt verschaltet:
- P1.0 (CD0) ist ein Sinussignal mit 1.25V Offset und einer Amplitude
von 2 Vpp --> Soll der positive Komparatoreingang sein
- P1.1 (CD1) ist eine Referenzsspannung von 1.25V --> Soll der negative
Komparatoreingang sein
- P3.5 (CDOUT) ist der Komparatorausgang, der '1' sein soll für
V(CD0)>V(CD1) und '0' für V(CD0)<V(CD1)
1
// MSP430FR5739
2
// ------------------
3
// /|\| |
4
// | | |
5
// --|RST P1.0/CD0 |<--Vcompare (VAC)
6
// | |
7
// | P3.5/CDOUT|-->'1' bei CD0>CD1 und '0' bei CD0<CD1
8
// | |
9
// | P1.1/CD1 |<--Vref (=1.25 VDC)
10
// | |
Hier mein Quellcode:
1
#include<msp430.h>
2
3
intmain(void)
4
{
5
WDTCTL=WDTPW+WDTHOLD;// Stop WDT
6
// Compare input
7
P1SEL1|=(BIT0+BIT1);// Enable pin P1.0 (Vcomp_in) and P1.1 (1.25V) as tertiary option: comparator
8
P1SEL0|=(BIT0+BIT1);// Enable pin P1.0 (Vcomp_in) and P1.1 (1.25V) as tertiary option: comparator
CDCTL1|=CDOUT;// Enable comparator output on port 3.5
19
20
CDCTL1|=CDON;// Turn On Comparator
21
22
__bis_SR_register(LPM4_bits);// Enter LPM4
23
}
Mein Problem: Ich messe mit dem Oszi an P3.5 nur '0', anstatt dem
erwarteten alternierenden Signal
Hier meine Fragen:
1. Wenn ich die Register des Comparators gesetzt habe, arbeitet dann der
Comparator auch, wenn der MSP430 im sleepmodus ist? (Den Teil vom Code
habe ich auskommentiert-hat leider nichts gebracht)
2. Woran liegt es, dass mein Ausgangssignal nur '0' ist? Die Spannungen
liegen auch wirklich am MSP an (habs nachgemessen).
3. Muss ich irgdeine Flag setzen und wenn ja warum und wie sieht das
dann aus?
VIELEN DANK für eure Hilfe! Ich bin echt am verzweifeln und hoffe ihr
könnt mir helfen!
Lg Marcus
--
Bitte für "ASCII-Art" und Quelltext die entsprechenden Tags verwenden.
-rufus
Hallo Marcus,
ob der Comparator im LPM4 noch arbeitet habe ich im Datenblatt auf die
schnelle auch nicht gefunden, ich bezweifle das. Ich würde erstmal den
LPM0 probieren, da wird nur die CPU abgeschaltet, da sollte es gehen,
danach kann man ja die LPMx nacheinander durchprobieren.
Wenn Du die Zeile nur auskommentierst, nützt das nichts, da der
Prozessor dann sein Programm beendet, Du hast ja im Moment noch keine
Hauptschleife.
Gruß wv
Hallo wv,
danke erstmal für deine Antwort!
Ich hab dazu allerdings noch Fragen:
Reicht das nicht, dass ich die Register für den Komparator setze, damit
dieser seiner Arbeit nachgeht? Ich meine, es ist laut Datenblatt ein
analoger Komparator. Ich dachte, einmal initialisiert arbeitet er dann
munter weiter - oder muss ich da irgendwas in einer Schleife
programmieren - z.B. eine leere while(1)-Schleife?
Ich habe von TI-ein paar Beispielcodes gefunden, an denen ich mich
orientiert hatte - da war dann auch keine while-Schleife, weshalb ich
dachte man braucht das nicht :-/
Was passiert eigentlich wenn der Prozessor sein Programm beendet? Ich
dachte eben: Prozessor setzt die Register des Komparators und dann kann
der CPU ja machen was er will, solange der Komparator arbeitet. Oder
stellt dann auch der Komparator seine Arebit ein?
Vielen Dank schonmal für eure Hilfe!
Lg Marcus
Hallo Marcus,
eine while(1) Schleife brauchst Du in diesem Fall wirklich nicht, wenn
Du nur den Comparator testen willst. Das braucht man erst später, wenn
noch andere Sachen erledigt werden sollen. Es kommt jedoch auf die
letzte Anweisung an:
__bis_SR_register(LPM4_bits);
das bedeutet, daß CPU, Oszillatoren und ein großer Teil der Peripherie
abgeschaltet wird. Die CPU kann dann nur noch über einen (aktivierten)
IO-PIN wieder aufgeweckt werden. Ich würde erstmal die höheren LPMx
probieren, um zu sehen, bei welchem LPM der Comparator abgeschaltet
wird.
Gruß wv
Alles klar,
wird erledigt - leider nicht vor Montag.
Aber dennoch die Frage, ist der Code denn korrekt, oder habe ich da
einen Bockmist gebaut?
Lg Marcus
Hallo Marcus,
ich habe mir den Code jetzt mal kurz durchgeschaut, das sollte so
funktionieren (wie gesagt bis auf die LPMx - Geschichte, s.o.).
Lediglich die Zeile
CDCTL1 |= CDOUT; // Enable comparator output on port 3.5
kann man weglassen, das Bit was Du da versuchst zu setzen ist readonly.
Der Ausgang sollte demnach schon über P3DIRx und P3SELxx aktiviert sein.
Zu einer Fehlfunktion kann das aber nicht führen:
"CDOUT R 0h Output value. This bit reflects the value of the
Comparator_D output. Writing this bit has no effect on the comparator
output."
family user guide FR57xx family S.471
Gruß wv
Hallo wv,
Es GEHT :-)
Leider muss ich gestehen, dass der Fehler ein richtig dummer
Anfängerfehler war:
Ich schreibe den Code mit IAR und hatte dann in den Projekt-Optionen
vergessen den FET-Debugger einzustellen und deshalb ging es auch nicht.
Der Code selbst funktioniert und du hast recht, die Zeile mit dem CDOUT
kann man getrost weglassen.
Und wegen dem LowPower-Mode: Es ist ein Hardware-Komparator, heißt, der
Komparator läuft selbst im LPM4-Mode (wurde natürlich gleich getestet
;-) )
SORRY!!!!!, dass so ein dummer Fehler meinerseits, dich so viel Zeit und
Mühe gekostet hat! Und VIELEN VIELEN DANK für deine Hilfe!
Ich wünsche dir eine schöne Woche!
Lg Marcus