Me estoy poniendo al día en la TI MSP430. Estoy intentando escribir código en C para acceder al comparador incorporado en MSP430G2553. Tengo un programa simple para el comparador, pero debo estar haciendo algo mal y espero que alguien pueda detectar mi error.
Para mi configuración tengo un potenciómetro a través de Vcc y Gnd con el brazo del limpiaparabrisas yendo a P1.1. El comparador está configurado para usar la referencia Vcc / 2 interna. Mi MSP430 está en la placa TI Launchpad y estoy tratando de conducir los LED rojo y verde allí según el estado del comparador. Si la salida del comparador es baja, quiero que el LED verde esté encendido y que el LED rojo esté apagado; Viceversa si la salida del comparador es alta. También configuré P1.7 para mostrar los contenidos del registro CAOUT. Mi código está aquí:
#include <msp430.h>
#include <msp430g2553.h>
/* This program is for the Launchpad MSP430 development board.
* There is a potentiometer connected from Vcc to Gnd with the
* wiper arm going to CA1 (P1.1). When the wiper voltage is
* below the threshold the green LED should be lit. When it
* exceeds the threshold the red LED should be lit.
*
* For this setup Vcc = 3.53 V
* reference = Vcc/2 = 1.77 V
* Vin = 1.76 V and higher: green LED on?
* Vin = 1.70 V and lower: red LED on?
*
*/
#define GREEN BIT0
#define RED BIT6
#define SWITCH BIT3
int main(void) {
WDTCTL = WDTPW + WDTHOLD; // disable watchdog
P1DIR = GREEN + RED + BIT7; // P1.0 and P1.6 and P1.7 are outputs
CACTL2 = P2CA4; // P1.1 = +comp
CACTL1 = CARSEL + CAREF_2 + CAON; // -comp = 0.5*Vcc; comparator on
P1SEL = BIT7; // P1.7 updates based on CAOUT
unsigned int led_mask = 0;
while(1){
led_mask = P1OUT;
if (CACTL2 & 0x01) {
led_mask &= ~GREEN; // green LED off
led_mask |= RED; // red LED on
} else {
led_mask &= ~RED; // red LED off
led_mask |= GREEN; // green LED on
}
P1OUT = led_mask;
}
}
Se compila y carga bien, pero no se comporta como pretendía. Cuando proporciono un voltaje de entrada de 2 voltios, excedo el umbral y el CAOUT sube (se verifica en P1.7) como se esperaba. Sin embargo, mi código enciende los LED como si CAOUT fuera bajo. Además, si proporciono un voltaje de entrada de 1.4 voltios, estoy por debajo del umbral y el CAOUT es bajo (verificado en P1.7) como se esperaba. Pero mi código enciende los LED como si CAOUT fuera alto.
¿Por qué no obtengo los resultados esperados?