MSP430 Timer_A Interrupt

Gast #891816
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
}
Gast #891903
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!
Gast #891945
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!!!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.