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
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
.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
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
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!
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.
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.
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
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?
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?
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.