Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

11/09/2012 #1


Duda con interrupcion de msp430 launchpad TI
Que tal, tengo una duda que no he podido resolver, aun viendo las referencias de Texas para los msp430 que vienen con el Launchpad, aclaro que tengo la versión que contiene los siguientes:

MSP430G2553 Y MSP430G2452

ahora mi pregunta es el siguiente, estoy programando en ensamblador, el 2553 lo utilizo para las practicas de la universidad y el 2452 para mis experimentos personales.

Ahora cuando programo algo en el 2452 solo se inicia al echarlo a correr con el debug del code composer, es decir mientrar ejecute el programa desde CCS no hay problema pero si polarizo el micro en la table de prototipo no pasa nada, PERO el 2553 si inicia cuando lo polarizo de cualquier manera ya sea conectando el Launchap aun antes de abrir CCS o por separado en la breadboard, creo que es un problema en la dirección del stack porque no se si es la misma para los dos de todas maneras pongo las lineas:

.cdecls C, LIST ,"msp430g2452.h" ;para el 2553 cambia por msp430g2553.h

para el stack en el 2553

_main mov.w #0280h,sp

No se si es la misma dirección para el 2452 y por eso no inicie al polarizar el micro como el 2553.

Cualquier ayuda será agradecida y cualquier aclaracion sobre mi pregunta (si no fui claro) diganme, porfavor y de antemano gracias.
11/09/2012 #2

Avatar de foso

Te fijaste como tenés configurado el watch-dog ????

StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT

Fijate también el vector de reset si está bien:


;------------------------------------------------------------------------------
; Interrupt Vectors
;------------------------------------------------------------------------------
.sect ".reset" ; MSP430 RESET Vector
.short RESET ;
.end


sino podrias postear todo tu programa para poder chequearlo aca.

saludos,
12/09/2012 #3


No creo que sea cuestion de programacion, solo que en ambos funciona bien, solo que el 2553 si empieza al polarizar el micro y el 2452 no lo hace.

Por cierto las lineas del watchdog y las de vectores de interrupcion estan correctamente escritas.
26/02/2013 #4


Dudas con interrupciones timer msp430G2553
Hola, estoy programando un MSP430G2553 (con la launchpad) en C. Quiero que mi programa me genere una interrupción cada 1 segundo que me apague y me encienda el led1 (pin p1.0).
Utilizo como fuente de reloj la ACLK = 32768 Hz.
Según mis cálculos y unos apuntes que tengo de una asignatura que cursé en la carrera, el cálculo de TACCR0 es el siguiente:
(TACCR0+1)(1/(frecuencia_del_reloj))=1 segundo (ya que quiero que cuando el Timer llegue a TACCR0 me genere una interrupción cada segundo) -> TACCR0 = frecuencia_del_reloj -1;

Nota: frecuencia_del_reloj es en este caso la ((frecuencia de ACLK) / ID_3 )=32768/8 = 4096.

Por lo que nos queda una TACCR0 = (32768/8)-1=4095;
Pues bien, este valor es el que le meto a TACCR0 (habilitando la interrupción por TACCR0) y no me genera una interrupción cada segundo, más bien diría que cada 2 segundos aproximadamente.

Os copio el código de mi programa:
Código:
#include <msp430g2553.h>



void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 como salida (para el led 1)
  CCTL0 = CCIE;                             //habilito la interrupcion por CCR0
  CCR0 = 4095; //para que me genere una interrupción cada segundo.
  TACTL = TASSEL_1 + MC_1 + ID_3; //fuente de reloj ACLK=32768Hz, modo up y el divisor de //de frecuencia ID_3=8 de modo que la frecuencia real es 4096Hz.

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
    P1OUT ^= 0x01;                            // Toggle P1.0
 }
Alguien sabe en qué me estoy equivocando, o como saber exactamente el período de cuenta?

Un saludo y gracias.
26/02/2013 #5

Avatar de Ardogan

Querés una interrupción cada 1 segundo o que el led se encienda/apague con una frecuencia de 1 segundo?.

Si es el 1er caso creo que el código es correcto, si es lo 2do entonces debería generar una interrupción cada 0.5 segundos; en una entrada a la interrupción enciende y en la otra apaga
27/02/2013 #6


En realidad estoy haciendo un programa más complejo, quiero mandar la tensión de una pila al ordenador para ello configuro el conversor AD (con el pin 1.5) y la UART. Entonces quiero que esa tensión de la pila me la mande cada 1 segundo al ordenador para después poder hacer una gráfica representando todos los valores de la tensión de la pila en función del tiempo, mi problema es que creo que esos valores no me los manda cada 1 segundo, sino cada más (no sé exactamente cuanto, creo que casi 2 segundos). Quiero saber con certeza cada cuanto tiempo le estoy mandando valores al ordenador para luego representarlos correctamente.
Os dejo el código:

Código:
#include "msp430g2553.h"
/*
 * main.c
 */

volatile char contador;

unsigned int bytetx, constante;


void configurotimerb(void)
{

	P1DIR |= 0x01;                            // P1.0 output
	TA1CCTL0 = CCIE;                             // CCR0 interrupt enabled
	TA1CCR0 = 4096;
	TA1CTL = TASSEL_1 + MC_1 + ID_3;
//Creo que está configurado para que me genere una interrupción cada segundo, de esta manera
//la variable contador se pondrá a 1 y en el main entrará en el if correspondiente a mandar los valores //(contenidos en el registro ADCMEM del conversor) a través de la UART
}

void configuroadc(void)
{
	ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10ON;
	ADC10CTL1 = ADC10SSEL_3 + INCH_5;
	ADC10AE0 |= BIT5; //pin 1.5
}

void configurouart(void)
{
  //Configuro la UART
  //Configuro los puertos de la UART
  P1SEL |= BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

  UCA0CTL1 |= UCSSEL_2; //SMCLK
  //Modulación a 1MHz y 9600 baudios:
  UCA0BR0 = 104;
  UCA0BR1 = 0;
  UCA0MCTL = UCBRS0;

  UCA0CTL1 &= ~UCSWRST; //Inicializamos la máquina de estados
}

void transmitir(char byte)
{
  // USCI_A0 TX buffer ready?
  while (!(IFG2 & UCA0TXIFG));
  UCA0TXBUF = byte;
  __delay_cycles(100);
}


void main(void) {
    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer
	
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;  // SMCLK = DCO = 1MHz

    P1DIR |= BIT0;
    P1OUT &= ~BIT0;
    contador=0;
    configuroadc();
    configurouart();
    configurotimerb();
    while(1){
    	ADC10CTL0 |= ENC + ADC10SC;
    	if (contador){
    		contador=0;
    		//ADC10MEM = 0x415E;
    		//bytetx = 0x02CC;
    		//constante = (0x02CC >> 8);
    		bytetx = ADC10MEM; // cargamos el byte menos significativo de ADC10MEM en bytetx
    		constante = (ADC10MEM >> 8);//cargamos los 2 bits mas significativos de ADC10MEM en constante
    		transmitir(bytetx); //transmito primero el byte menos significativo
    		//bytetx = (bytetx >> 8); /*Desplazo 8 bits a la derecha la variabla adcvalor
    		      //para transmitir los 2 bits más significativos de ADC10MEM*/
    		transmitir(constante);//transmito los 2 bits mas significativos
    		//if (ADC10MEM < 0x2CC) {
    		      //P1OUT &= ~0x40;                       // Clear P1.6 LED off
    		//}
    		//else {
    		      //P1OUT |= 0x40;                        // Set P1.0 LED on
    		//}
    	}
    	else {
    		_BIS_SR(LPM0_bits + GIE);
    	}
    }

    //_BIS_SR(LPM0_bits + GIE);                  Enter LPM0 w/ interrupt
    //__low_power_mode_0(); entramos en el modo bajo consumo LMP0

	//return 0;
}

// Timer A1 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  contador=1;
  __bic_SR_register_on_exit(CPUOFF);
}
Al configurar el TimerB para que me genere una interrupción cada 1 segundo, también me debería de mandar un dato al ordenador cada 1 segundo no? pero esto no es así realmente (creo que me lo manda cada 2 aproximadamente)

Un saludo y ayudarme por favor, ya que es de mucha importancia poder representar bien los valores.
Gracias.
27/02/2013 #7

Avatar de Ardogan

Veo que en este otro post mencionás que no tenés soldado el cristal en XIN/XOUT, así que puede estar pasando que el circuito de ACLK tome como fuente de reloj el oscilador interno VLO al detectar que no hay un cristal soldado. El VLO tiene una frecuencia de 12KHz, lo que explicaría que los tiempos sean más del doble de lo esperado.
¿Puede ser eso?.
En tal caso deberías usar un valor en CCR0 de:
faclk = fvlo/aclk_div = 12000/8 = 1500 Hz
(CCR0 + 1) / faclk = 1 segundo
CCR0 = 1 * 1500 - 1 = 1499

¿Con ese valor entra cada 1 segundo?
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.