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...
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.
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?
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.
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??
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.
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...
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.
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?