Forum: Mikrocontroller und Digitale Elektronik PIC16: Problem mit Code Page


von Andi F. (furra)


Lesenswert?

Benötige beide Code Pages des PIC16F873A.
Habe den Code in zwei .c-Files aufgeteilt. Wie kann ich den einen Code 
in die zweite Page speichern?
Programmiere in C und verwende XC8.

von Peter D. (peda)


Lesenswert?

Die Auswahl der Pages erfolgt über PCLATH.
Ist aber nur in Assembler nötig, ein C-Compiler macht das automatisch.

Wenn man ein Programm in mehrere Sourcefiles aufteilt, muß man das dem 
Linker mitteilen.
Wo welche Routine plaziert wird, kann man nicht beeinflussen. Braucht 
man aber auch nicht.

: Bearbeitet durch User
von Andi F. (furra)


Lesenswert?

Leider füllt der Compiler die Page0 bis an den Anschlag und lässt die 
Page1 frei. Muss ich im Compiler / MPLAB etwas einstellen?

von Max H. (hartl192)


Lesenswert?

Andi F. schrieb:
> Leider füllt der Compiler die Page0 bis an den Anschlag und lässt
> die Page1 frei.
Was ist das Problem dabei?

von Andi F. (furra)


Lesenswert?

Da Page0 voll ist, wird der "überzählige" Code, im HEX-File, ausserhalb 
der Adressen der Page0 und 1 geschrieben und das Programm funktioniert 
somit nicht mehr.

von Witkatz :. (wit)


Lesenswert?

Andi F. schrieb:
> ausserhalb der Adressen der Page0 und 1 geschrieben

Der PIC16F873A hat doch nur Program Page 0 (0x0005 - 0x07FF) und Page 1 
(0x0800 - 0x0FFF)

von Andi F. (furra)


Angehängte Dateien:

Lesenswert?

Beim Compilieren wird unter Used Program Space 88Dh (53.4%) angegeben.

Habe in einer Beschreibung des HEX Files folgendes gefunden:
:1000080009002C2083160313861283120313861605
0008 is the address and this time we have to divide it by 2. 0008 / 2 = 
0004h. So the data will be placed at 00000004h memory location.

Meine letzte Zeile ist:
:101DF000FD2E0F30CD000030CE00CB01CC0108000D
=> Adresse 0x0EF8, es hat somit noch Platz

Interessanterweise ist gegen Ende der Datei ein "Sprung" drin:
:100FF000A8002808A10029088A1193260800FF3FAD
:101CE000FF3F83120313A0000C1E742E20089900DE

Es scheint, dass der Compiler die Page1 von hintern auffüllt.
Wie kann ich das ändern? Denn so läuft mein Programm nicht, sobald ich 
über 50% Code Space komme.

: Bearbeitet durch User
von Witkatz :. (wit)


Lesenswert?

Andi F. schrieb:
> Es scheint, dass der Compiler die Page1 von hintern auffüllt.
Substantive werden immer noch groß geschrieben ;-)

Der Compiler erzeugt doch Object Code (relocatable). So lange du keine 
absoluten Adressen verwendest, ist für die Adressierung der Linker 
zuständig, oder?

Man kann dem Linker eine absolute Adresse oder eine Sektion für jede 
Funktion mitteilen.
http://microchip.wikidot.com/faq:38

Andi F. schrieb:
> Denn so läuft mein Programm nicht, sobald ich über 50% Code Space komme.
Warum schaust du dir statt des kryptischen HEX Codes nicht das Assembler 
Listing an?
Was läuft denn nicht? Schon mal debuggt?

von Erich (Gast)


Lesenswert?

>Habe den Code in zwei .c-Files aufgeteilt.

Hmmm, ganz dumme Frage (und ganz schrägen Verdacht):
Hast du EIN Projekt oder ZWEI?
Oder anders gefragt: Hast du EIN oder ZWEI .HEX files ???

Du solltest 1 Projekt haben, dort sollte die beiden .c Datei zusammen 
enthalten sein und es sollte EINE .hex Datei entstehen.

Wie der Compiler (Linker) das standardmäßig aufteilt, ist 
"normalerweise" egal.

Gruss

von Andi F. (furra)


Lesenswert?

Habe ein Projekt mit zwei .c und ein .hex files.

Da ein Bootloader verwendet wird, sind die letzten 265 Adressen 
freigehalten, durch Aktivierung der ICD.
Ich habe gerade versucht, die Endadresse tiefer zu setzen - und nun geht 
es. Scheint, dass der Bootloader mehr als die angegebenen 265 braucht.

Komisch ist aber immer noch, dass die Page1 von ober her beschrieben 
wird und nicht ab 0x0800.

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.