mikrocontroller.net

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


Autor: Valy Voiculescu (valyv)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
what is the problem?

Autor: Valy Voiculescu (valyv)
Datum:

Bewertung
0 lesenswert
nicht 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;
        }
  }
}

Autor: Bepi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.