Forum: Mikrocontroller und Digitale Elektronik MSP430 -Timer/Interrupt Handling


von Maddin (Gast)


Lesenswert?

Hallo ihr

Ich arbeite hier mit einem MSP430 und möchte an bestimmten Pins ein 
Rechtecksignal (also Ein/AUS) mit f=1kHz haben. Dazu soll Timer_A und 
natürlich ein Interrupt genutzt werden. Im Anhang findet ihr die kleine 
Datei.
Das Programm wurde schon auf einen MSP übertragen und arbeitet richtig. 
Ich verstehe jedoch nicht, warum dies im Continious-Mode funktioniert? 
Timer_A zählt doch in diesem Modus unabhängig von dem Wert in TACCR0 
oder??

Wodurch genau wird nun dieser Interrupt ausgelöst (ich weiß es werden 
TAIFG und EQUx gesetzt) aber wodurch wird zu der Stelle "__interrupt 
void Timer_A (void)" gesprungen.. Und warum muss man dort nochmal den 
Offset zu TACCR0 hinzufügen?

Hoffe ihr könnt mir helfen...

von Christian R. (supachris)


Lesenswert?

Die Datei fehlt. Du kannst den Interrupt ganz weglassen, wenn du die 
Timer Output Units benutzt, die schalten die Pins direkt in Hardware. 
geht natürlich nur, wenn ein Ausgang an einem der TAx Pins hängt. 
Ansonsten läuft das so. Im Cont. Mode zählt der Zähler einfach durch, 
von 0x0000 bis 0xFFFF und fängt dann wieder bei 0x0000 an. Der Interrupt 
springt an, wenn der Zählerstand den Wert im Register TACCR0 erreicht 
hat. Das Offset ist in dieser Betriebsart nötig, um den nächsten 
Vergleichswert in das TACCR0 zu laden. Das Offset ist also der Abstand 
der Interrupt in TA-Taktzyklen. Wenn du das nicht machst, kannst du die 
Frequenz nicht einstellen, denn dass wird der Int. nur alle 65536 Takte 
ausgelöst.

von Maddin (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist die Datei.

Wird TACCR0 denn nach dem auslösen wieder auf 0 gesetzt? Wenn ich den 
Up-Mode verwende, dann brauche ich diesen Offset nicht mehr oder? Wenn 
ich die Timer Output Units verwende, dann wird dazu auch das OUTMOD 
benötigt oder? Also toggeln, set/reset usw. Ich hab mich nämlich 
gewundert, dass der Interrupt ohne festlegen dieses OUTMOD funktioniert.
Was genau meinst du mit TAx Pin? Ist das was anderes als OUTx?

von Christian R. (supachris)


Lesenswert?

Der Wert im TACCR0 bleibt stehen, bis du ihn selbst änderst. Wenn du ihn 
nicht änderst, muss der Timer erst wieder einmal komplett durch laufen, 
bis er wieder den Interrupt auslöst. Deshalb wird der in jedem Int. 
verändert.
Bei den OutMods musst du dir einen aussuchen, der passt, man kann damit 
ja alle möglichen Wellenformen erzeugen. Beim Up-Modus zählt der Timer 
bis zum Wert in TACCR0 und springt dann wieder auf Null zurück. Kannst 
du auch nehmen, aber da kannst du den Timer halt nur für ein 
Ausgangssignal benutzen. Willst du verschiedene Ausgangssignale mit 
verschiedenen Frequenzen und Wellenformen erzeugen, ist der Continuos 
Mode besser.
Die direkte Ausgabe der OutModes geht nur auf bestimmten Pins, das sieht 
man im Datenblatt. Outx ist nur das interne Signal, was auch noch für 
verschiedene andere Sachen benutzt werden kann( ADC z.B.), die Ausgabe 
erfolgt an den Pins, die als Zweitfunktion TAx dran stehen haben.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

(Verschoben, da der MSP430 nun definitiv kein PC ist)

von Maddin (Gast)


Lesenswert?

Der Sinn des Timers ist doch in meinem Beispiel, dass er bis zu TACCR0 
zählt, einen Interrupt auslöst, auf null springt und dann wieder weiter 
zu TACCR0 zählt um den nächsten Interrupt auszulösen. Versteh echt nicht 
warum man dann diesen OFFSET wieder dazu zählt.
Hat der OUTMOD auch Einfluss in meinem Beispiel, wo ich ja diese 
Timer-Ausgänge garnicht benutze? Ich denke nicht oder??

von Christian R. (supachris)


Lesenswert?

Maddin schrieb:
> Der Sinn des Timers ist doch in meinem Beispiel, dass er bis zu TACCR0
> zählt, einen Interrupt auslöst, auf null springt und dann wieder weiter
> zu TACCR0 zählt um den nächsten Interrupt auszulösen. Versteh echt nicht
> warum man dann diesen OFFSET wieder dazu zählt.

Nein, das würde er im Up-Mode machen. Du hast den Continous Mode 
eingestellt, da zählt er immer voll.
Du kannst natürlich den Up-Mode nehmen und dann einmal einstellen und 
fertig. Aber aufpassen: Nur einen Interrupt aktivieren: Entweder den 
TACCR0 Interrupt, oder den Timer A Overflow Interrupt. Die kommen dann 
nämlich direkt hintereinander.
Lies einfach mal das Kapitel im User Guide durch, da ist das super 
erklärt.

> Hat der OUTMOD auch Einfluss in meinem Beispiel, wo ich ja diese
> Timer-Ausgänge garnicht benutze? Ich denke nicht oder??

Nö, dann natürlich nicht. Du könntest es aber mit den OutModes machen, 
denn die Timer A Ausgänge liegen bei fast allen MSP430 an Port 1.

von Maddin (Gast)


Lesenswert?

Ok, fasse ich mal kurz zusammen.

Wenn im Up-Mode der TACCR0 Wert erreicht wird, wird das TACCR1 CCIFG 
Flag gesetzt(wenn CCIE gesetzt)? Kehrt der Timer zu 0 zurück, also 
unmittelbar einen Schritt weiter, wird das TAIFG (overflow) FLag 
gesetzt??
Wie aktiviere ich den Overflow-Interrupt?

Ich verstehe immer noch nicht, was jetzt dazu führt, dass der Interrupt 
überhaupt ausgeführt wird, bzw. wie die im Interrupt-Moment gesetzten 
Bits einen Sprung zu "#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)" auslösen. Den User-Guide hab ich mir 
schon durchgelesen, nur sind halt diese Fragen noch nicht ganz klar. 
Hoffe man kann mir helfen...

von Christian R. (supachris)


Lesenswert?

Maddin schrieb:
> Ok, fasse ich mal kurz zusammen.
>
> Wenn im Up-Mode der TACCR0 Wert erreicht wird, wird das TACCR1 CCIFG
> Flag gesetzt(wenn CCIE gesetzt)?

Fast. Es wird natürlich das TACCR0 Flag gesetzt. Das hat sogar einen 
eigenen Interrupt-Vektor, eben den TIMERA0_VECTOR.

> Kehrt der Timer zu 0 zurück, also
> unmittelbar einen Schritt weiter, wird das TAIFG (overflow) FLag
> gesetzt??

Genau.

> Wie aktiviere ich den Overflow-Interrupt?

Da müsstest du im TACTL Register direkt das CCIE setzen.
Dann musst du den TIMERA1_VECTOR benutzen, und das TAIV auswerten, denn 
die restlichen TACCR und der Overflow teilen sich einen Vektor.

> Ich verstehe immer noch nicht, was jetzt dazu führt, dass der Interrupt
> überhaupt ausgeführt wird, bzw. wie die im Interrupt-Moment gesetzten
> Bits einen Sprung zu "#pragma vector=TIMERA0_VECTOR
> __interrupt void Timer_A (void)" auslösen.

Das macht der Interrupt-Controller, also direkt die Hardware, wenn die 
Interrupts entsprechend aktiviert sind.

von Maddin (Gast)


Lesenswert?

Das CCIE befindet sich doch im TACCTLx Register.
ICh dachte CCIE steht dafür den TACCRx Interrupt freizuschalten? Warum 
aktivert man damit jetzt aufeinmal das Overflow-Interrupt. Ist dazu 
nicht TAIE und TAIFG im TACTL Register notwendig?

von Christian R. (supachris)


Lesenswert?

Sorry, ich meinte natürlich das TAIE Bit. War noch etwas zeitig vorhin. 
TAIE schaltet den Overflow Interrupt frei.

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.