Forum: Mikrocontroller und Digitale Elektronik Sprungziel liegt zu weit entfernt.


von michi0021 (Gast)


Lesenswert?

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

von ulrich strobel (Gast)


Lesenswert?

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

von michi0021 (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

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