Hallo zusammen,
möchte meinen Atmega8 so programmieren,sodass er auf einen externes
Signal reagiert. habe dazu folgendes Programm geschrieben:
.include "m8def.inc"
.cseg
.def akku = r16
.def zael = r18
rjmp start
.org INT1addr
rjmp taste
.org $2A
;Stack INIT
start: ldi akku,low(RAMEND)
out SPL,akku
ldi akku,high(RAMEND)
out SPL,akku
;Output INIT
ldi akku,$0F
out DDRB,akku
clr zael ;Register Zael löschen
out PORTB,zael ;Output PortB (PB0-PB3)
;Interrupt INIT (INT1)
in akku,MCUCR ;lade MCUCR in akku
sbr akku,1 << ISC11 ;Setzte ISC11
sbr akku,1 << ISC10 ;Setzte ISC10
out MCUCR,akku ;Übertrage 00001100 ins MCUCR-Reg (steigende
Flanke).
in akku,GICR ;Lade GICR in akku
sbr akku,1 << INT1 ;Setzte INT1
out GICR,akku ;übertrage 10000000 ins GICR-Reg.
sei ;Setzte das I-Bit
;Hauptprogramm
loop: rjmp loop ;Endlosschleife
;Unterprogramm
taste: ldi akku,sreg ;SREG in akku
.
.
.
reti ;zurück nach loop
.exit
Habe mir schon einige Beträge bzw. Bücher zu diesem Thema angeschaut,
nur leider kann ich meinen Fehler nicht erkennen. Nachdem Programmieren
reagiert der ATMEGA einfach nicht auf den Interrupt... und kann mir von
euch jemand verraten wie ich im AVR-Studio einen externen Interrupt beim
deguggen simulieren kann?
Viele Grüße Marco
ich bin leider was asm angeht nicht so hundertpro bewandert aber ich habs mal schnell in AVR-Studio kopiert. Da funktionierts bis auf ne kleine Fehlermeldung beim Interrupt (Stack-Pointer below start of RAM). Interrupt kannst du im Studio simulieren indem du rechts in der I/O-View das external Interrupt öffnest, dann hast du in der Ansicht darunter alle Register. Im Register GIFR kannst du nun das Interrupt Flag INTF1 setzen
A propos Stack Pointer: Fällt mir grad auf, Du initialisierst zweimal SPL, aber nirgends SPH!
Hallo nochmals! danke für die schnelle antwort. habe das Programm schon ausprobiert, aber das läuft auch nicht 100%.Die Interrupts reagieren auf irgendwas, nur nicht auf meine Trigger bzw. nur manchmal.habe vor meinen Interrupt-Eingang ein D-FlipFlop geschaltet. @Roland Kannst du mir auch sagen was diese Fehlermeldung bedeutet? Bin was dieses Thema betrifft kompletter neueinsteiger! schon mal vielen Dank, LG Marco
Marco Schäfer wrote:
> Kannst du mir auch sagen was diese Fehlermeldung bedeutet?
Genau das, was ich oben geschrieben habe: Dadurch, dass Du nur SPL setzt
(und das mit dem Wert, der eigentlich in SPH gehört), legst Du den Stack
mitten in den Registersatz! Dass dabei Müll rauskommt, ist
vorprogrammiert...
RAMEND hat beim Mega8 den Wert 0x045F. Du schreibst das High-Byte 0x04
in SPL, SPH ist 0. An der RAM-Adresse 0x04 liegt aber r4, das Du zwar
nicht benutzt, aber Murks ist es trotzdem...
Johannes hats schon gesagt. Du hast das High Byte des Rams nicht
initialisiert.
ldi akku,low(RAMEND)
out SPL,akku
ldi akku,high(RAMEND)
out SPH,akku
so sollts gehen
vielen Dank jetzt gehts, hätte den Fehler wahrscheinlich noch tage gesucht ;) hatte mich wohl verschrieben!
>ldi akku,sreg
Das ist auch sinnfrei.
Finde den Unterschied zwischen "ldi akku,sreg" und "in akku,sreg"
heraus.
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.