Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer_A Interrupt


von JbO (Gast)


Lesenswert?

hallo,

bin auf der suche nach jmd der mir beim msp430F149 helfen kann.

habe eigentlich nur vorgehabt den timer_A und die verschiedene modis(up, 
cont. ...) auszuprobieren.

das programm sollte insgesamt 2 interrupts auslösen. beim 1. interrupt 
wird eine led( an Port6.1) eingeschaltet, beim 2. interrupt 
ausgeschaltet. verwendet wird der continuous mode.

dabei wird der erste wert in TACCR0 hinterlegt, der andere in TACCR1.

das problem, das ich habe ist, das der inetrrupt nicht ausgelöst wird.

verwendet wird der compiler ICC7 und der debugger NOICE

vielleicht kann sich ja jmd das ma anschaun..... :)



#include <msp430x14x.h>
#include <msp430def.h>

#pragma interrupt_handler timer_a_isr1: TIMERA0_VECTOR timer_a_isr2: 
TIMERA1_VECTOR


void main(void)
{

  _STOP_WATCHDOG(); // der Watchdog Timer wird gestoppt
            // (enthalten in msp430def.h)

  P6SEL = 0x00;   //alle Pin an Port6 als STD. I/O
  P6DIR = 0xFD; // bis auf 6.1, sind alles Ausgänge

   //Timer_A

   // TACTL |= TACLR;  // TAR Inhalt löschen

   timera_init();   // Initialisierung des Timers aufrufen

   TACTL = MC_2;   // Timer_A starten
                //MC_1 --> Up Mode
                //MC_2 --> Continuous Mode
                   //MC_3 --> Up/Down Mode
   _BIS_SR(GIE);     //GIE = 1, globale Interruptfreigabe

   while(1)  //es wird auf Interrupts gewartet -- Endlosschleife!!
  {
  }


} //main


void timera_init()
{
    TACTL = TASSEL_2 + ID_3 + TAIE ;
                                                //ID_3 --> Clock/8 
//TASSEL_2 --> SMCLK
                             // TAIE --> Interrutp Freigabe

  TACCTL0 = CCIE;   //Interrutp Freigabe
         TACCTL1 = CCIE;

  //TACTL |= TAIE;   //freigeben

  TACCR0= 800;
  TACCR1= 100;

}


void timer_a_isr1() //für TACCR0 zuständig --> LED an!
{
  TACCR0+= 800;
  P6OUT ^= 0x00;  //LED an


}

void timer_a_isr2() //für TACCR1 zuständig --> LED aus!
{
  TACCR1+=100;
  P6OUT ^= 0x01;  //LED aus
}

von Stefan (Gast)


Lesenswert?

Ohne jetzt alles durchzulesen...
1
TACTL = MC_2;   // Timer_A starten
setzt Deine ganze TMR_A Konfiguration, inkl. Interrupts zurück!

Es muss verodert werden:
1
TACTL |= MC_2;   // Timer_A starten

von Stefan (Gast)


Lesenswert?

Das Hauptproblem ist, dass Du mit
1
TACTL = MC_2;   // Timer_A starten
den Clock auf TACLK setzt, der aber vermutlich nicht vorhanden ist, d.h. 
Dein Timer bleibt schlicht und ergreifend stehen!

von JbO (Gast)


Lesenswert?

danke, das ging ja fix!

da hat wirklich nur das "bitweise oder" gefehlt...


allerdings mußte ich zusätzlich noch in der ISr jeweils noch das GIE-Bit 
setzen....--sonst hing der da drin fest...

jetz geht aber alles.

DANKE!

von Stefan (Gast)


Lesenswert?

>allerdings mußte ich zusätzlich noch in der ISr jeweils noch das GIE-Bit
>setzen....--sonst hing der da drin fest...
Du hast drei IRQ's freigegeben: Timer-Overflow (TAIE), CCR0 und CCR1.
Vermutlich wolltest Du aber nur die beiden letzten haben...
... der TAIE und CCR1 (und CCR2) teilen sich einen IRQ-Vektor, d.h. 
Deine timer_a_isr2() wird sowohl durch CCR1 als auch durch 
Timer-Overflow angesprungen. Da sich mehrere Quellen einen IRQ-Vektor 
teilen, musst Du hier das jeweilige IFG-Flag in der ISR selbst 
zurücksetzen oder das das TAIV-Register auslesen.
Ansonsten bleibt das IFG gesetzt und führt zum sofortigen 
Wieder-Ausführen der ISR!!!
User-Guide: Timer_A Interrupts lesen!!!

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.