Bootloader for 18F2550

Started by Malcolm Crabbe April 6, 2006
Guys need your help

I have a cheap commercial PIC programmer based on the JMD design. It
works fine, but I have subsequently found that it will not program
18F2550 PICs via ICSP, but will work fine when the PIC is placed in the
sockets on the programmer.

A friend therefore suggested that I use a bootloader which will make for
rapid loading and testing of the development code I'm working on. He
suggested the Tiny Bootloader (
http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm ) as it
supports the chip I'm using.

I then made a development board comprising of the the project hardware
and RS232 coms via a MAX 232cpe chip. - The project hardware checks out
OK, as does the MAX232 hardware, but every time I try to communicate
with the PIC via the PC software it fails to find the PIC.

We've modified the asm sample code to suit the 4 Mhz xtal I'm using in
the project.so the bootloader code now looks like:

radix DEC
LIST PF2550 ; change also: Configure->SelectDevice from Mplab
; 20MHzQuartz / 5 * 24 / 4 => 24MHz ; check _CONFIG1
xtal EQU 24000000 ; 'xtal' here is resulted frequency (is no
longer quartz frequency)
baud EQU 115200 ; the desired baud rate

;********************************************************************
; Tiny Bootloader 18F*55 series Size0words
; c...@ugal.ro
; http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
;********************************************************************
; | 12kW 16kW
; -----+----------------
; 28pin| 2455 2550
; 40pin| 4455 4550
#include "../icdpictypes.inc" ;takes care of: #include
"p18fxxx.inc", max_flash, IdTypePIC
#include "../spbrgselect.inc" ; RoundResult and baud_rate

#define first_address max_flash-200 ;100 words

CONFIG PLLDIV=1, CPUDIV=OSC3_PLL4, USBDIV=2
CONFIG FOSC=XTPLL_XT, FCMEM=OFF, IESO=OFF
CONFIG PWRT=OFF, BOR=ON, BORV=3, VREGEN=ON
CONFIG WDT=OFF, WDTPS2768
CONFIG MCLRE=ON, LPT1OSC=OFF, PBADEN=OFF, CCP2MX=ON
CONFIG STVREN=ON, LVP=OFF, XINST=OFF, DEBUG=OFF ; ICPRT=OFF
CONFIG CP0=OFF, CP1=OFF, CP2=OFF, CPB=OFF, CPD=OFF
CONFIG WRT0=OFF, WRT1=OFF, WRT2=OFF
CONFIG WRTB=OFF, WRTC=OFF, WRTD=OFF
CONFIG EBTR0=OFF, EBTR1=OFF, EBTR2=OFF
CONFIG EBTRB=OFF
IFDEF __18F2550
CONFIG WRT3=OFF, EBTR3=OFF, CP3=OFF
ENDIF

;----------------------------- PROGRAM ---------------------------------
cblock 0
crc
i
cnt1
cnt2
cnt3
counter_hi
counter_lo
flag
endc
cblock 10
buffer:64
endc

SendL macro car
movlw car
movwf TXREG
endm

;0000000000000000000000000 RESET 00000000000000000000000000

ORG 0x0000
GOTO IntrareBootloader

;view with TabSize=4
;&&&&&&&&&&&&&&&&&&&&&&& START &&&&&&&&&&&&&&&&&&&&&&
;---------------------- Bootloader ----------------------
;PC_flash: C1h U H L x ...
<64 bytes> ... crc
;PC_eeprom: C1h 40h EEADR EEDATA 0
crc
;PC_cfg C1h U OR 80h H L 1
byte crc
;PIC_response: type `K`

ORG first_address ;space to deposit first 4 instr. of
user prog.
nop
nop
nop
nop
org first_address+8
IntrareBootloader
;skip TRIS to 0 C6 ;init serial port
movlw b'00100100'
movwf TXSTA
;use only SPBRG (8 bit mode default) not using BAUDCON
movlw spbrg_value
movwf SPBRG
movlw b'10010000'
movwf RCSTA
;wait for computer
rcall Receive
sublw 0xC1 ;Expect C1h
bnz way_to_exit
SendL IdTypePIC ;send PIC type
MainLoop
SendL 'K' ; "-Everything OK, ready and waiting."
mainl
clrf crc
rcall Receive ;Upper
movwf TBLPTRU
movwf flag ;(for EEPROM and CFG cases)
rcall Receive ;Hi
movwf TBLPTRH
movwf EEADR ;(for EEPROM case)
rcall Receive ;Lo
movwf TBLPTRL
movwf EEDATA ;(for EEPROM case)

rcall Receive ;count
movwf i
incf i
lfsr FSR0, (buffer-1)
rcvoct ;read 64+1 bytes
movwf TABLAT ;prepare for cfg; => store byte before crc
rcall Receive
movwf PREINC0
decfsz i
bra rcvoct

tstfsz crc ;check crc
bra ziieroare
btfss flag,6 ;is EEPROM data?
bra noeeprom
movlw b'00000100' ;Setup eeprom
rcall Write
bra waitwre
noeeprom
btfss flag,7 ;is CFG data?
bra noconfig
tblwt* ;write TABLAT(byte before crc) to TBLPTR***
movlw b'11000100' ;Setup cfg
rcall Write
bra waitwre
noconfig
;write
eraseloop
movlw b'10010100' ; Setup erase
rcall Write
TBLRD*- ; point to adr-1

writebigloop
movlw 2 ; 2groups
movwf counter_hi
lfsr FSR0,buffer
writesloop
movlw 32 ; 32bytes = 4instr
movwf counter_lo
writebyte
movf POSTINC0,w ; put 1 byte
movwf TABLAT
tblwt+*
decfsz counter_lo
bra writebyte

movlw b'10000100' ; Setup writes
rcall Write
decfsz counter_hi
bra writesloop
waitwre
;btfsc EECON1,WR ;for eeprom writes (wait to finish write)
;bra waitwre ;no need: round trip time with PC bigger
than 4ms

bcf EECON1,WREN ;disable writes
bra MainLoop

ziieroare ;CRC failed
SendL 'N'
bra mainl

;******** procedures ******************

Write
movwf EECON1
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR ;WRITE
nop
;nop
return
Receive
movlw xtal/2000000+1 ; for 20MHz => 11 => 1second delay
movwf cnt1
rpt2
clrf cnt2
rpt3
clrf cnt3
rptc
btfss PIR1,RCIF ;test RX
bra notrcv
movf RCREG,w ;return read data in W
addwf crc,f ;compute crc
return
notrcv
decfsz cnt3
bra rptc
decfsz cnt2
bra rpt3
decfsz cnt1
bra rpt2
;timeout:
way_to_exit
bcf RCSTA, SPEN ; deactivate UART
bra first_address
;*************************************************************
; After reset
; Do not expect the memory to be zero,
; Do not expect registers to be initialised like in catalog.

END
I've checked with a windows based scope and it records signals
(handshake request) on the RX pin of the PIC - but still it fails to
respond. I've also tried swapping the tx/rx lines over just in case I
got them wrong and that didn't work !

Can anyone come up with some ideas - or a didferent bootloader that
might work with this PIC ?

Cheers

Malcolm