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
Vermutlich sind durch die Einfügungen Adressen verschoben worden. Nicht alle Befehle können alle Adressen ansprechen, da zu wenige Bits vorhanden sind.
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.
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.
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.
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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.