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
Hast Du den Stackpointer initialisiert? Der muß vor dem ersten Interrupt oder Unterprogrammaufruf auf das RAM zeigen Reiner
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???
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.