Forum: Mikrocontroller und Digitale Elektronik IAR & MSP430 Timer ISR problem [english response...please]


von Valy V. (valyv)


Lesenswert?

Hello(Guten Tag)

1.Do you post answers in english, too?
2.If YES, can someone help me with a timer ISR problem in IAR EW for
Msp430f149?

von Rahul (Gast)


Lesenswert?

what is the problem?

von Valy V. (valyv)


Lesenswert?

I did a simple C program for a target board.

I was supposed to blink 2 leds (one in main function and one from
TimerA ISR). The one from main() works (it blinks). The one from TimerA
doesn't (stays off).

When I inspected registers from IAR EW (Debugging with FETDebugger = on
the target board)I noticed that TAR doesn't change.

I'm puzzled...why doesn't timer A start? Is there a problem with the
source code? Is there something about IAR?

I initialised registers for basic clock, watchdog(so it won't reset
the software), timer A, port.
Also on the hardware side: board is powered.
There is an inpuit clock at around ~5MHz available...but for now I went
with DCO.


I can't find anything wrong in C
Below is the source code:



#include <msp430x14x.h>
#include "types.h"
//u8=unsigned char u16=unsigned int


u16 counter=0;
u32 counter2=0;
u8 toggle=0;
u8 toggle2=0;

#pragma vector = TIMERA1_VECTOR  //interupt syntax for IAR 2.x
    __interrupt void timer_isr(void)
{
    counter++;

    if (counter>32)  //999
    {
        counter=0;

            if (toggle)
                P2OUT &= ~0x04;
            else
                P2OUT |= 0x04;
            toggle ^=1;

    }
}


void main()
{
    WDTCTL = WDTPW + WDTHOLD;

    P2SEL = 0x00;
  P2DIR = 0xff;
  P2OUT = 0xff;
  P2IE  = 0x00;

  P2IFG = 0x00;
  P2IES = 0x00;

     DCOCTL = DCO0 + DCO1 + DCO2;
    BCSCTL1 = XT2OFF + RSEL0 + RSEL1 + RSEL2 ;

  BCSCTL2 = 0;

    TAR = 0;
  TACTL = MC_0;

   //external input clock ~5MHz although not used
     TACCR0=999;

    TACTL = TASSEL_1 + ID_0 + MC_1 +TAIE;
//TACTL= TASSEL_2  + ID_3+MC_1+TAIE;

  _EINT();
  __bis_SR_register(GIE);

  while(1)
  {
    counter2++;
        if (counter2>20000)
        {
            counter2=0;
            if (toggle2)
                P2OUT &= ~0x02;
                //P2OUT=0x00;
            else
                //P2OUT &= ~0x02; //0x4;
                P2OUT|=0x02;
            toggle2 ^=1;
        }
  }
}

von Bepi (Gast)


Lesenswert?

Hi

I think you have forget to enable the Capture/compare Interrupt.

Add to your source :

TACCTL0 = CCIE; // IRQ enable
TACTL = TASSEL_1 + ID_0 + MC_1 +TAIE;

hope this will work

CU
Bepi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.