Forum: Mikrocontroller und Digitale Elektronik PIC/MPLAB: Error118


von Thomas M. (tm112)


Lesenswert?

Hallo,
16F84, MPLAB v7.41

in einem bestehenden Projekt habe ich nach mehreren erfolgreichen
Änderungen folgendes Problem:

Nach Einfügen einiger Variablen und anschließendem Beschreiben mit
Werten gibt es folgende Fehlermeldung:
Error[118]   [Datei] : Overwriting previous address contents (0300)

Die eingefügten Variablen stehen an Adresse 17, 18 und 19hex:
variable1  equ    17h
variable2  equ    18h
variable3  equ    19h

Erst beim Füllen mit Werten à la:

       movlw 03h
       movwf variable1
       movlw 0xFF
       movwf variable2
       movwf variable3

kommt es beim Compilieren zur Fehlermeldung. Seltsam. Die paar
eingefügten Zeilen alleine laufen einwandfrei. Und ich dachte, der
ausgewählte Bereich gehört in jedem fall zum general purpose Bereich.
Wieso gibt es plötzlich Probleme mit Adresse 300 - wo tatsächlich was
drinsteht? Auch das Herumprobieren mit 3 willkürlich anderen (aber auch
freien) Adressen im GP-Bereich brachte die gleiche Fehlermeldung.

Bin für jeden Tipp dankbar.

Gruß,
Thomas

von Profi (Gast)


Lesenswert?

Vermutlich sind durch die Einfügungen Adressen verschoben worden.
Nicht alle Befehle können alle Adressen ansprechen, da zu wenige Bits
vorhanden sind.

von Dieter Werner (Gast)


Lesenswert?

Diese Meldung gibt es beispielsweise wenn das (gewachsene) Programm
schon die Adresse 300 belegt, danach aber mit org 300 versucht wird
diese Adresse ein zweites Mal zu belegen.

von Thomas M. (tm112)


Lesenswert?

OK. Es gibt einen Abschnitt, in dem mit org 300 gesprungen wird.
Trotzdem leuchtet's mir nicht ein, warum die Fehlermeldung kommt, wenn
Variablenwerte in Speicherplätzen weit darunter geschieben werden.

von Dieter Werner (Gast)


Lesenswert?

Das sind zwei Paar Stiefel:

Die Variablen liegen im RAM und haben damit nichts zu tun.

Das Problem tritt auf, weil durch die eingefügten Befehle das Programm
natürlich länger wird und sich dadurch in dem mit org 300 schon
belegten Teil des Programmspeichers überlappt.
Übrigens wird mit org nicht gesprungen, sondern nur die Startadresse
des folgenden Programmcodes festgelegt.

von Thomas M. (tm112)


Lesenswert?

Hallo Dieter,

Danke für die prompte Antwort. Ich hatte auch schon befürchtet, dass
der Platz ein wenig eng wird. Offenbar war die eine Zeile der Tropfen,
der das fass zum Überlaufen brachte. An einer anderen Stelle ein paar
Zeilen (Testroutine) wegge-x-t - schon läuft's. Nun mag ich ungern
einen größeren Controller einsetzen, zumal bis zur FErtigstelleung
vielleicht noch maximal 20 Zeilen Assemblercode dazukommen. Gibt's
erstmal eine Möglichkeit die Speicherbelegung im laufenden Betrieb zu
betrachten? So bestünde vielleicht eine Möglichkeit die
Speicherbelegung zu optimieren. Oder gar ein paar Variablen ins EEPROM
auszulagern.

Gruß,
Thomas

von Dieter Werner (Gast)


Lesenswert?

Das Auslagern von Variablen bringt nichts da das Programm dadurch nicht
kürzer wird.

Die Belegung des Programmspeichers lässt sich mit "view" und dann
"disassembly listing" betrachten.
Links vom eigenen Quellcode ist die Programmspeicheradresse zu sehen
auf dem der jeweilige Befehl im Controller steht.

Falls der Adressbereich 300 bis 3FF noch nicht vollständig belegt ist
lässt sich vielleicht auch der dortige code verschieben (org 310 oder
so ähnlich). Die Verweise auf Adressen in dem Bereich müssen dann
natürlich angepasst werden (bei Verwendung von Labels geht das
automatisch).

von Thomas M. (tm112)


Lesenswert?

Hallo Dieter,

Danke für den Tipp. Die höchste Adresse ist 342h. Da sollte sich doch
noch was nach oben schieben lassen ...
Gruß,

Thomas

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.