¿En qué me voy mal con el comparador en MSP430?

1

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?

    
pregunta

2 respuestas

2

El cableado era correcto y el código era en su mayoría correcto. Se redujo a declaraciones #define incorrectas. Para solucionar el problema, todo lo que tenía que hacer era cambiarlos a

#define GREEN    BIT6
#define RED      BIT0
    
respondido por el user1721015
1

He probado tu código en mi Launchpad y funciona bien . He conectado un potenciómetro de 22k a los pines Vcc y GND (en el Launchpad), y mi Launchpad se alimenta desde la PC (a través del cable USB). He medido que mi Vcc = 3.57 V y los LED están cambiando a V = 1.77 V . P1.7 también está cambiando exactamente en este momento.

Por lo tanto, se garantiza que su código es correcto (probado en mi configuración). Por lo tanto, algo no está bien con la configuración de su hardware. Aquí hay algunas conjeturas que puede querer comprobar:

  • ambos puentes J5 están instalados (de modo que los LED están conectados a los pines MSP430)
  • intente iluminar ambos LED en su código para asegurarse de que estén conectados correctamente y completamente funcionales
  • verifique todas sus conexiones de cableado (todos los cables están conectados a los pines correctos, las conexiones son correctas y no hay cortocircuitos allí)
  • pruebe con otro multímetro / osciloscopio cuando mida voltajes

También, intenta construir tu proyecto con mi Makefile, quizás el tuyo tenga algunos problemas:

CROSS_COMPILE = msp430-
CC = $(CROSS_COMPILE)gcc
MCU = msp430g2553
BOARD = rf2500
XTAL = 1000000
SOURCES = src/main.c

CFLAGS = -mmcu=$(MCU) -mdisable-watchdog -Os -s -Wall -Iinclude/ \
     -D'XTAL=$(XTAL)UL'

all: $(SOURCES)
    $(CC) $(CFLAGS) $(SOURCES)

flash: a.out
    sudo mspdebug $(BOARD) "prog a.out"

clean:
    rm -f a.out

debug:
    mspdebug $(BOARD)

.PHONY: clean debug

Finalmente, algunos consejos sobre tu código:

  • no incluya <msp430g2553.h> , se está incluyendo automáticamente en <msp430.h> , usando el parámetro -mmcu=msp430g2553 , que está pasando a GCC al crear su proyecto. De esta manera puede hacer que su código sea más reutilizable (para diferentes MCU). Y de todos modos, es solo duplicar cosas, no traer nada nuevo.
  • mover la declaración led_mask dentro de su while loop
  • devuelve 0 explícitamente en main()
  • SWITCH definition no se utiliza en su código, considere eliminar
respondido por el Sam Protsenko

Lea otras preguntas en las etiquetas