Forum: Mikrocontroller und Digitale Elektronik PIC18F4431 mit BIOS


von Schurick (Gast)


Lesenswert?

Hi Leute,
habe einen 18F4431 Pic mit Bios drauf. Das BIOS besetzt den Speicher von 
0x000 bis 0x400. Mit Assambler gibt es den Befehl "org 0x400" um das 
BIOS nicht zu überschreiben. Jetzt muss ich mein Programm aber mit C 
schreiben, welche Möglichkeit gibt es da, um meinen Code an eine 
bestimmte Speicherstelle zu setzen, damit das BIOS nicht überschrieben 
wird? Ich benutze den C18-Compiler von Microchip.

von holger (Gast)


Lesenswert?

extern void _startup (void);        // See c018i.c in your C18 compiler 
dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x000400
void _reset (void)
{
    _asm goto _startup _endasm
}
#pragma code

von Markus (Gast)


Lesenswert?

Hallo,

ich vermute mal du meinst nicht Bios sondern Bootloader, oder?

von Schurick (Gast)


Lesenswert?

@holger
könntest du kurz beschreiben, was der code macht?

@markus
nein, ich mein bios :)

von holger (Gast)


Lesenswert?

>@holger
>könntest du kurz beschreiben, was der code macht?

Die Funktion _reset() wird an Adresse 0x400
gelegt. Das ist ein Stück Code um ein Programm
per Bootloader programmieren zu können.
Da muss man allerdings auch im Linkerscript rumfummeln.
Das geht mir jetzt hier zu weit ;)

Was für ein Bios ist denn das?

von Schurick (Gast)


Lesenswert?

Muss dann zufällig im Linkerscript unter "page" Start=0x400 gesetzt 
werden?

Das BIOS hilft uns mit einer Software Werte aus dem Speicher des PICS 
auszulesen und Werte reinzuschreiben. Mit einer anderen Software können 
wir damit auch HEX-Files auf den Pic flashen.

von Schurick (Gast)


Lesenswert?

Mir wurde gesagt, dass ich folgendes vor der main-Funktion schreiben 
soll:

#pragma code main=0x420
void main(void)
{
 .
 .
 .
}

Zusätzlich soll ich im Linker-File bei "page" den Startwert auf 0x400 
setzen. Wenn ich dies jedoch tue, kommt folgender Fehler:

section '_entry_scn' can not fit the absolute section. Section 
'_entry_scn' start=0x00000000, length=0x00000006

Bitte um Hilfe.

von holger (Gast)


Lesenswert?

>Mir wurde gesagt, dass ich folgendes vor der main-Funktion schreiben
>soll:
>
>#pragma code main=0x420
>void main(void)

Also doch ein Bootloader.

von Schurick (Gast)


Lesenswert?

mag sein, aber das hilft bei meinem Problem nicht weiter :)

von holger (Gast)


Lesenswert?

>mag sein, aber das hilft bei meinem Problem nicht weiter :)

Ein Teil der Lösung habe ich oben gepostet.
Geh mal auf die Seite von Microchip und such
nach Bootloader. Ich habe keine Lust deine Arbeit
zu machen.

Oder frag einfach den hier:

>Mir wurde gesagt, dass ich folgendes vor der main-Funktion schreiben
>soll:

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.