He intentado implementar un sensor de temperatura basado en resistencia en un MSP430 FR5969. La Guía del usuario es bastante sencilla en este punto. Configuré todos los registros de acuerdo con la guía del usuario, pero desafortunadamente no puedo hacer funcionar el comparador. Justo después de iniciar el comparador, se produce una interrupción incluso si no hay ningún sensor conectado. Supongo que hay un error en mi método de inicialización.
Espero que alguien pueda ayudar con este problema.
Aquí está el método de inicialización
//Komperator beenden
stop_COMP();
CECTL0 &= 0x0000;
CEINT &= 0x0000;
// Pinbelegung konfigurieren
connect_input();
switch_pin_to_high_impedance_input(R_SENS_PORT, R_SENS_PIN, -1);
switch_pin_to_high_impedance_input(R_REF_PORT, R_REF_PIN, -1);
CECTL1 &= ~(CEMRVS); //Set to VREF0
CECTL2 &= CERSEL;
/*
* If CEREFLx is changed from a non-zero value to another
* non-zero value, the interrupt flags may show unpredictable behavior. It is recommended to set CEREFLx
* = 00 prior to changing the CEREFLx settings.
*/
CECTL1 |= CEPWRMD_2; // Ultra-low-Power mode
CECTL1 &= ~CEOUTPOL; // nicht invertierender Ausgang
CECTL1 &= ~CEEX; // Eingänge des Komperators nicht vertauschen
CECTL1 |= CEF; // Ausgang filtern
CECTL1 |= CEFDLY_1; // RC Glied mit 900 ns als Zeitkonstante
CECTL1 &= ~CEIES; // Rising Edge triggert Interrupt
CECTL2 |= CEREFACC; // Clocked (low power, low accuracy) mode
/*
* If CEREFLx is changed from a non-zero value to another
* non-zero value, the interrupt flags may show unpredictable behavior. It is recommended to set CEREFLx
* = 00 prior to changing the CEREFLx settings.
*/
CECTL2 |= CERS_1; //Vcc with resistor ladder
CECTL2 &= ~CEREFL_3;
CECTL2 |= CEREFL_0; // Referenzspannung: 2.5V
CECTL2 |= CERSEL; // Referenzspannung an negativen Eingang des Komperators legen
CECTL3 |= CEPD4;
setupTimerForMeasurement();
Código para la inicialización de pin
//Komparatoreingang
P1DIR &= ~COMP_PIN; //Port1.COMP_PIN als Eingang definieren
P1SEL0 |= COMP_PIN; // Aktivieren der Tertiärenfunktion (Komperatoreingang)
P1SEL1 |= COMP_PIN;
P1OUT &= ~COMP_PIN; // Ausgang auf Low setzen
// RSensPin
P3DIR |= R_SENS_PIN; //Port3.R_SENS_PIN als Ausgang definieren
P3SEL0 &= ~R_SENS_PIN; // Aktivieren der Hauptfunktion (GPIO)
P3SEL1 &= ~R_SENS_PIN;
P3OUT &= ~R_SENS_PIN; // Ausgang auf Low setzen
// RRefPin
P3DIR |= R_REF_PIN; //Port3.R_Ref_PIN als Ausgang definieren
P3SEL0 &= ~R_REF_PIN; // Aktivieren der Hauptfunktion (GPIO)
P3SEL1 &= ~R_REF_PIN;
P3OUT &= ~R_REF_PIN; // Ausgang auf Low setzen
// Konfigurieren des Komperators
CECTL0 &= ~CEIMEN; // - Eingang des Komperators auf interne Ref.-Spannung legen
CECTL0 = CEIPEN | CEIPSEL_4; // + Eingang des Komperators nicht auf interene Ref.-Spannung legen
// Kanal 4 (Pin COMP_PIN) an Eingang legen
CECTL3 |= 1 << CEIPSEL_4; // Input Buffer deaktvieren, um Energie zu sparen
//CECTL2 |= CERSEL; //Set Vref to go to (-) terminal
CECTL2 = CERS_1 | CERSEL | CEREF04;