www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer_A Interrupt


Autor: JbO (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Hauptproblem ist, dass Du mit
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!

Autor: JbO (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

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.