Forum: Mikrocontroller und Digitale Elektronik Anfängerfragen MSP430 Interrupts Timer_A


von moonstone (Gast)


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

von moonstone (Gast)


Lesenswert?

Hallo,

weiß niemand Rat?
Oder sind alle MSP430 Experten Tatortfans?  ;)


Liebe Grüße
moonstone

von Christian R. (supachris)


Lesenswert?

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.

von André H. (andrekr)


Lesenswert?

zu 1: Beim C18-Compiler sind & und | vertauscht, weil die Konstanten 
invertiert sind. ;) Keine Ahnung, warum...

von Stefan (Gast)


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!

von moonstone (Gast)


Lesenswert?

Nabend,

Danke für eure Antworten!

moonstone

von moonstone (Gast)


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

von Stefan (Gast)


Lesenswert?

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.

von moonstone (Gast)


Lesenswert?

Danke Stefan, danke Forum!
Ihr seid die Besten :)

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.