Forum: Mikrocontroller und Digitale Elektronik ständig interupts


von Patrick (Gast)


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

von Patrick (Gast)


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

von Jonas Diemer (Gast)


Lesenswert?

gib doch mal das ganze programm!

von Patrick (Gast)


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

von Denis Gérard (Gast)


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

von Jonas Diemer (Gast)


Lesenswert?

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

von Jonas Diemer (Gast)


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!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Der AT90S8515 kennt keinen "jmp" Befehl.

von Patrick (Gast)


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.

von Jonas Diemer (Gast)


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.

von Markus (Gast)


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

von Jonas Diemer (Gast)


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).

von Patrick (Gast)


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?

von Patrick (Gast)


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?

von Patrick (Gast)


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.

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.