Forum: Mikrocontroller und Digitale Elektronik Comparator_D im MSP430FR5739


von De M. (doctorbloody)


Lesenswert?

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
int main(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
9
    
10
    // Define and Set Compare output
11
    P3DIR |= BIT5; 
12
    P3SEL1 |= BIT5;
13
    P3SEL0 |= BIT5;
14
  
15
    //Setup Comparator
16
    CDCTL0 |= CDIPEN + CDIPSEL_0; // Enable V+, input channel CD0  
17
    CDCTL0 |= CDIMEN + CDIMSEL_1; // Enable V-, input channel CD1  
18
    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

: Bearbeitet durch User
von wv (Gast)


Lesenswert?

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

von De M. (doctorbloody)


Lesenswert?

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

von wv (Gast)


Lesenswert?

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

von De M. (doctorbloody)


Lesenswert?

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

von wv (Gast)


Lesenswert?

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

von De M. (doctorbloody)


Lesenswert?

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

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.