Forum: Mikrocontroller und Digitale Elektronik ATMEGA163 - AT..8535 Problem


von Sebastian__ (Gast)


Lesenswert?

hallo,
ich habe ein problem mit mit dem atmega163, der folgende code lief auf 
dem 8535 problemlos, aber auf dem 8535 gibt es immer nur einen 
rücksprung auf "Init" wenn die zeile rjmp Init_Main aufgerufen wird.



.include "m163def.inc"  ;definitonsdatei für AT90S9535 einbinden

rjmp Init      ;Reset Handler & Watchdog Reset
rjmp INT_0      ;Externer Reset eingang 0
rjmp INT_1      ;Externer Reset eingang 1
rjmp Timer2_Comp  ;Timer 2 Compare Match
rjmp Timer2_OVF    ;Timer 2 Overflow
rjmp Timer1_Capt  ;Timer 1 Capture Event
rjmp Timer1_CompA  ;Timer 1 Compare Match A
rjmp Timer1_CompB  ;Timer 1 Compare Match B
rjmp Timer1_OVF    ;Timer 1 Overflow
rjmp Timer0_OVF    ;Timer 0 Overflow
rjmp Spi_Comp    ;Spi Transfer Complete
rjmp UartRX_Comp  ;Uart RX Transfer Complete
rjmp Uart_DRE    ;Data Register Emty
rjmp UartTX_Comp  ;Uart TX Transfer Complete
rjmp ADC_Comp    ;Aanlog Digtal Conversion Comlete
rjmp EE_RDY      ;EEprom Ready
rjmp Ana_Compa    ;Analog Compeerator


Init:
;Initialisierung des stack Pointers       <----- 8Kb SRAM max ram = 
$045F
ldi r16, $04    ; Stack Pointer setup
out SPH,r16    ; Stack Pointer High Byte
ldi r16, $5F    ; Stack Pointer setup
out SPL,r16    ; Stack Pointer Low Byte

;Initialisierung der PORTS A-D

;**A**
ldi r16,$00
out DDRA,r16
ldi r16,$00
out PORTA,r16

;**B**
ldi r16,0b11110000
out DDRB,r16
ldi r16,0b00001111
out PORTB,r16

;**C**
ldi r16,$FF
out DDRC,r16
ldi r16,$00
out PORTC,r16

;**D**
ldi r16,0b11110000
out DDRD,r16
ldi r16,0b00111100
out PORTD,r16


rjmp Init_Main    ;Von dieser routine wird immer ein sprung zu main 
gemacht

.
.
.
Init_Main:

wo liegt das problem? den Stack pointer habe ich angepasst und das .h 
file auf den mega163 umgestellt, warum läuft das nicht ??

vielen dank
Sebastian

von mikki merten (Gast)


Lesenswert?

Alle rjmp Befehle bei den Interrupt-Vektoren
(1 Wort) sind durch jmp Befehle (2 Worte) zu
ersetzen, da der Mega163 mehr wie 8 k Flash
Programmspeicher hat.

von Sebastian__ (Gast)


Lesenswert?

danke so wit bin ich jetzt auch schon, aber die IRQ routinen sind ja 
nicht das prob. sondern dir rcall und rjmp befehle. ein prog das nur 
4058 words lang ist sollte ja problemlos mit rjmp befehlen arbeiten, 
jedenfalls tut es da beim 8535, jetzt muss ich aber die rxxx befehle 
gegen call und jmp austauschen. der IRQ vektor sieht jetzt so aus:
.org 0x0000
jmp Init                        ;Reset Handler & Watchdog Reset
.org INT0addr
jmp INT_0                       ;Externer Reset eingang 0
.org INT1addr
jmp INT_1                       ;Externer Reset eingang 1
.org OC2addr
jmp Timer2_Comp                 ;Timer 2 Compare Match
...

oder bleibt mir nur das eine übrig alle rcall gegen call und rjmp gegen 
jmp befehle zu tauschen ???
ich habe zwar schon viel programmiert aber bei sowas bin ich immer etwas 
ratlos.

Sebastian

von mikki merten (Gast)


Lesenswert?

Wenn Du dir nicht sicher bist das alle mit rcall
bzw. rjmp angesprungenen Label innerhalb von
+-2 kWorten liegen, dann ist ein globaler Tausch
die einfachste Lösung. Beim 8535 werden ja per WRAP
arround positive Sprünge > 2 k Worte in negative verwandelte, da 
hierdurch 8 k Byte Flash komplett
mittels rjmp und rcall adressierbar sind. Daher
verfügen alle AVRs mitr <= 8 k Flash auch nicht
über den rjmp und rcall Befehl.

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
Noch kein Account? Hier anmelden.