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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.