PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mega128 Interrupt



cmrex
13.07.2006, 23:11
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

linux_80
14.07.2006, 00:25
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 ?!

cmrex
14.07.2006, 21:11
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

Hanni
14.07.2006, 22:05
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.

linux_80
15.07.2006, 00:55
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

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