Sprungziel liegt zu weit entfernt.

Gast #61764
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
Gast #61765
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
Gast #61766
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
Gast #61767
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.