-
-
mega128 Interrupt
Hi
Ich hab ein kleines (grosses) "anfänger" Problem...
Wenn ich im AVR-Studio mein mini Programm teste bekomme ich diese Meldung:
AVR Simulator: Invalid opcode 0xffff at address 0x00f002
über einen Int0 sollte er mir in ein unterprogramm springen und das abarbeiten.
Aber er springt auf den rjmp reset und nicht auf den darunterliegenden....
Ich hoffe das ich mein Problem relativ verständlich beschrieben habe, hab erst vor ein paar tagen mit dem programmieren lernen begonnen...
bitte helft mir....
Schöne grüße CMREX
-
Erfahrener Benutzer
Robotik Einstein
Hallo,
zeig mal ein wenig von deinem Programm, sonst kann hier keiner was konkretes sagen.
Aber ein Tipp, wo stehen die .org und wo die labels, das wurde auch schon mal gerne vertauscht, und dann stimmt die Adresse nicht mehr.
Es hört sich zumindest so nach ASM an, warum dann nicht ins neue ASM-Forum ?!
-
Hi
Ich denk mal dass das so passen sollte oder ? :
include "m128def.inc"
.def temp = r16
.def test = r18
.def count = r19
rjmp reset ; Reset Händler
rjmp ext_int0 ; IRQ0 Handler
reti ; IRQ0 Handler
reti ; Timer1 Capture Handler
reti ; Timer1 compare Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; UART RX Complete HAndler RXCIE
reti ; UDR Empty Handler
reti ; UART TX Complete Handler
reti ; ADC Conversion Complete Interrupt Händler
reti ; EEPROM Ready Händler
reti ; Analog Comparator Handler
reset:
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp
ldi test, 1<<int0
ldi temp, 0b00000000 ;
out ddrb,temp ; pins Port D als eingänge
ldi temp, 1<<int0 ; 0100 0000
out gimsk, test
ldi test, 0b00000011
out mcucr, test
sei
loop:
inc count
nop
nop
nop
nop
nop
nop
rjmp loop
sub1:
; hier könnten ein paar Befehle stehen
; sub2 aufrufen
; hier könnten auch Befehle stehen
ret ; wieder zurück
sub2:
ldi r17, 0b01001001 ; hier stehen normalerweise die Befehle,
com r17
; die in sub2 ausgeführt werden sollen
ret ; wieder zurück
ext_int0:
ret
ich habe die meisten teile aus diversen tutorials ....
... Harald
-
Erfahrener Benutzer
Roboter Experte
Hmm, ich geb dir mal den Tipp die Vektortabelle für die Interupts aus dem entsprechendem Datenblatt zu nehmen und dir gegebenfalls mal anzusehen, wieviele Worte ein jmp / rjmp / reti im Flash verbraucht.
genau da dürfte nämlich der "Hund begraben liegen".
Ach ja, Interupt Routinen beendet man im übrigen mit reti und nicht mit ret.
Grüße,
da Hanni.
-
Erfahrener Benutzer
Robotik Einstein
ja und wie oben schon gesagt, gehen da ein paar .org (aber mind. einer) ab die dem Assembler sagen wo die Codezeile im Speicher hin soll, dann kommt man nicht durcheinander, wenn man später wieder reinschaut.
zB. sollte ein
Code:
.org INT_VECTORS_SIZE
nach der IRQ-Tabelle nicht schaden, dann muss man nicht alle Jumps selber reinbauen, und man verzählt sich nicht.
Und ausserdem heisst es nicht Händler, hat nix mit handeln zu tun, ist ein engl. Begriff das handlen, spricht man nur so aus.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen