PIC bootloader
#1
Hei, elektroonikud!
Ma olen siin juba paar päeva vaevelnud probleemi kallal, kuidas kirjutada läbi omtehtud bootloaderi PICi konfi baite. Konkreetne kivi on PIC18F46K80.
Kõik muu kirjutub ilusasti kuid konfiga tekib jama - esimene bait aardressil 0x30 00 00 on progejaga tagasi lugedes alati 00. Kommenteerides konfiala kirjutamise jupi välja, viga kaob. Muud konfibaidid kirjutatakse õigesti. Data kirjutamise puhvrisse tuleb õige (debug-väljatrükk näitab).
Toimetan nii:
- kustutan konfiala 15 baiti
- kirjutan baidid TBLWRT*+ käsuga
- sätin biti WR mis peaks käivitama kirjutamise
Enne kustutamist ja kirjutamist sean TBLPTR= 0x 30 00 00
JA ikka....
Mis loll viga see on, mida ma ei suuda näha?
PHP Kood:
                clrwdt
                movlw    0x30
                movwf    TBLPTRU                    
kustuta senised confibaidid
                clrf    TBLPTRH
                clrf    TBLPTRL
                BCF     EECON1
,EEPGD
                BSF     EECON1
,CFGS
                BSF     EECON1
,WREN                kirjuta FLASHiluba kirjutamine
                BSF     EECON1
,FREE             enable Erase operation
                MOVLW     0x55                    
lahtilukustamine
                MOVWF     EECON2     
                MOVLW     0xAA
                MOVWF     EECON2 
                BSF     EECON1
,WR                 kustuta blokkprose hangub seniks.
                
nop
                BCF     EECON1
,WREN                keela kirjutamine FLASHi ja row erase
                BCF     EECON1
,FREE         
                clrwdt
                movlw    0x30
                movwf    TBLPTRU                    
taasta aadress
                clrf    TBLPTRH
                clrf    TBLPTRL
                LFSR    .2
,BootloaderBuf2        0E baiti conffi kirjutadasoorts siin
                movlw    0x0C
                movwf    Count
bldr_end3
:        movff    POSTINC2,TABLAT
                TBLWT
*+
                
clrwdt
                decfsz    Count
                
goto    bldr_end3
                clrwdt
                movlw    0x30
                movwf    TBLPTRU                    
taasta aadress
                clrf    TBLPTRH
                clrf    TBLPTRL
;                TBLRD*-
                
BCF     EECON1,EEPGD
                BSF     EECON1
,CFGS
                call    bwr_flsh2 
käivitab kirjutamise tsükli 64 baiti

Head aastavahetust !
/Felch
Vasta
#2
(31-12-2014, 09:35 PM)felch Kirjutas: movlw 0x0C
movwf Count
bldr_end3: movff POSTINC2,TABLAT
TBLWT*+
clrwdt
decfsz Count
goto bldr_end3
clrwdt
Head aastavahetust !
/Felch
Minusugune laiskvorst Kirjutab C-s ja laseb valmis bootloaderil laadida.

Aga PIC*4550 jutus nad teevad seda kirjutust terake teisiti.
Kas nad on jobud või peabki see nii olema?

MOVLW D’32’ ; number of bytes in holding register
MOVWF COUNTER
WRITE_BYTE_TO_HREGS
MOVF POSTINC0, W ; get low byte of buffer data
MOVWF TABLAT ; present data to table latch
TBLWT+* ; write data, perform a short write
; to internal TBLWT holding register.
DECFSZ COUNTER ; loop until buffers are full
BRA WRITE_WORD_TO_HREGS

Head ja transleeruvat uut aastat.
A.R.
Vasta
#3
Ivanovi lihtmeetod:

topi iga käsu vahele 10 nop-i

Kui korda läheb, teab timingu probleeme otsida.

Noh, ja errata-dest on ka palju huvitavat välja tulnud, ei usu et see PIC erand on Smile
Vasta
#4
Niipaljukest ma kodutööd enne tegin, et lugesin errata lehte - selle asja kohta polnud midagi öeldud.NOP on hea lahend aga hetkel tundub mitte see olevat. Flashi koodibaidid kirjutatakse ju täpselt analoogse rutiiniga ja toimib. Konfiala on samuti prose enda sisemine flash, vaid aadress on teine. Kogu toimetamine käib prose ränikivises kõhus, mingeid perifeeriaseadmeid ei kasutata ja kirjutamise ajal on ka kõik katkestused keelatud. See on nagunii viimane etapp, peale seda tehakse reset.

A.R., su viidatud kood on ju sama mis minulgi! Vaid baitide arv on teine ja kirjutamise käske pole näidatud (otse flashi kirjutamise sest TBLWRT kirjutab vaid mäluregistritesse).
Konfibaidid kirjutuvad aga esimene läheb alati aia taha. Tundub, et siin on mingi kiiks...mida ma sellest hiljem teades ka ise DS-is selgelt näeks. Aga paraku veel ei tea...
Miks ma teen ise bootloaderit? Sest see peab töötama MODBUS protokolliga ühel tellimustööl - spetsiifiline plaat. Minu teada ei töeta ükski bootloader modbus'i käske.
Asi iseenesest tuli suht talutav - elab üle ka voolukatkestused bootloadimise ajal jne. Kui sellest viimasest veast ka üle saaks...
Vasta
#5
(02-01-2015, 08:36 PM)felch Kirjutas: A.R., su viidatud kood on ju sama mis minulgi!
Jäi silma väike vahe nimedes.
***

0. aadresile ei kirjuta!
Kas 1. saab 0. või 1. sisu?

Kas need teised TBLWT käsud ( TBLWT*, TBLWT*+, TBLWT*-, TBLWT+*)
saavad sellele 0. pihta?
Vast annab seda 0. sisu eraldi, mitte tsüklis, kirjutada?

Kas oled seda kirjutist proovinud ka mõne teist marki PICi peal?
Võib ju olla sellel tüübil mingi käsu anomaalia.
Vasta
#6
Felch, kas leidsid kala üles ? Valgusta teisigi ! Smile
Vasta
#7
Veel ei ole leidnud, panin ta mõneks ajaks kõrvale. Ilmselt pean varsti edasi tegelema. Kui vea leian, annan kindlasti teada.
Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: 1 külali(st)ne