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