Bootloader till PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Bootloader till PIC

Inlägg av dangraf »

Jag hittar ingen bootloader till min DSPIC och tänkte därför försöka mig på att skriva en själv, vilket inte alls verkar särskilt svårt :roll:

jag har tittat lite på TinyPic bootloader, som är på enbart 100 rader och väldigt väldigt enkel, men skriven till pic 18 serien.

jag har fått ett humm om hur bootloadern fungerar, men skulle endå behöva lite hjälp på traven.

Min första fråga handlar om HEX-filen, som skulle kunna se ut ung såhär, om man kör en förkortning.

:020000040000fa
:080000000001040000000000f3
:020000040000fa
:100200006f8020008079220000018800000000003b
:10021000050007000c0007009c020200000000001f
:100220000040da000000fe004440a900003c20002d
.
en jävla massa siffror.
.
:1001c8006008000060080000600800006008000087
:1001d8006008000060080000600800006008000077
:1001e8006008000060080000600800006008000067
:0801f80060080000600800002f
:020000040000fa
:0410c0000000fe002e
:00000001FF

förklaringen till hexfilen har jag fått här:

"Each line of an Intel HEX data file is structured as follows:
:nnaaaattdddddddddddddddddddddddddddddd cc
: indicates the start of a data record, nn indicates the number of bytes in the record,
aaaa is the load address of the record, tt is the record type, d is the actual data, and
cc is the checksum. All values are in ASCII/HEX. The checksum is calculated by
performing 8-bit additions of every byte between nn and the end of data. The twos
complement is then taken of this sum to get the checksum."

Min fråga handlar om bokstäverna eller talet "tt" i hexkoden som jag förstått det, förklarar i vilket minne som "datat" skall skrivas.

jag har hittat 2 typer i min hexkod nummer 00 och 04.
00 förmodar jag är flashminnet.
04 har jag ingen aning om

fråga: vilka typer av "tt" finns det, flash borde vara 00, 04, borde vara nått annat, som configbitar eller nått. Men finns det fler "record types" och isf vilka? vad har eepromet för tracknummer t.ex??

Vet någon vart man kan hitta information och källkod till bootloaders och själva probammet i PC'n som skickar all data över serieporten?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

EEPROMmet brukar adresseras på 2100h och uppåt.

tt:
00 = data record.

01 = end of record.

02 = Extended adress record:
":02 0000 04 xxxx cs" anger att man använder en "riktig" adress som blir
xxxx0 + addr, detta medger att man kan ha upp till 20 adressbitar.

04 = Extended linear adress record:
":02 0000 04 xxxx cs" betyder att den "rätta" adress hädanefter (till nytt direktiv) är "xxxxaddr", det är alltså för att utöka adresseringsmöjligheten till 32 bit. Man anger då, med denna kommando, de högsta 16 bit.

Så grejen är inte att denna tt anger om det är ROM, FLASH eller annat, den anger hur man ska tolka de data som finns, antingen är det just data, annars är det stopp, nytt adressområde eller sånt.
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Jag skrev en sådan för inte allt för längesedan. Inte för PIC visserligen men ändå.

http://www.elektronikforumet.com//forum ... 1349#61349

/Johan
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Tackar! Det var snabba svar!
Icecap, jag är lite osäker på hur jag skall tolka 02 och 04 så jag tänkte visa ett exempel på hur jag tolkat det. Du är mer än välkommen att rätta mig :wink:

Låt säga att jag har raden (har gjort mellanrum för att lättare kunna se)
:02 0000 04 0000fa
:10 0200 00 6f8020008079220000018800000000003b

betyder det att jag skall ställa mig på adress 0x00000200 och börja skriva data 0x6f80? (16 bitars processor)

och om jag har
:02 0001 02 0000fa
:10 0d00 00 353700002e300000206d0000006d00001f

då gör jag så att jag lägger ihop adresserna 0x00100 + 0x0d00 = 0x0E00
och skriva 0x3537?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nja....
Efter vad jag vet är det sällan att man använder 02. Det är vanligare att använda 04 men OK:
:02 0000 02 0100 ??
:10 0D00 00 353700002E300000206D0000006D00001F
betyder att de data som kommer ska skrivas in på
0100-
+-0D00
=====
01D00 och framledes.

Den adress man anger i adress-fältet vid 02 & 04 är likgiltig, det är den 2-byte adress som kommer i datafältet som gäller.

Sen är alla datan i byteformat så beroende på det valda system kan man vara tvungen att kasta om på MSB och LSB, det beror på om systemet kör little enidian eller big enidian.

Detta format specar att datan ska sparas i den angivna adress, sedan ska adressen räknas upp med 1 och sedan ska nästa data sparas. I Intel system är detta "rakt på sak" (LSB i lägsta adressen) men i t.ex. Motorola system (som kör med big enidian....eller är det little....motsatt av Intel iaf) sparas MSB i lägsta adressen. Så hur den än blir måste man i ena fallet kasta om på MSB och LSB när man sparar i 16-bits format.
LSB = Least significant Byte
MSB = Most significant Byte

Edit: sov lite och knasade i svaret (sakfel)
Mer edit: Dataman S4 manualen har jag som papper där allt detta stå i, här är den som PDF....
Skriv svar