Forum: Mikrocontroller und Digitale Elektronik PIC18F4580 - Probleme mit Bootloader


von J. Hebeler (Gast)


Lesenswert?

Hallo,

ich habe hier eine Platine mit dem erwähnten PIC18F4580 und einem 
Wiz820io(Wiznet W5200), als Compiler nutze ich MikroC von 
Mikroelektronika in der neusten Version.
Für diesen habe ich einen TFTP-Bootloader programmiert, so ähnlich wie 
dieser für AVR(Arduino): 
http://playground.arduino.cc/Code/TFTPBootloader1
Der Funktioniert soweit, dass der TFTP Transfer funktioniert, jedoch 
erhalte ich alle möglichen merkwürdigen Probleme mit meinen Programmen.
Die so übertragenen Programme funktionieren nur sporadisch oder nur in 
Teilen, ein fester Text(im Flash) driftet auf einmal weg und statt dem 
Text wird irgendwas aus dem Flash ausgegeben(Text über die Serielle 
Schnittstelle)
Ein zwei mal Programmieren funktioniert in der Regel gar nicht.

Ich bin was PIC-Programierung angeht ein Anfänger, ich habe vorher noch 
nie mir PICs gearbeitet, nur AVRs und ein paar ARM-Prozessoren.

Das ist der Teil des Bootloader, der die TFTP-Pakete entgegen nimmt und 
verarbeitet.
Der Bootloader ist 2k Words groß, daher die Grenze bei 0x1000.
Der Schreibschutz für den Bootloader ist aktiv.
1
case 0x0002:              //WRQ - We get a write request, send the ack and set the code to invalid, to prevent unpredictable behaviour on failure
2
            for(i = 12; buffer[i] != 0; i++);
3
            i++;
4
            if(strcmp((buffer+i), "octet") != 0)
5
            {
6
                SendError(1, remoteIP, port);
7
                return 0;
8
            }
9
            //InitUDPServer(0, 1030);
10
            SendAck(0, remoteIP, port);
11
            SetCodeInvalid();
12
            for(i = 0x1000; i < 32768; i+=64);
13
                FLASH_Erase_64(i);
14
            break;
15
        case 0x0003:              //DATA
16
            if(packet != packetNumber)
17
            {
18
                SendError(11, remoteIP, port);
19
                return 0;
20
            }
21
            len -= 4;  //Remove TFTP-Header information
22
            for(i = 12; i < len; i+=32)
23
            {
24
                addr = (packet) * 512 + i - 524; //524 is (packet - 1) * 512 + i - 12
25
                if(addr <= (BOOTLOADER_END-31)) //We want to start writing at the end of the bootloader at 0x1000
26
                    continue;
27
                if(0x1000 > addr)
28
                {
29
                    i += 0x1000 - addr;
30
                    addr = 0x1000;
31
                }
32
                FLASH_Write_32(addr, buffer+i);
33
            }
34
            SendAck(packet, remoteIP, port);
35
            packet++;
36
            if(len < 512)   //We finished the data transfers
37
            {
38
                SetCodeValid();
39
                return 0;
40
            }
41
            break;

Danke im vorraus.

Mit freundlichen Grüßen

J.Hebeler

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.