Hi leute, Ich programmiere grad eine Software für eine Wetterstation mit Prog-studio von Batronix. Übersichtishalber hab ich alles in einzelnen Daten sotiert die ich im am Anfang des Hauptprogramm alle einbinde. Will ich nun den Krempel brennen kommt immer der Fehler "Sprungziel liegt ausserhalb des -128/+127 Byte Rahmen" egal in welcher Reinfolge die Dateien eingebunden werden, bei irgendeiner Datei kommt immer der Fehler. Ich benuzte schon die Befehle LCALL und LJMP welche ja eingentlich über den ganzen Adressbereich reichen müssten. Kann mir da kein Reim drauf machen, woran es liegen kann. Hatte vielleicht von euch schon mal mit dem selben Problem zu kämpfen? mfg michi
hatte damit zu tun, mach doch einfach irgendwohin in die nähe einen zwischensprung von dem aus du dann mit normal jmp weiterspringst. hässlich aber funktionabel. mfg uli
Ja das funktioniert, aber es wird alles zu unübersichtlich. Hab grade mal den Befehl der erste einegebunden Datei (include ???.asm) durch den gesammten Quelltext der Datei (???.asm) ersetzt und mir ist aufgefallen das er nicht mal den Sprungbefehl in dieser einen Datei ausführen kann, ca 20 Zeilen! Nehme ich nun die ganzen anderen eingebundenen Dateien heraus die hinter der ersten Datei stehen, kann er alle Befehle ausführen?! Wie kann das denn?! Hab mal versucht zu veranschaulichen was ich gemacht habe: 1. INCLUDE 89C2051.mc LJMP init INCLUDE regenmesser.asm INCLUDE i2c.asm <---- Sprungfehler INCLUDE crc8.asm INCLUDE umwandeln.asm INCLUDE temp.asm INCLUDE lcd.asm INCLUDE windmesser.asm INCLUDE Wait.asm INCLUDE heizung.asm INCLUDE senden.asm INCLUDE klima.asm........ .................................................................. 2. INCLUDE 89C2051.mc LJMP init INCLUDE regenmesser.asm ;----------Befehle für I2c Bus---------- sda EQU p3.1 ;I2C Datenleitung scl EQU p3.2 ;I2C Clockimpuls error BIT 5fh ;wird gesetzt wenn I2C übertragung gescheitert write_i2c: LCALL start_i2c LCALL addy_w LCALL ack LCALL send_data_i2c <----- Hier liegt der Sprungfehler LCALL ack LCALL STOP_i2c RET read_i2c: LCALL start_i2c LCALL addy_r LCALL ack LCALL read_data_i2c LCALL send_ack LCALL STOP_i2c RET scl_i2c: SETB scl LCALL wait_i2c CLR scl LCALL wait_i2c RET start_i2c: SETB sda SETB scl LCALL wait_i2c CLR sda lcall wait_i2c CLR scl LCALL wait_i2c RET stop_i2c: CLR sda SETB scl LCALL wait_i2c SETB sda LCALL wait_i2c CLR scl LCALL wait_i2c CLR sda RET addy_r: PUSH A MOV R7,#08h INC R6 MOV A,R6 poi4: RLC A MOV sda,C LCALL scl_i2c DJNZ R7,poi4 DEC R6 POP A ret addy_w: PUSH A MOV R7,#08h MOV A,R6 poi1: RLC A MOV sda,C LCALL scl_i2c DJNZ R7,poi1 POP A ret ack: CLR error SETB sda LCALL wait_i2c SETB scl JNB sda,poi5 SETB error CLR sda poi5: CLR scl RET send_ack: SETB sda SETB scl LCALL wait_i2c CLR scl LCALL wait_i2c CLR sda RET send_ack_n: CLR sda SETB scl LCALL wait_i2c CLR scl LCALL wait_i2c CLR sda RET send_data_i2c: <---- Hier, nicht zu erreichendes Sprungziel MOV R7,#08h poi2: RLC A MOV sda,C NOP LCALL scl_i2c DJNZ R7,poi2 RET read_data_i2c: MOV R7,#08h poi3: SETB scl LCALL wait_i2c MOV C,sda RLC A CLR scl LCALL wait_i2c DJNZ R7,poi3 RET wait_i2c: NOP NOP NOP NOP NOP NOP RET INCLUDE crc8.asm INCLUDE umwandeln.asm INCLUDE temp.asm INCLUDE lcd.asm INCLUDE windmesser.asm INCLUDE Wait.asm INCLUDE heizung.asm INCLUDE senden.asm INCLUDE klima.asm .................................................................... 3. Wenn die eingebundenen Dateien weg sind, dann läuft es?!!!! INCLUDE 89C2051.mc LJMP init INCLUDE regenmesser.asm ;----------Befehle für I2c Bus---------- sda EQU p3.1 ;I2C Datenleitung scl EQU p3.2 ;I2C Clockimpuls error BIT 5fh ;wird gesetzt wenn I2C übertragung gescheitert write_i2c: LCALL start_i2c LCALL addy_w LCALL ack LCALL send_data_i2c LCALL ack LCALL STOP_i2c RET read_i2c: LCALL start_i2c LCALL addy_r LCALL ack LCALL read_data_i2c LCALL send_ack LCALL STOP_i2c RET scl_i2c: SETB scl LCALL wait_i2c CLR scl LCALL wait_i2c RET start_i2c: SETB sda SETB scl LCALL wait_i2c CLR sda lcall wait_i2c CLR scl LCALL wait_i2c RET stop_i2c: CLR sda SETB scl LCALL wait_i2c SETB sda LCALL wait_i2c CLR scl LCALL wait_i2c CLR sda RET addy_r: PUSH A MOV R7,#08h INC R6 MOV A,R6 poi4: RLC A MOV sda,C LCALL scl_i2c DJNZ R7,poi4 DEC R6 POP A ret addy_w: PUSH A MOV R7,#08h MOV A,R6 poi1: RLC A MOV sda,C LCALL scl_i2c DJNZ R7,poi1 POP A ret ack: CLR error SETB sda LCALL wait_i2c SETB scl JNB sda,poi5 SETB error CLR sda poi5: CLR scl RET send_ack: SETB sda SETB scl LCALL wait_i2c CLR scl LCALL wait_i2c CLR sda RET send_ack_n: CLR sda SETB scl LCALL wait_i2c CLR scl LCALL wait_i2c CLR sda RET send_data_i2c: MOV R7,#08h poi2: RLC A MOV sda,C NOP LCALL scl_i2c DJNZ R7,poi2 RET read_data_i2c: MOV R7,#08h poi3: SETB scl LCALL wait_i2c MOV C,sda RLC A CLR scl LCALL wait_i2c DJNZ R7,poi3 RET wait_i2c: NOP NOP NOP NOP NOP NOP RET END
ein rahmen von 255 byte lässt auf einen bedingten sprung schließen. irgendwo anders wirst du einen bedinten sprung zu dieser funktion ausführen. alle anderen befehle, wie call und jmp haben größere sprungbereiche als 255 dh. weitersuchen :) avr-studio zeigt einem die Sprungquelle, die das Ziel nicht erreicht. dann kannst du das problem direkt beheben. so lange source codes next time bitte im dateianhang unterbringen
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.