Anfängerfragen MSP430 Interrupts Timer_A

Gast #1845128
Lesenswert?

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
Gast #1845338
Lesenswert?

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 #1846518
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren