Forum: Mikrocontroller und Digitale Elektronik Interrupt Probleme


von Matthias (Gast)


Lesenswert?

HI Leute

Habe folgendes Problem teste gerade mein lauflicht programm mit dem AVR 
Studio Simulator! und es ist so

es treten timerinterrupts auf und der führt dann etwas aus und dann 
SOLLTE er doch wieder da hinzurück springen wo er aufgetreten ist und 
den BEFEHL ausführen ODER????

jedenfalls macht er das nicht der Interrupt tritt zb bei
cpi bla,0b00000000 und macht des was er soll und wenn er zurück hüpft 
ist er beim nächsten befehl und hat aber den CPI befehl nicht ausgeführt 
denn er wenn es richtig verglichen wäre dann dürfte er nicht mit breq 
nicht springen tut er aber doch!

WAS KANN DAS SEIN?

Sollte das nicht so sein dass der BEFEHL bei dem der Interrupt auftritt 
auf ALLE FÄLLE FERTIG GEMACHT WIRD wenn er angefangen wurde bzw wenn der 
interrupt während des ausführens des befehls auftritt dass er dann 
zumindest nachher fertig gmacht wird bzw neu gestartet wird?????

was kann ich gegen dieses problem tun??

Grüße Posseidon

von Reiner (Gast)


Lesenswert?

Hast Du den Stackpointer initialisiert?

Der muß vor dem ersten Interrupt oder Unterprogrammaufruf auf das RAM 
zeigen

Reiner

von Matthias (Gast)


Lesenswert?

wie mach ich dass ich hab ihn initialisiert aber nur so

ldi    R16,high(RAMEND)
out    SPH,R16
ldi    R16,low(RAMEND)
out    SPL,R16


passt des so???

von Reiner (Gast)


Lesenswert?

Stimmt so.

Hast Du den richtigen AtmelTyp angegeben? RAMEND ist anbhängig vom Typ.


Ein Befehl wird nicht neu gestartet. Ein begonnener Befehl wird zuende 
geführt erst dann wird unterbrochen.
Wenn Dein Programm nach dem CPI weitermacht stimmts noch, aber wenn der 
nachfolgende Befehl BEQ falsche Flag erhält, könnte es sein das Du in 
Deiner Interruptroutine die Flags nicht rettest und am Ende 
wiederherstellst. Alle Registerinhalte, die in einer Interruptroutine 
verändert werden, müssen immer auf dem Stack gesichert und wiedergeholt 
werden.

Reiner

von Matthias (Gast)


Lesenswert?

aber mit CPI ändere ich doch nichts?
ich verwende kein register in der Interruptroutine dass ich auch in der 
normalen routine verwende

atmel typ`?? des mit stack pointer initialisieren hab ich abgeschrieben 
ich hab nur obn die def eingegeben des wars!

grüße

von mikki merten (Gast)


Lesenswert?

Mit CPI änderst du ja das SREG (Flags)
Also am Beginn jeder INT-Routine

in   Rx,SREG
push Rx

und und am Ende

pop  Rx
out  SREG,Rx

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.