Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer Interrupt-Problem


von Kristin T. (kristin)


Angehängte Dateien:

Lesenswert?

Hallo,
ich programmiere aktuelle mit der CCS-Entwicklungsumgebung einen 
MSP430-F5437. Ich habe eine einfache Timer-Initializierung geschrieben, 
die alle 125 ms einen Interrupt auslösen soll (Clock = ACLK, Timer zählt 
bis 4096). Bei jedem Interrupt wird eine Variable "time" (Wert = 1000 = 
1s) um 125 verringert, sodass nach 8 Interrupts 1 Sekunde voll ist (time 
== 0) und im main-Programm die If-Anweisung erfüllt ist.

Mein Problem: Nach dem ersten Interrupt wird das Programm resetet und 
starten von vorne. (Daher ist natürlich die Time Varibale wieder 1000 
und ich erreiche nie das ziel time == 0) Woran kann das liegen?
(Watch dog ist natürlich aus!)

Anliegend findet ihr meinen Code. Ich hoffe, ihr könnt mir helfen.
LG Kristin

von HutHut (Gast)


Lesenswert?

Wenn ich das richtig beurteile wird deine time-Variable sowieso nie null 
werden. 125 ok, aber nicht 0.

von HutHut (Gast)


Lesenswert?

Mein Fehler wird doch 0 ;|

von Karl H. (kbuchegg)


Lesenswert?

Code bitte nicht als GIF.
Code ist einfach nur Text, denn kann man wunderbar auch so posten. Ist 
für dich einfacher und für uns auch.


Zum Problem: volatile!

FAQ
Was hat es mit volatile auf sich?


> Nach dem ersten Interrupt wird das Programm resetet und starten von vorne.

Woher weißt du das? Denn
> ... und ich erreiche nie das ziel time == 0 ...
kann auch andere Ursachen haben. Eine davon ist zb, dass du deine time 
Variable nicht volatile gemacht hast.

von Kristin T. (kristin)


Lesenswert?

> Nach dem ersten Interrupt wird das Programm resetet und starten von vorne.

Woher weißt du das? Denn

Das weiß ich daher, weil ich im oberen Teil ein Break-Point gesetzt habe 
und er nach jedem interrupt dort wieder landet und nicht in der 
while-schleife.
Nach dem ersten interrupt steht die time-varibale auf 875 (1000-125).
Zu Beginn des nächsten steht sie allerdings wieder auf 1000. Daran 
ändert auch leider volatile nichts :-(

von Mrs MSP (Gast)


Lesenswert?

Wirf einmal einen Blick auf die Timer Initialisierung und speziell dabei 
auf die Interrupt Freigabe. Für den Timer stehen zwei Vektoren zur 
Verfügung. Du hast beide demaskiert, aber behandelst nur einen.

Noch zwei Tipps:
1. CCR0 muss nicht nachgeladen werden. Der Wert bleibt erhalten.
2. Das Interrupt-Flag wird bei der ISR-Bearbeitung durch die Hardware 
gelöscht.

Hilfreich ist das Kapitel Family User Guide. Es gibt auch ein 
Code-Beispiel hier im Forum.

Erzähl wie es läuft.

von Kristin T. (kristin)


Lesenswert?

Mrs MSP schrieb:
> Wirf einmal einen Blick auf die Timer Initialisierung und speziell dabei
> auf die Interrupt Freigabe. Für den Timer stehen zwei Vektoren zur
> Verfügung. Du hast beide demaskiert, aber behandelst nur einen.

Ohje, du hast Recht! Habe jetzt den TAIE auf 0 gesetzt und es 
funktioniert!
Vielen lieben Dank!

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.