www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ständig interupts


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein programm für den 8515 beginnt wie folgt:

.cseg
rjmp  Initial
rjmp  Inter0
.org 0x004
rjmp  CompA

wenn ich den betrieb mit dem avr-studio simuliere, springt er ständig in 
die Inter0-routine und manchmal auch in die Initial. dabei zeigt das 
GIFR keine interupts an. ich glaube, das es keine echten interupts sind, 
da wenn er mal wieder Inter0 abarbeitet und ich im GIFR einen echten 
interupt simuliere, springt er zu Inter0 und wenn er einmal duch ist 
wieder an die zurück.

woran liegts?
Gruß Patrick

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab den eindruck, daß die zeilen rjmp Initial und rjmp Inter0 für das 
hauptprogramm gehalten werden. wenn der simulator initial abgearbeitet 
hat geht es mit Inter0 weiter und dann wieder mit Initial.
hab noch hinter
.cseg
.org 0x000
  .
  .
  .
rjmp CompA
.org 0x00D

Main:
  nop
jmp Main

eingefügt. hilft alles nichts.

was auch nicht funktioniert ist die endlosschleife in der main.
der simulator führt den jmp Main nicht aus.
bei einer anderen schleife im programm hab ich das gleiche problem.
Gruß Patrick

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gib doch mal das ganze programm!

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.def  tmp = r16
.nolist
.include "8515def.inc"
.list

.cseg
.org 0x000
       rjmp Initial
       rjmp Inter0
.org 0x004
       rjmp CompA
.org 0x00D

Main:
        nop
        jmp Main

Initial:
        ldi tmp, High(RAMEND)
        out $3E, tmp
        ldi tmp, Low(RAMEND)
  out $3D, tmp
  in tmp, $35
  ori tmp, 0b00000011
  out $35, tmp
  in tmp, $3B
  ori tmp, 0b01000000       out $3B, tmp
  in tmp, $39
  ori tmp, 0b01000000
  out $39, tmp
  ldi tmp, 0x3D
  out $2B, tmp
        ldi tmp, 0x09
  out $2A, tmp
  sei
        reti

Inter0:
  in tmp, $2E
  ori tmp, 0b00000011
  out $2E, tmp
Loop1:
  nop
  sbic $10, 2           jmp Loop1
  reti

Autor: Denis Gérard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin, also eigentlich einfach*g

du springst doch in initial un kehrst dann durch reti zurück und der 
nächste befehl ist dann der interuptvektor
lasse ihn doch einfach nach main springen und verwende statt jmp mal 
rjmp

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und reti kehrt an eine nicht definierte stelle zurück, da rjmp ja keine 
rücksprungadresse auf dem stack ablegt...

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey, patrick! änder mal deine emailadresse! immer wenn ich poste (und du 
dann ne banachrichtigung per email bekommst), bekomme ich eine 
maildelivery error von deinem mailserver cs.tu-berlin.de!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AT90S8515 kennt keinen "jmp" Befehl.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke erst mal.
wollte aber mit absicht kein rjmp nehmen, da ich doch bei jeder schleife 
mir den stack zuschütte. gibt es gegen das problem auch ne lösung?
was macht der prozessor bei starten? das ganze ist doch nichts anderes 
als ein reset. bin immer davon ausgegangen, daß er deshalb die 
reset-routine ausführt und dann automatisch an 0x00d springt, weil dort 
das eigentliche programm erst beginnt, da der teil davor 
interuptverwaltung ist.

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieso das denn??? rjmp lässt den stack unangetastet!!! Nur rcall packt 
die rücksprungadresse auf den stack!

beim reset wird der Program Counter auf 0x00 gesetzt. in deinem prog 
wird nach dem reset also nach Initial gesprungen.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Patrik,
den jmp Befehl gibt es auf dem 8515 nicht wie Andreas gesagt hat. Ich 
bin auch schon mal darauf reingefallen. Aber der rjmp Befehl legt nichts 
auf dem Stack ab. Das ist ein relativer Jump, kein Call einer 
Unterfunktion.
Die Funktion Initial solltest Du umbenennen in Main und am Ende darf 
kein reti stehen sondern rcall Main.

Initial:
ldi tmp, High(RAMEND)
out $3E, tmp
ldi tmp, Low(RAMEND)
out $3D, tmp
in tmp, $35
ori tmp, 0b00000011
out $35, tmp
in tmp, $3B
ori tmp, 0b01000000 out $3B, tmp
in tmp, $39
ori tmp, 0b01000000
out $39, tmp
ldi tmp, 0x3D
out $2B, tmp
ldi tmp, 0x09
out $2A, tmp
sei

Main:
nop
rjmp Main

So sollte es eigentlich gehen wenn ich nichts übersehen hab

Gruß
Markus

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yo, sieht gut aus. so wird nach dem reset alles initialisiert, und 
danach in eine endlosschleife gegangen (in der der AVR dann auf 
interrupts wartet).

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ich mir schon fast gedacht und funktioniert auch, bis auf das beim 
ersten durchlauf bei rjmp Main an die adresse 0x001 gesprungen wird und 
dann die Inter0-Routine ausgeführt wird. wenn die Inter0-Routine fertig 
ist springt er in die Main-Schleife und wartet bis ein richtiger 
interupt auftaucht. wenn ich den befehl "sei" rausnehme, läuft alles 
nach plan. ich hab mir das GIFR angeschaut und da ist auch kein 
wartender interupt. Wieso?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo wir gerade dabei sind noch ne frage. wollte den CompA-Interupt 
nutzen, um bei einem zählerstand eine methode/programmteil zu starten. 
funktioniert aber nicht indem ich im TIMSK das OCIE1A bit setze. hab 
gesehen, daß ich damit nur PinD bit3 (Int1) beeinflussen kann und damit 
könnte ich einen interupt herbeiführen, der in die methode springt. 
damit versaue ich mir meinen Int1, den ich gerne für etwas anderes 
nutzen möchte. gibt es da eine einfachere lösung?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das problem mit dem compre-interrupt konnte ich selber lösen. dachte 
immer, daß dieser eintritt wenn der vergleichswert erreicht wird und 
nicht erst wenn die zahl überschritten wird.
das andere problem ist leider noch nicht gelöst. hat denn keiner einen 
tip für mich. zu sagen ist noch, wenn ich die zeile rjmp Inter0 
auskommentiere, springt das programm in die CompA-routine.
wäre für jeden tip dankbar.

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.