Forum: Compiler & IDEs Speicherverlust bei Interrupt


von Thom (Gast)


Lesenswert?

Hallo,

ich habe einen Interrupt-gesteuerten Timer gebastelt, der mir sec, min, 
hour über usart ausgeben soll. funktioniert auch soweit.

jetzt habe ich zusätzlich einen Externen Interrupt eingebaut, der es mir 
erlaubt die Zeit nur auf Tastendruck über die serielle schnittstelle 
auszugeben. Dabei rufe ich meine "usart_tx"-funktion in der ISR() des 
externen Inetrrupts auf.

Das Problem ist:
nach jedem Externen Interrupt, beginnt der Timer wieder von vorne. 
sprich die werte (sec, min, h) werden zurückgesetzt.

woran liegt das, muss ich die Timer-Variablen irgendwo sichern/kopieren, 
bevor ich sie an die Uart-Ausgabe übergebe? habe sie als "volatile 
unsigned int" deklariert.

Danke im Voraus

von (prx) A. K. (prx)


Lesenswert?

Du landest aufgrund eines Programmfehlers im Reset oder an Adresse 0. 
Den Rest hat mir die Glaskugel nich varraten.

von Stefan (Gast)


Lesenswert?

Hallo Thom,

beim Eintritt in die Interruptroutine solltes du die Register, die du 
veränderst mit PUSH auf dem Stack sichern. Und am Ende mit POP in 
umgekehrter Reihenfolge wieder herstellen (FILO).

Gruß
Stefan

von Falk B. (falk)


Lesenswert?

Quelltext?
Als Anhang.

von Gast (Gast)


Lesenswert?

"Wenn ich bei meinem Auto zuviel Gas gebe, klapperts vorne links. Was 
ist da nicht in Ordnung?"

Das kann ungefähr 328 verschiedene Gründe haben. Ohne Source darfst Du 
mehr als irgendwelche Ins-Blaue-Vermutungen nicht erwarten.

von Thom (Gast)


Angehängte Dateien:

Lesenswert?

sry, für den fehlenden quelltext. habs jetzt angehängt. hoffe, das liest 
jetzt noch einer.

anbei main.c und die uart_funktionen

grüsse
thom

von Uwe .. (uwegw)


Lesenswert?

Du aktivierst den Timer1A Compare Match Interrupt, hast aber keine 
Handler dafür...

von Thom (Gast)


Lesenswert?

den hab ich noch wegen der auskommentierten pwm-ausgabe aktiviert. das 
problem bleibt aber bestehen, auch wenn ich den timer1 compare-match 
interrupt nicht aktiviere.
du meinst doch das setzen des OCIE1A-Bits, oder? (TIMSK =(1<<OCIE1A)

von Karl H. (kbuchegg)


Lesenswert?

Du hast auch noch den Transmit Complete Interrupt enabled ohne einen 
Handler dafür zu haben.

Wenn dein µC resettet, dann hat das meistens 2 Ursachen
* ein Hardwareproblem, welches die Versorgungsspannnug versaut
* irgendein Interrupt, für den es keinen Handler gibt ist eingeschaltet.
  Sowas findet man, indem man alle Konfigurationen durchgeht und
  nachsieht welche Bits in die Konfig-Register geschrieben werden.
  Und zwar ausnahmslos alle!

von Thom (Gast)


Lesenswert?

danke für die hilfe. hab das transmit complete Interrupt enable 
deaktiviert, jetzt läufts ohne probleme:)

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.