Anfängerfragen MSP430 Interrupts Timer_A

Gast #1845128
Hallo,

Ich möchte ein C_Programm für einen MSP430 schreiben.
Bei zwei Sachen bin ich mir unsicher und habe momentan nicht die 
Möglichkeit das zu testen, darum zwei (vermutlich) einfache Fragen:

1)
Ich möchte den Timer_A mit Interrupts verwenden.
Wenn ich den Interrupt für TACCR0==TAR; (Comparemodus) aktivieren 
möchte, geht das ja mit der Zeile:
1
TACCR0=CCIE;

Nun hab ich aber auch die Version gesehen:
1
TACCR0 |= CCIE;
folgt daraus, dass ich mit
1
TACCR0 &= ~CCIE;
den Interrupt inaktiv schalten kann??


2)
Ich möchte "die Zeit messen" die verschiedenen Funktionen brauchen um 
diese "Zeitwerte" dann weiter zu verarbeiten und schliesslich in eines 
der TACCRx-Register zu schreiben.
Das würde ich gerne so machen:
1
//Offset messen
2
TAR=0;
3
Messfehler=TAR;
4
//Jetzt die Messung machen
5
TAR=0;
6
foo();
7
Zeit=TAR-Messfehler;

Kann man das so machen, oder gibt es bessere Methoden?



Vielen Dank fürs Lesen
moonstone
1) Ja, natürlich. Das hat mit MSP430 nix zu tun, überall schreibt und 
löscht man einzelne Bits so.

2) Das sollte klappen. Die Geschichte mit dem Messfehler ist vielleicht 
überflüssig, denn es ist ja bekannt und immer gleich, wieviele 
CPU-Zyklen der Schreibbefehl auf TAR dauert.
Gast
moonstone schrieb:
> 1)
> Ich möchte den Timer_A mit Interrupts verwenden.
> Wenn ich den Interrupt für TACCR0==TAR; (Comparemodus) aktivieren
> möchte, geht das ja mit der Zeile:TACCR0=CCIE;
> Nun hab ich aber auch die Version gesehen:TACCR0 |= CCIE;folgt daraus, dass ich 
mitTACCR0 &= ~CCIE;den Interrupt inaktiv schalten kann??

Bei meinem Compiler muss ich aber
1
TACCTL0 |= CCIE;
setzen, um den IRQ zu aktivieren.

Zum anderen macht
1
TACCTL0 = CCIE;
durchaus auch Sinn, weil dadurch auch gleich das CCIFG-Flag gelöscht 
wird!
Gast
Hallo,

jetzt hab ich nochmal eine Frage ...

Die ISR würde ich gerne so aufbauen:
1
#pragma vector=TIMERA1_VECTOR
2
__interrupt void Timer_A(void)
3
{
4
switch (__even_in_range(TAIV, 10))               
5
  {
6
     //TACCR1:
7
     case 2: 
8
          MachWas1();
9
          TACCTL1 &= ~CCIE;       
10
      break;
11
    
12

13
      //TACCR2:
14
      case 4:
15
           MachWas2();
16
           TACCTL2 &= ~CCIE;
17
      break;
18
      
19
      
20
      //TAR Overflow 
21
      case 10: 
22
           Overflow_Counter++;
23
      break;
24
    }
25
}


Aber falls ich einen anderen Beitrag hier im Forum richtig verstanden 
habe, schalte ich zusammen mit dem Interrupt für TACCR1 auch den für die 
Overflows aus.
Den brauche ich jedoch die ganze Zeit ...


Würde mich sehr freuen, wenn mir nochmals jemand eine Rat geben könnte.
Gruß
moonstone
Gast
moonstone schrieb:
> Aber falls ich einen anderen Beitrag hier im Forum richtig verstanden
> habe, schalte ich zusammen mit dem Interrupt für TACCR1 auch den für die
> Overflows aus.

Nö!
Overflow IRQ wird in TACTL mittels TAIE (de-)aktiviert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.