Ich möchte mich an einem Bootloader für den PIC18F4585 versuchen. Entwicklungssystem ist: PICC18 V9.5 in MPlab + ICD2.
Warum ich nicht einfach einen der vorhandenen Bootloader nehme? Der Download soll per I2C erfolgen und dafür habe ich nichts Sinnvolles gefunden.
Die größten Schwierigkeiten bereitet mir der Linker. Während für andere Compiler immer das Linkerfile propagiert wird, scheint Hitech darauf verzichten zu wollen (zumindest legt mir das die Doku nahe). Ich wollte nun mal für den Start die Applikation und einen einfachst Bootloader per ICD2 herunterladen. Aber leider läuft die Applikation nicht los. Was mache ich falsch?
Hier der einfachst Bootloader. Er lässt ein paar mal eine LED blinken und soll dann zur Applikation springen. Brenne ich nur diesen Bootloader auf den PIC blinkt auch die LED. Soweit kein Thema.
#define _PIC18xxx
#include <htc.h> // Contains Config Macro and includes pic18.h
#define PROG_START 0x800
// Fuses ##################################################################
__CONFIG(1,RCIO & FCMEN); // Internal Clock & Clock Failsafe Monitor Enabled
__CONFIG(2,BOREN & BORV43 & WDTPS32 & WDTDIS & PWRTDIS); // Brown out 4.3V, Powert Timer does not work with ICD Debugger, Watchdog disabled (Software control)
__CONFIG(3,MCLREN & PBDIGITAL ); // MCL activated, PortB digital on startup
__CONFIG(4, XINSTDIS & LVPDIS & DEBUGEN & BBSIZ1K); // extended instruction off, low voltage programming disabled
#include "bootloader.h"
unsigned char i,j;
#asm
psect intcode,class=CODE // redirect interrupts to new routine addresses
goto PROG_START+8
psect intcodelo,class=CODE // redirect low priority interrupts to new routine addresses
goto PROG_START+0x18
#endasm
void main() {
// Init
// Start with all digital inputs
ADCON1 |= 0x0F;
// Switch Comperators Off
CMCON = 0x07;
// Oscillator Config
OSCCON=0b01110000; /*
||||||||--- SCS0: System Clock Select 10 = Internal Oscillator; 00 = Primary Osc
|||||||---- SCS1
||||||----- IOFS: Flag
|||||------ OSTS: Flag
||||------- IRCF0 Internal Oscillator Frequeny Select. 111 = 8 MHz
|||-------- IRCF1
||--------- IRCF2
|---------- IDLEN: Idle Mode / Sleep Mode */
PLLEN = 1; // Enable PLL for Int Osc. (Attention: Sequence DOES matter. First set osccon, then enable PLL)
// Show state with LED
TRISE1 = 0;
for (i=0;i<255;i++) { for (j=0;j<255;j++) { NOP(); } }
LATE1 ^= 1;
for (i=0;i<255;i++) { for (j=0;j<255;j++) { NOP(); } }
LATE1 ^= 1;
for (i=0;i<255;i++) { for (j=0;j<255;j++) { NOP(); } }
LATE1 ^= 1;
for (i=0;i<255;i++) { for (j=0;j<255;j++) { NOP(); } }
LATE1 ^= 1;
// Now start Aplication
#asm
goto PROG_START
#endasm
}
Nun habe ich noch die Applikation, welche allein kompiliert und ohne Bootloader geflasht wunderbar funktioniert. Um diese nun im Speicher zu verschieben habe ich in Mplab unter Build Options eingestellt:
"Specify Offset for ROM (in hex): 800"
Außerdem habe ich in den ICD2 Optionen eingestellt:
Preserve Program Memory Range 0x0 .. 0x7FF
Ich flashe nun zuerst den Bootloader und danach die Applikation mit der Preserve ROM Einstellung. Leider funktioniert danach gar nichts mehr. Nicht mal die LED blinkt. Wie bringe ich dem Linker bei, die Programmblöcke an die richtige Stelle zu rücken? Die beiden Programme einzeln laufen wunderbar. Es ist nur die Linker Thematik.
Das .map file der Applikation sieht eigentlich für mich völlig ok aus. Alle Codebereiche haben eine Linkadresse die um 0x800 verschoben ist:
TOTAL Name Link Load Length
CLASS CODE
intcode 808 808 8
intcodelo 818 818 C
reset_vec 800 800 4
ibigdata 812 812 5
end_init 872 872 16
init 824 824 4E
const D00 D00 26
idata CD0 CD0 30
one_wire B022 B022 242
ad778x 9FC 9FC 2BA
buzzer_pw AB52 AB52 40
fw_delay AB92 AB92 46
i2c_maste AF5A AF5A C8
i2c_slave ABD8 ABD8 46
fw_init AC1E AC1E 62
int_ad 8CC 8CC 130
sca_main B264 B264 B1C
spi_bsd ACE6 ACE6 8E
dsc_board AAC8 AAC8 14
int_eepro 88A 88A 42
text AD74 AD74 98
text AAB8 AAB8 10
text AE0C AE0C 98
text AADC AADC 14
text AEA4 AEA4 B6
text AAF0 AAF0 16
text AB26 AB26 2C
ftext0 CB6 CB6 1A
text AB06 AB06 20
text AC80 AC80 66
Kann es sein, dass ich im Speicher überlappende Variablen bekomme? Wie muss ich hier Abhilfe schaffen.
Gruß
Wolfgang