[Aporte] Semaforo con temporizador (MSP430)

Mi primer aporte, estaba trabajando en intentar mejorar el código de un semáforo que había hecho hace un año empleando un MSP430, en esa ocasión lo programé con Energia usando el delay(), ahora quería hacerlo un poco más eficiente empleando el temporizador, aquí está el código.
Código:
//******************************************************************************
//  Pequeño semaforo con MSP430 asistido por reloj auxiliar de 32.768kHz
//
//  Descripción: Empleando el ACLK se realiza el conteo para la secuencia
//  de un semáforo simple, el MCU permanece en LPM3 durante el resto del
//  tiempo para ahorrar energia.
//  //* Un cristal de reloj externo en XIN XOUT es necesario para ACLK *//
//
//           MSP430G2
//         ---------------
//     /|\|            XIN|-
//      | |               | 32kHz
//      --|RST        XOUT|-
//        |               |
//        |           P2.0|-->LED Rojo      --
//        |           P2.1|-->LED Amarillo    | <- Un lado
//        |           P2.2|-->LED Verde     --
//        |           P2.3|-->LED Rojo      --
//        |           P2.4|-->LED Amarillo    | <- Otro lado
//        |           P2.5|-->LED Verde     --
//
//  Nuyel Solorzano Ruano
//  Nuyel Electronics
//  Noviembre 2013
//******************************************************************************
#include <msp430.h> 
#define Rojo_1 		BIT0
#define Amarillo_1 	BIT1
#define Verde_1 	BIT2
#define Rojo_2		BIT3
#define Amarillo_2 	BIT4
#define Verde_2 	BIT5
#define Luces 		P2OUT
volatile int Contador = 0;	//El Contador es una variable global para contar el tiempo cada 500ms
/*************************************************
 *    Rutina de interrupcion del temporizador    *
 * Esta es la accion que ocurre cada ves que el  *
 * temporizador genera una interrupcción         *
 *************************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void){
	Contador--;		//Disminuir el Contador en 1
	P1OUT ^= BIT0;	//Invertir el valor de P1.0; esta acción solo la uso para mostrar un destello cada segundo en el LED rojo del LaunchPad
	LPM3_EXIT;		//Salir del modo de bajo poder 3
}
/* Rutina para esperar */
void esperar(int segundos){
	Contador = segundos * 2;	//Multiplicar el numero de segundos por 2 y colocarlos en el Contador
	while(Contador){	//Esperar hasta que el contador sea 0
		LPM3;			//Entrar en modo de bajo poder 3
	}
}
/* Rutina para destellar */
void destellar(int luz){
	Contador = 8;		//Veces que debe repetir el ciclo
	while(Contador){
		LPM3;			//Suspender y esperar
		Luces ^= luz;	//Invertir la luz (encender o apagar)
	}
}
void main(void) {
	/* Configuración de relojes */
    WDTCTL = WDTPW | WDTHOLD;	// Detener temporizador vigilante
    BCSCTL1 = 0;                //Lipiar registro de control del oscilador antes de asignar
    BCSCTL3 = 0;
    BCSCTL1 = CALBC1_1MHZ;		//Reloj principal en 1MHz
    DCOCTL = CALDCO_1MHZ;       // SMCLK = DCO = 1MHz
    /**************************************************
     * Se usa el reloj auxilar con cristal de 32768Hz *
     * para tener un tiempo preciso sin que se afecte *
     * por las variaciones del reloj principal que    *
     * pueden causarse por variaciones de voltaje.    *
     * El cristal se conecta en los pines P2.6 y P2.7 *
     * ************************************************/
    BCSCTL3 = XCAP_3;           //Activa la capacitancia interna de 12.5pf para el cristal

    /* Configuración de puertos */
    P1DIR = 0xFF;	//Puerto 1 todos como salidas
    P1OUT = 0x00;	//Borrar puerto 1
    P2DIR = 0x3F;	//Puerto 2, 0-5 como salidas, 6 y 7 son del cristal del temporizador
    P2OUT = 0x00;	//Borrar puerto 2
    P3DIR = 0xFF;	//Puerto 3 todos como salidas
    P3OUT = 0x00;	//Borrar puerto 3

    /* Configuracion temporizador */
    CCTL0 = CCIE;				//Habilitar interrupción del temporizador cuando llege a TACCR0
    TACCR0 = 16384 - 1;			//Valor a contar del temporizador para 500ms
    TACTL = TASSEL_1 | MC_1;	//Seleccionar conteo ascendente del reloj auxiliar
    P1OUT |= BIT0;

    __enable_interrupt();		//Habilitar interrupciones globales

    /* Lazo del semáforo */
    while(1){
    	Luces = Verde_1 | Rojo_2;
    	esperar(10);
    	destellar(Verde_1);
    	Luces = Amarillo_1 | Rojo_2;
    	esperar(3);
    	Luces = Rojo_1 | Verde_2;
    	esperar(10);
    	destellar(Verde_2);
    	Luces = Rojo_1 | Amarillo_2;
    	esperar(3);
    }
}
Espero que a alguien le sea útil, he visto muchos con PICs aquí pero pocos proyectos con los MSP430 y a mi me agradan mucho las posibilidades de estas cositas a 3V.
 
Hola que tal, gracias por el aporte, te hago una pregunta:

¿Qué ventajas le ves al MSP respecto a los PIC?.

Nunca he buscado alternativas a los pic pero siempre es bueno saber, saludos.
 
Pues los MSP430 en primera tienen suficientes opciones para hacerlos ahorradores de energía, por ejemplo aquí entro en Low Power Mode 3, apaga CPU, desactiva el reloj principal, el secundario y el DCO que genera la frecuencia de 1MHz y toma 1us en despertar, solo permanece activo el reloj auxiliar con el cristal de 32KHz. Se me olvidó decir que este código lo ejecuté en un MSP430G2553 pero cualquiera con el puerto 2 funciona, el código es muy compatible en esta parte.

Son de 16bits con arquitectura Von Neumann, otras cosas buenas, es que son muy flexibles con los relojes, tienes integrado el DCO y VLO además de los externos (dependiendo el chip por que la value line no admite cristal de alta velocidad y el DCO solo puede llegar a 16MHz por protecciones integradas), el reloj principal lo puedes direccionar de cualquier fuente así como el secundario para operar los periféricos a bajas velocidades. Tienen interrupción en todos los pines de los puertos 1 y 2. En los temporizadores sacas ventaja de los 16bits y los múltiples osciladores especialmente en PWM. Algunos tienen hasta PGA integrados para el ADC como el MSP430F2013 (que tiene un ADC Sigma-Delta de 16bits)

Ciertos chips tambien tienen Boot Strap Loader (un boot loader cargado desde fabrica) que puede usarse para programar el chip vía RS-232 o USB (dependiendo del chip), y tienes varias opciones de compilador incluyendo el MSPGCC.

También hay otros modelos con funciones especializadas, como los que incluyen RF, controlador para pantallas LCD (y me refiero a manipular directamente los segmentos no a los módulos que venden y conectas un par de señales), otros que usan memoria RAM ferroelectrica que mantienen los datos aún tras un corte de energía o que funcionan desde 0,9V, los contra seria que la mayoría son SMD, solo la Value Line y el MSP430F20x1/2/3 están en encapsulado DIP y la frecuencia máxima es de 25MHz.

Una Launchpad te ayuda a introducirte con estos chips, es económica e incluye dos además tiene el IDE Energia con el que los puedes programar igual a Arduino.
 
Yo solía usar PICs y me pasé a los msp430.
Como todo, hay cuestiones de gustos, de que tan bien se adapta el micro a la aplicación en particular, si los podés comprar localmente, etc.

En mi caso quería diseñar equipos con batería, y ahí es como dice Nuyel: al contrario que los pics, los msp430 fueron diseñados desde 0 pensando en bajar consumo. Por eso se pueden apagar los módulos de a uno, cambiar el nivel de tensión con que opera el micro sin mosquearse, también velocidades de reloj. Los periféricos pueden utilizar un reloj distinto (más lento) que la cpu, con lo que los periféricos consumen algo menos. Otra cosa piola es que los periféricos tienen una línea de "solicitud de reloj", si ningún periférico pide reloj el subsistema de reloj pasa a bajo consumo.
Hay mucho para hablar de bajo consumo, de hecho hubo una pequeña guerra de notas de aplicación donde Microchip decía que era mejor que Texas y viceversa, "la guerra del low power" si se quiere:

http://www.ti.com/lit/wp/slay015/slay015.pdf
https://www.microchip.com/stellent/groups/picmicro_sg/documents/devicedoc/en551263.pdf
http://www.eetimes.com/author.asp?section_id=36&doc_id=1286039

Fuera de la guerra del low-power (que para mí la gana msp430 para aplicaciones realistas donde se requiere que el micro haga algo y no que quede sin hacer nada el 99.999999999999% del tiempo), está la cuestión de herramientas de desarrollo y código de ejemplo.
Microchip tiene muchas y muy buenas notas de aplicación - muy didácticas, TI por ahí no tantas. Pero algo que me gusta de TI es que trae código de ejemplo muy básico para los periféricos, donde uno no se tiene que estar poniendo a ver que hace exactamente cada bit de los registros de control, y siempre muestra el empleo de interrupciones y de modos de bajo consumo.
Microchip tiene la configuración visual de periféricos, TI tiene el Grace pero no para todos los msp430.

Otra cosa a la que hay que acostumbrarse es a hacer funcionar todo a 3.3V (o menos). Cosa necesaria si uno habla de bajo consumo.

Herramientas de desarrollo: ya lo dijo Nuyel, y con el Launchpad ya incorpora depuración -> no hace falta comprar un equivalente al icd3 o un pickit3 para ejecutar código paso y paso y ver donde metimos la pata.
TI suele tener placas demo muy baratas (no es raro ver cosas a U$S20, microchip es más caro - no sé ahora). La tienda de TI no te cobra costos de envío (podés pedir algo de U$S10 y te llega a los 3 o 4 días sin tener que pagar U$S45 de Fedex International priority/economy).

Si uno quiere usar herramientas libres y abiertas, sin truchar nada y sin restricción de tamaño de código, con msp430 se puede como decía Nuyel.
Con Microchip me acuerdo que había versiones estudiantiles o limitadas en tamaño de código, y me canse de no poder depurar mis programas desde Ubuntu (allá por el 2011, quizás ahora con el mplab X ide la cosa anda mejor).

Si tuviera que elegir otra vez hoy y aprender a usar un micro nuevo? ninguno de los dos :cabezon: -> me iría directo a usar micros ARM de 32 bits, y usaría los de ST o EnergyMicro (ahora Silabs) por la cuestión de bajo consumo, y que da pie para hacer cosas más complejas a futuro.
 
Pues si Ardogan, los MSP430 son más para sensores y mediciones donde el consumo es prioridad para extender la duración de las baterías y no se requiere un poder de computo grande, para más poder TI tiene ARM desde Cortex-M3 y M4F a Cortex-R4 para aplicaciones criticas y hasta poderosos procesadores Cortex-A8 y A15, pero algunas veces no se justifica usar un chip de tan altas prestaciones, yo aquí tengo PIC, y la verdad el motivo por que aprendí a usar MSP430 fue por lo económico, a mí los PIC me cuestan bastante aquí, tengo que traerlos de otros lados para que me salgan baratos, pero si voy a tener que importar chips ¿por que un PIC teniendo varias opciones?, y fue que me puse a probar los MSP430 por lo económico del LaunchPad MSP430 y gracias al programa de muestras puedo evaluar los chips para explotar sus posibilidades, aparte tengo la LaunchPad Stellaris (ARM Cortex-M4F), la FRDM-KL25Z (ARM Cortex-M0+) y un Arduino Uno R3, próximamente espero agregar más MCU, siempre es bueno conocer de varios para elegir el que mejor se adapte a las necesidades del proyecto, algún día usaré uno de ST para tener un ARM de alta velocidad.
 
Claro, cuidado!!!, no estoy diciendo que usaría una clase de ARM para todo, sino que usaría el ARM mejor adaptado a la situación (por eso mencioné EnergyMicro y los de bajo consumo de ST, fijate que la velocidad máxima de reloj ronda los 24MHz porque son para aplicaciones de bajo consumo).
Discusión bajo consumo stm32l vs msp430:
http://forum.43oh.com/topic/3416-stm32l-vs-msp430f5-whats-left-for-msp430/


Cuando estaba en la universidad mis opciones eran Microchip/AVR/Fresscale.
Hoy me parece que la cuestión sería aprender con Arduino (que puede correr en micros de AVR, Microchip y TI; y empieza a portarse a arquitecturas de 32 bits) y dar el siguiente paso con ARM usando gcc + eclipse u otro IDE similar. De esa forma se puede enseñar sin favorecer a ninguna empresa en particular, y ganar tiempo para aprender más sobre FPGA.

Por ahora voy a seguir usando los msp430 un tiempo más (la inversión ya la hice, hay que hacerla rendir); y me parecen micros bastante confiables y de buena arquitectura (es mucho más frecuente ver un msp430 al desarmar un equipo comercial que un pic).
Pero mientras tanto me voy capacitando para ARM...
 
Atrás
Arriba