mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Probleme


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den Stackpointer initialisiert?

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

Reiner

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.