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.