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
und reti kehrt an eine nicht definierte stelle zurück, da rjmp ja keine rücksprungadresse auf dem stack ablegt...
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
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).
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.
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.