PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ISR Datenübertragung zum Hauptprogr. funktioniert nicht



hardy78
27.09.2009, 13:15
Hallo Robotergemeinde.

Ich möchte einen Motor per PWM-Signal steuern. Das PWM-Signal erzeugt ein ATMEGA8 mit Timer1 (OCR1B). Das Steuerelement ist ein Inkrementalschalter mit 2 Phasen und 20 Raststellungen/Umdrehung.
Das Drehen des Inkrementalschalters wird vom externen Interrupt INT0 erkannt. In der entsprechenden ISR wird dann ein Wert erhöht (rechts herum drehen) oder reduziert (links herum drehen). Der Wert soll dann im Hauptprogramm OCR1B zugeordnet werden, was dann ein Tastverhältnis von xx % ergibt.

Problem ist jetzt, dass die Datenübertragung der Variable "wert" zum Hauptprogramm nicht funktioniert. Sprich, das Tastverhältnis bleibt wie es ist...

Ich vermute stark, dass ich einen Programmierfehler gemacht habe, bitte schaut Euch das Programm im Anhang einmal an. Vielleicht findet Ihr ja was da falsch ist.
Danke und Gruß, Hardy78

Besserwessi
27.09.2009, 18:26
Bei den Variablen müßte es wohl volatile unsinged int sein, nicht unsigned volatile int. Ganz sicher bin ich mir aber nicht was die falsche Form macht. Ich hätte da ein Warnung oder gar einen Fehler erwartet.


In der ISR braicht man nicht das Interrupt flag löschen und wieder setzen. Das wird schon in Hardware bzw. Am Ende der ISR mit dem ASm befehl RETI gemacht. Das cli() ist einfach nur wirkungslos, das sei() ist dagenen schon gefährlich: wenn ein 2 ter interrrupt auftritt wäredn die ISR läuft, wird der dann schon vor dem Ende Aufgerufen. Im Schlimsten Fall könnte es zu einem Stack Überlauf kommen.

hardy78
27.09.2009, 19:26
Hallo Besserwessi.

Danke erstmal für deine Antwort. Du hast recht, es muss wohl volatile unsigned int heißen. Mein compiler hat keinen Fehler, Warnung herausgebracht. Komisch. sei() und cli() habe ich aus den ISR entfernt
Das Problem ist aber noch nicht behoben.

Eine kleine Ergänzung:

Habe herausgefunden, dass der Variablewert ein einziges Mal vom Hauptprogramm übernommen wird nachdem oder während die ISR abgearbeitet wird. Danach wird der Variablewert wieder auf den Ursprungszustand (hier: 4000) gesetzt. Warum ist das so und wie bekomme ich es hin, dass der in der ISR berechnete Variablewert dauerhaft vom Hauptprogramm übernommen bleibt?

Danke für Eure Hilfe
hardy78