Še en BootLoader za ATMEGA328, 168A, 88A

programski jeziki in programiranje

Moderator: tilz0R

Še en BootLoader za ATMEGA328, 168A, 88A

OdgovorNapisal/-a oobuco » 06 Mar 2017, 18:43

No seveda za tiste, ki sicer ste na Atmel AVR, ne pa na Arduino-tu.

Ker mi noben od najdenih BootLoaderjev ni popolnoma ustrezal, sem si naredil svojega, ima nekaj dodatnih funkcij, morda pa bo še komu drugemu prišel prav.



Osebno raje uporabljam BootLoader kot programator, ker je manj kablov in en čip dam samo enkrat čez programator - toliko da naložim bootloader - in če nič drugega imam tako manj možnosti, da zaj.... kakšen Fuse ali Lock bit.
Pa vsaj na 328 BootLoader zasede samo 1.6% prostora, kar se da pozabiti.


Namenjen je mikrokontrolerjem ATMEGA88A, 168A in 328 ter podobnim, če imajo enako količino SRAM-a in je FlashPageSize enak.

Narejen je samo za varianto, kjer se uporablja interni clock (4MHz), ker ima večina mojih projektov tudi RTC in tako rabim pine za kvarc 32768HZ.

Resnici na ljubo 88A in 168A nisem niti preizkusil ker nimam čipov, bom pa vesel, če preizkusi kdo drug.


BootLoader zaseda 512 bytov (zadnjih 512 v flashu seveda), zasede pa tudi prvi byte v SRAM-u (Reset_flags) in prvi byte v EEPROM-u (EEP0).

Razen prvega byta in zgornjih 256 bytov, SRAM ostane nedotaknjen.


Reset_flags ima ob vstopu v aplikacijo vpisanih nekaj dodatnih informacij o resetu.

Jasno pa je, da ga ob vstopu v vašo aplikacijo ne smete pobrisati.
V BASCOM AVR to recimo dosežete z direktivo $noramclear, prvo pozicijo v SRAM-u pa rezervirate z Dim Reset_Flags As Byte, najvišje v kodi kot je možno.


Kadar so ustrezni biti postavljeni na 1 pomenijo:

Reset_flags.0 - zgodil se je PowerOnReset
Reset_flags.1 - zgodil se je HardReset (na RESET nožici mikrokontrolerja)
Reset_flags.2 - zgodil se je BrownOutReset
Reset_flags.3 - zgodil se je WatchDogReset

Od teh bitov je vedno postavljen na 1 največ eden.
Kadar ni noben bit postavljen, to pomeni, da ste ali skočili na 0 (JMP $0000) ali pa imate RunAway kode in WatchDog-a ne uporabljate ali pa se je zgodilo prehitro.

Skupaj z biti 0-3 pa je lahko postavljen še eden ali več od sledečih:

Reset_flags.4 - preden v svoji aplikaciji izvedete reset z JMP $0000 ali WatchDog reset, postavite ta bit na 1 in boste vedeli, da je reset vaš
Reset_flags.5 - napaka, datoteka za flash je daljša od razpoložljivega flash pomnilnika
Reset_flags.6 - med flashom je prišlo do napake pri prenosu
Reset_flags.7 - prvi vstop v aplikacijo po izvedenem flashu

Reset_Flags je pametno čim prej postaviti na 0.


BootLoader za prenos uporablja XMODEM protokol.
Narejen je tako, da lahko hkrati uporablja MCS BootLoader v BASCOM AVR in tudi čisti XMODEM, kot je recimo v Hyper Terminal aplikaciji na Windows-ih.

BootLoader na začetku čaka slabih 200ms na morebitno zahtevo po flashu - na TX nožici odda najprej "{" oz. chr(123) in potem še Nak oz. chr(21).
Če EEP0.6 postavite na nič, se ta čas skrajša na slabih 40ms, vendar MCS BootLoader ne bo več deloval - na nožici TX odda samo Nak.
Ko se odločite, da BootLoaderja ne rabite več, oziroma vam je čas ob resetu pomemben, postavite EEP0.7 na 0 in bo čakanja na začetku zanemarljivo malo.
Le ob HardReset se bo na nožici TX pojavilo 5 impulzov v skupni dolžini 20us.

Če BootLoader potem spet potrebujete, potem skupaj sklenite nožici RX in TX in naredite HardReset. To deluje samo, če je EEP0.7 postavljen na 0.
BootLoader potem postavi EEP0.7 in .6 na 1, čaka dobrih 30 sekund in medtem oddaja ".".
Medtem lahko RX in TX spet postavite nazaj ter naredite upload aplikacije.
Za ta namen ne bosta škodila 2 dodatna headerja in 2 jumperja poleg mikrokontrolerja.

Bootloader deluje s hitrostjo 38400, ker je to na 4MHz najvišja hitrost z najmanj napake.
OSCCAL register (kalibracija internega clock-a) ostane kot je privzeto za konkretni mikrokontroler.
Če pa veste željeno OSCCAL vrednost in želite, da že BootLoader deluje s to nastavitvijo, potem lahko zadnji byte v ustrezni .bin datoteki spremenite na to vrednost - privzeto je 0, kar pomeni, da se upošteva
tovarniška nastavitev za OSCCAL.
Po želji pa lahko popravite tudi predzadnji byte, trenutno je 12, kar pomeni hitrost 38400. 51 je recimo 9600, 8 pa 57600, vendar z večjo napako.


Kar se tiče Fuse bitov je treba izbrati:

BootSize: 256 words
Reset: Select Boot Vector.
PC6 mora imeti HardReset funkcijo.
Clock naj bo 100010:Internal RC Oscillator 8MHz, to je običajno že privzeta vrednost.

Kar se tiče Lock bitov načeloma lahko ostanejo tako kot so, BootLoader ne bo povozil samega sebe, četudi je datoteka predolga (BLB1), da pa zaščitite svojo aplikacijo pred kopiranjem (LB) pa lahko nastavite:

BLB1 00: SPM is not allowed to write to the Boot Loader section, and LPM executing from the Application section is not allowed to read from the Boot Loader section.
BLB0 11: No restrictions for SPM or LPM accessing the Application section.
LB 00: Further programming and verification of the Flash and EEPROM is disabled in Parallel and Serial Programming mode.


Buco.
Priponke
MyBootLoaderBinaries.zip
Tri .bin datoteke, vsaka za en tip mikrokontolerja.
(2.01 KiB) Prenešeno 12 krat
Pred EUR sem bil SIT! (sposojeno z grafita)
Uporabniški avatar
oobuco
 
Prispevkov: 56
Pridružen: 19 Jan 2015, 15:05
Kraj: Šentvid pri Stični
Zahvalil se je: 23 krat
Prejel zahvalo: 17 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 6

Re: Še en BootLoader za ATMEGA328, 168A, 88A

OdgovorNapisal/-a DomenV » 07 Mar 2017, 15:59

Iz kje pa črpaš znanje o pisanju svojih bootloaderjev? Tega se še nisem spravil, pa bi me zanimalo.
lp, D
Uporabniški avatar
DomenV
 
Prispevkov: 250
Pridružen: 18 Jan 2015, 23:38
Kraj: Ljubljana, Trbovlje
Zahvalil se je: 31 krat
Prejel zahvalo: 40 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 11

Re: Še en BootLoader za ATMEGA328, 168A, 88A

OdgovorNapisal/-a oobuco » 07 Mar 2017, 20:21

No, saj to je isto kot drugi programi za AVR.

Samo, da si malo bolj omejen s prostorom in tako seveda v glavnem pride v poštev samo assembler.

V 512 bytov se ne da drugače spraviti prav dosti - v najboljšem primeru 256 inštrukcij.

V resnici je vse običajno, zraven pač uporabljaš še inštrukcije za pisanje v flash.

Ko boš absolviral običajne stvari, v čemer pač pišeš za AVR, se malo loti assemblerja, potem pa se boš lahko igral naprej.
Pred EUR sem bil SIT! (sposojeno z grafita)
Uporabniški avatar
oobuco
 
Prispevkov: 56
Pridružen: 19 Jan 2015, 15:05
Kraj: Šentvid pri Stični
Zahvalil se je: 23 krat
Prejel zahvalo: 17 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 6

UPDATE Še en BootLoader za ATMEGA328(P)

OdgovorNapisal/-a oobuco » 19 Mar 2017, 18:31

Še enkrat še en BootLoader za ATMEGA328(P).

Ker se navodila razlikujejo od prejšnjih, sem jih dodal še enkrat.



Ker mi noben od najdenih BootLoaderjev ni popolnoma ustrezal, sem si naredil svojega, ima nekaj dodatnih funkcij, morda pa bo še komu drugemu prišel prav.

Osebno raje uporabljam BootLoader kot programator, ker je manj kablov in en čip dam samo enkrat čez programator - toliko da naložim BootLoader - in če nič drugega imam tako manj možnosti, da zaj.... kakšen Fuse ali Lock bit.
Pa vsaj na 328 BootLoader zasede samo 1.6% prostora, kar se da pozabiti.


Prejšnjo verzijo sem malo dodelal, nekako se je našlo še nekaj bytov.
Sedaj je onemogočanje BootLoaderja enostavnejše.
Na voljo je tudi Verify funkcija.
BootLoader deluje tudi, če je WatchDog stalno vključen.


Namenjen je predvsem mikrokontrolerju ATMEGA328(P) ter podobnim, če imajo enako količino SRAM-a in je FlashPageSize enak.
Če kdo rabi, imam tudi verzije za 88(P)(PB), 168(P)(PB), 328(PB), 8(A), 16(A), 32(A), vendar še niso preizkušene.

Narejen je samo za varijanto, kjer se uporablja interni clock (4MHz), ker ima večina mojih projektov tudi RTC in tako rabim pine za kvarc 32768 Hz.
Načeloma se da s pomočjo OSCCAL registra mikrokontroler brez težav kalibrirati na frekvenco, ki omogoča tudi zanesljivo serijsko komunikacijo na 230.4kbps - priporočam 7.3728MHz, potem dobimo 3.6864MHz namesto 4MHz, kar je za BootLoader še vedno v redu.
Na 4MHz je nastavljen zato, ker ATMEGA328 pri tej frekvenci deluje tudi na 1.8V.
Za 8(A), 16(A), 32(A) so pripravljene tudi verzije za interni clock 8MHz.

BootLoader zaseda 512 bytov, zasede pa tudi prvi byte v SRAM-u (Reset_flags) in prvi byte v EEPROM-u (Eep0).

Razen prvega byta in zadnjih 256 bytov, po resetu SRAM ostane nedotaknjen - izjema je seveda v večini primerov PowerOnReset.


Reset_flags ima ob vstopu v aplikacijo (naslov $0000) vpisanih nekaj dodatnih informacij o resetu.

Jasno pa je, da ga ob vstopu v vašo aplikacijo vi ali vaš prevajalnik ne smete pobrisati.
V BASCOM AVR to recimo dosežete z direktivo $noramclear, prvo pozicijo v SRAM-u pa rezervirate z Dim Reset_Flags As Byte, najvišje v kodi kot je možno.
Prav tako morate prvi byte v EEPROM-u rezervirati za Eep0.


Kadar so ustrezni biti v Reset_flags postavljeni na 1 pomenijo:

.0 - zgodil se je PowerOnReset
.1 - zgodil se je HardReset (na RESET nožici mikrokontrolerja)
.2 - zgodil se je BrownOutReset
.3 - zgodil se je WatchDogReset

Če so vsi biti .0-.3 postavljeni na 0, to pomeni, da ste ali skočili na naslov $0000 ali pa imate Runaway kode in WatchDog-a ne uporabljate ali pa se je zgodilo prehitro.

Skupaj z biti .0-.3 pa je lahko postavljen še eden ali več od sledečih:

.4 - preden v svoji aplikaciji izvedete reset z JMP $0000 ali WatchDog reset, postavite ta bit na 1 in boste vedeli, da je reset vaš, bootloader ga ne spreminja, le ob PowerOnReset se vedno postavi na 0
.5 - ko je ta bit postavljen na 1, bo naslednji Flash v bistvu samo Verify, če bo naslednji Flash oziroma Verify takoj po PowerOnReset, pa to ne bo veljalo
.6 - med Flash ali Verify je prišlo do napake pri prenosu ali pa je datoteka daljša od razpoložljivega flash pomnilnika
.7 - prvi vstop v aplikacijo po izvedenem Flash ali Verify

Reset_Flags je pametno čim prej po dekodiranju postaviti na 0,
razen bita .5, ker če želite tudi Verify funkcionalnost, ga pustite pri miru, da z njim upravlja BootLoader.
Bit .5 se postavi na 1 samo, če je bil Flash uspešen in če je bil pred tem postavljen na 0. To je signalizacija BootLoaderju, da naj bo naslednji Flash samo Verify.
V vseh ostalih primerih se bit .5 postavi na 0.

Če slučajno želite napraviti več zaporednih Verify, potem v aplikaciji, recimo 5x zadržite ta bit na 1.
Če pa nikoli ne želite Verify, potem ga v svoji aplikaciji vedno postavite na 0.


Biti v Eep0 pa pomenijo:

.7 - če je postavljen na 0, je BootLoader onemogočen
.6 - če je postavljen na 0, je MCS BootLoader onemogočen, deluje samo XMODEM.
.5 - če je postavljen na 0 pomeni, da naj vaša aplikacija postavi .7 na 0, .5 pa na 1
.4 - če je postavljen na 0 pomeni, da naj vaša aplikacija postavi .6 na 0, .4 pa na 1
.3 - če je postavljen na 0 je WatchDog razen kakšnih 7us po resetu aktiven s timeout-om 16ms, kar se odvisno od napetosti in temperature skrajša tudi na 10ms, zato ga ob vstopu v svojo aplikacijo čimprej nastavite na željeno vrednost, oziroma ga ustavite, če ga ne nameravate uporabljati.

Bita .5 in .4 uporabljajte na sledeč način:

V drugi aplikaciji, recimo ji DisableBootloader, postavite bit .5 na 0.

V pravi aplikaciji pa bit .5 preverjajte in če je 0, potem postavite .7 na 0, .5 pa nazaj na 1.
S tem se izognete nepotrebnemu pisanju v EEPROM.
Lahko naredite tudi tako, da bit Eep0.5 preverjate samo pogojno, recimo samo če je bil Verify pravkar uspešen (Reset_flags.7=1,.6=0,.5=0) in je šlo za HardReset(Reset_flags.1=1).



BootLoader za prenos uporablja XMODEM protokol.
Narejen je tako, da lahko hkrati uporablja MCS BootLoader v BASCOM AVR in tudi čisti XMODEM, kot je recimo v Hyper Terminal aplikaciji na Windows-ih.

BootLoader na začetku čaka slabih 200ms na morebitno zahtevo po flashu - na TX nožici odda najprej "{" oz. chr(123) in potem še Nak oz. chr(21).
Če Eep0.6 postavite na 0, se ta čas skrajša na slabih 40ms, vendar MCS BootLoader ne bo več deloval - na nožici TX odda samo Nak.
Ko se odločite, da BootLoaderja ne rabite več, oziroma vam je čas ob resetu pomemben, postavite Eep0.7 na 0 in bo čakanja na začetku zanemarljivo malo - okoli 40us.
Ko sta Eep0.7 in/ali Eep0.6 postavljena na 0, se bo ob vsake vrste resetu najprej na nožici TX pojavilo 5 impulzov v skupni dolžini 20us.

Če BootLoader kasneje spet potrebujete, potem skupaj sklenite nožici RX in TX in naredite kakršenkoli reset. To deluje samo, če sta Eep0.7 in/ali Eep0.6 postavljena na 0.
BootLoader postavi vse bite v Eep0 na 1, čaka dobrih 30 sekund in potem nadaljuje na na naslovu $0000.
Za ta namen ne bosta škodila 2 dodatna headerja in 2 jumperja poleg mikrokontrolerja.

Bootloader privzeto deluje s hitrostjo 38400, ker je to na 4MHz najvišja hitrost z najmanj napake.
OSCCAL register (kalibracija internega clock-a) ostane kot je privzeto za konkretni mikrokontroler.
Če pa veste željeno OSCCAL vrednost in želite, da že BootLoader deluje s to nastavitvijo, potem lahko preden s programatorjem vpisujete BootLoader, zadnji byte v .bin datoteki spremenite na to vrednost - privzeto je 0, kar pomeni, da se upošteva tovarniška nastavitev za OSCCAL.
Po želji pa lahko popravite tudi predzadnji byte, trenutno je 12, kar pomeni hitrost 38400. 51 je recimo 9600, 8 pa 57600, vendar z večjo napako.


Kar se tiče Fuse bitov je treba izbrati:

"Divide clock by 8 enabled", da bo startna frekvenca samo 1MHz in zmore mikrokontroler delovati tudi na 1.8V, pozneje se jo da spremeniti programsko - CLKPR register.
"100010:Int. RC Osc. 8 MHz", to je običajno že privzeta vrednost, če pa imate napajanje v redu, lahko izberete tudi "010010:Int. RC Osc. 8 MHz" ali "000010:Int. RC Osc. 8 MHz" - krajši časi reseta.
"1:PIN PC6 is RESET", lahko pa tudi "0:PIN PC6 is IO pin", da reset pin postane PC6. Potem sicer ne bo več HardReseta in s programatorjem najbrž ne boste mogli programirati čipa, lahko pa ga boste z BootLoaderjem, samo reset bo moral biti PowerOn ali WatchDog.
"1:WDT enabled by WDTCR", vklop in izklop watchdoga lahko izbirate programsko, če pa gre za kritično zadevo potem izberite "0:WDT always on", BootLoader bo vseeno deloval pravilno.
"11:BootSize 256 words"
"0:Select BOOT Vector"

Ostale pa po potrebi.


Kar se tiče Lock bitov načeloma lahko ostanejo tako kot so, BootLoader ne bo povozil samega sebe, četudi je datoteka predolga, da pa zaščitite svojo aplikacijo pred kopiranjem pa lahko nastavite:

"00: SPM is not allowed to write to the Boot Loader section, and LPM executing from the Application section is not allowed to read from the Boot Loader section"
"11: No restrictions for SPM or LPM accessing the Application section"
"00: Further programming and verification of the Flash and EEPROM is disabled in Parallel and Serial Programming mode"
Priponke
MyBootLoader_27_ATMEGA328(P).zip
(730 bajtov) Prenešeno 5 krat
Pred EUR sem bil SIT! (sposojeno z grafita)
Uporabniški avatar
oobuco
 
Prispevkov: 56
Pridružen: 19 Jan 2015, 15:05
Kraj: Šentvid pri Stični
Zahvalil se je: 23 krat
Prejel zahvalo: 17 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 6


Vrni se na Software

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost