Hi!
Wie beschrieben bin ich gerade dabei einen für meine Verhältnisse
payssenden Bootloader zu erarbeiten. Als Original dient mir der MCHPUSB
Bootloader vom Microchip Framework.
Hab jetzt den ganzen "Müll" mit dem LED-geblinke über Bord geworfen und
mir eine EEPROM Routine geschrieben, die wie folgt aufgerufen wird.
1 | write_eeprom(0xFF,0x00);
|
Dabei ist 0xFF die Adresse und 0x00 die Daten.Die Routine sieht
folgendermaßen aus:
1 | void write_eeprom (byte adr,byte data)
|
2 | {
|
3 | //Set EEADR and EEDATA(read from adr and data)//
|
4 | EEADR=adr;
|
5 | EEDATA=data;
|
6 | //Init EEPROM for write instruction//
|
7 | EECON1bits.CFGS=0;
|
8 | EECON1bits.EEPGD=0;
|
9 | EECON1bits.WREN =1;
|
10 | //Disable Interrupts//
|
11 | INTCONbits.GIE = 0;
|
12 | //Write EEPROM (self timed)//
|
13 | EECON2 = 0x55;
|
14 | EECON2 = 0xAA;
|
15 | EECON1bits.WR=1;
|
16 | //Enable Interrupts//
|
17 | INTCONbits.GIE=1;
|
18 | //Clear the WREN bit (is not done by hardware)//
|
19 | EECON1bits.WREN=0;
|
20 | //Clear the EEIF bit (interrupt bit-is not done by hardware)//
|
21 | PIR2bits.EEIF=0;
|
22 | //end of write_eeprom()//
|
23 | }
|
Hab das getestet (in einem anderen Programm und da funktioniert das
beschreiben und auch auslesen (mit einer anderen Routine) perfekt.
Im Bootloader siehts folgendermaßen aus:(Ausschnitt)
1 | void main(void)
|
2 | {
|
3 | byte temp;
|
4 | temp = ADCON1;
|
5 | ADCON1 |= 0x0F;
|
6 |
|
7 | read_eeprom(0xFF);
|
8 | if (EEDATA==0x00)
|
9 | {
|
10 | ADCON1 = temp; // Restore reset value
|
11 | _asm goto RM_RESET_VECTOR _endasm
|
12 | }//end if
|
13 | }
|
Mein Problem ist nun, dass das Lesen und beschreiben nur hier im
Bootloader nicht funktioniert! Hat jemand schonmal dieses Problem
gehabt? Denn ich will den Bootloader damit aktivieren oder deaktivieren.
Seltsamerweise übernimmt der PIC beim
1 | write_eeprom(0xFF,0x00);
|
nur EEDATA(0x00) und nicht EEADR(0xFF).
Auch beim
übernimmt er nicht EEADR aber gibt mir EEDATA schon zurück. Klarerweise
dann von der Zelle 0x00.
Weiß mir echt keinen Rat mehr, wieso das genau im Bootlaoder nicht
funktioniert aber sonst schon, und wieso er EEDATA übernimmt und EEADR
nie?!
Ach ja, EEPROM Schreibschutz ist natürlich deaktiviert...
Hoffe ihr könnt mir helfen
Danke schon im Voraus.
mfg Darkleon