dave
my pic config has currently set to protect memory , is this a problem for the bootloader ?

also what changes need to be done to the pbp code to allow bootloader to work , i have read that addtional defines are required for other bootloaders such as
DEFINE LOADER_USED 1
DEFINE RESET_ORG 800h ' For Microchip USB Bootloader
DEFINE INTERRUPT_ORG 808h ' For Microchip USB Bootloader

are these required for tiny bootloader ???



Code:
radix DEC
list  p=18f87k22
	; change these lines accordingly to your application	
#include "p18f87k22.inc"
IdTypePIC = 0x6F		; Please refer to the table below, must exists in "piccodes.ini"	
#define max_flash  0x20000	; in WORDS, not bytes!!! (= 'max flash memory' from "piccodes.ini" divided by 2), Please refer to the table below
#define	SELECTEUSART 1		; EUSART(1/2), Please refer to the table below
#define	PDIP 80			; PIN Count of Device (64/80), Please refer to the table below

xtal 	EQU 	64000000	; you may also want to change: _HS_OSC _XT_OSC
baud 	EQU 	19200		; standard TinyBld baud rates: 115200 or 19200

;   The above 7 lines can be changed and buid a bootloader for the desired frequency (and PIC type)

; +---------+--------+------------+------------+-------------+-------------+-----------+--------+------+
; |IdTypePIC| Device | Write_Page | Erase_Page |   TX1/TX2   |   RX1/RX2   | max_flash | EEPROM | TQFP |
; +---------+--------+------------+------------+-------------+-------------+-----------+--------+------+
; |   0x6C  |18F65K22|  32 words  |  32 words  |C6(31)/G1(4) |C7(32)/G2(5) |   0x8000  |  1024  |  64  |
; |   0x6C  |18F85K22|  32 words  |  32 words  |C6(37)/G1(6) |C7(38)/G2(7) |   0x8000  |  1024  |  80  |
; |   0x66  |18F66K22|  32 words  |  32 words  |C6(31)/G1(4) |C7(32)/G2(5) |  0x10000  |  1024  |  64  |
; |   0x66  |18F86K22|  32 words  |  32 words  |C6(37)/G1(6) |C7(38)/G2(7) |  0x10000  |  1024  |  80  |
; |   0x6F  |18F67K22|  64 words  |  64 words  |C6(31)/G1(4) |C7(32)/G2(5) |  0x20000  |  1024  |  64  |
; |   0x6F  |18F87K22|  64 words  |  64 words  |C6(37)/G1(6) |C7(38)/G2(7) |  0x20000  |  1024  |  80  |
; +---------+--------+------------+------------+-------------+-------------+-----------+--------+------+

 #IF (SELECTEUSART == 1)
#define _TXSTA TXSTA1
#define _SPBRG SPBRG1
#define _RCSTA RCSTA1
#define _TXREG TXREG1
#define _PIR PIR1
#define _RCIF RC1IF
 #ELSE
#define _TXSTA TXSTA2
#define _SPBRG SPBRG2
#define _RCSTA RCSTA2
#define _TXREG TXREG2
#define _PIR PIR3
#define _RCIF RC2IF
 #ENDIF

        ;********************************************************************
	;	Tiny Bootloader		18F6XK22/18F8XK22   Size=100/132words
        ;       [email protected]
        ;       http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
	;	(2018.04.18 Revision 6)
	;
	;	This program is only available in Tiny Multi Bootloader +.
	;
	;	Tiny Multi Bootloader +
	;	https://sourceforge.net/projects/tinypicbootload/
	;
        ;********************************************************************

	#include "spbrgselect.inc"	; RoundResult and baud_rate

#if(IdTypePIC == 0x6F)
		#define first_address max_flash-264		;132 words
#else
		#define first_address max_flash-200		;100 words
#endif
	;Setup CONFIG1L
		config RETEN = ON	;Enabled - Controlled by SRETEN bit
		config INTOSCSEL = HIGH	;LF-INTOSC in High-power mode during Sleep
		config SOSCSEL = DIG	; Digital (SCLKI) mode; I/O port functionality of RC0 and RC1 is enabled
		config XINST = OFF	;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
	;Setup CONFIG1H
		config FOSC = HS2	; HS oscillator (High power, 16 MHz - 25 MHz) - makes OSC1 input PREAMP active for TCXO 16.386 0.8VPP
		config PLLCFG = ON	;PLL x4 Enable bit Disabled
		config FCMEN = OFF	;Fail-Safe Clock Monitor disabled
		config IESO = OFF	;Oscillator Switchover mode disabled
	;Setup CONFIG2L
		config PWRTEN = ON	;PWRT enabled
		config BOREN = SBORDIS  ; Enabled in hardware, SBOREN disabled
		config BORV = 2		;VBOR set to 2 V nominal
		config BORPWR = ZPBORMV ; ZPBORMV instead of BORMV is selected
	;Setup CONFIG2H
		config WDTEN = ON	;WDT is controlled by SWDTEN bit of the WDTCON register
		config WDTPS = 512	;Watchdog Timer Postscale Select bits 1:512
	;Setup CONFIG3L
		config RTCOSC = SOSCREF	;RTCC uses SOSC
#if (PDIP == 80)
		config EASHFT = ON	;Address Shifting ENABLED
		config ABW = MM         ;Microprocessor mode , External Memory bus not used - allows portsD,E,H,J  for I/O use
                                        ;MM = also ignores MEMCON.7=0 (default POR)  setting for EMB use  
		config BW = 16		;16-bit external bus mode
		config WAIT = OFF	;Disabled
#endif
	;Setup CONFIG3H
		config CCP2MX = PORTC	;CCP2 input/output is multiplexed with RC1
#if (PDIP == 80)
		config ECCPMX = PORTE	;Enhanced CCP1/3 [P1B/P1C/P3B/P3C] muxed with RE6/RE5/RE4/RE3
#endif
		config MSSPMSK = MSK7	;7 Bit address masking mode
		config MCLRE = ON	;MCLR pin enabled RG5 input pin disabled
	;Setup CONFIG4L
		config STVREN = OFF	;Stack full/underflow will not cause Reset
		config BBSIZ = BB1K	;1K word Boot Block size
		config DEBUG = OFF	;Background debugger disabled, RA0 and RA1 configured as general purpose I/O pins
	;Setup CONFIG5L
		config CP0 = ON		;  MEMORY BLOCK 0 CODE PROTECT BIT - 7KW 800h  - 3FFFh ( when 1K BOOT OPTION used )
		config CP1 = ON         ;  MEMORY BLOCK 1 CODE PROTECT BIT - 8KW 4000h - 7FFFh
		config CP2 = ON         ;  MEMORY BLOCK 2 CODE PROTECT BIT - 8KW 8000h - BFFFh
                config CP3 = ON         ;  MEMORY BLOCK 3 CODE PROTECT BIT - 8KW C000h - FFFFh
#if (IdTypePIC == 0x6F)
		config CP4 = ON         ;  MEMORY BLOCK 4 CODE PROTECT BIT - 8KW 10000h - 12FFFh
		config CP5 = ON         ;  MEMORY BLOCK 5 CODE PROTECT BIT - 8KW 14000h - 17FFFh
		config CP6 = ON         ;  MEMORY BLOCK 6 CODE PROTECT BIT - 8KW 18000h - 1BFFFh
		config CP7 = ON         ;  MEMORY BLOCK 7 CODE PROTECT BIT - 8KW 1C000h - 1FFFFh
#endif
	;Setup CONFIG5H
		config CPB = OFF	;Boot block not code-protected
		config CPD = ON		;Data EEPROM  code-protected
	;Setup CONFIG6L
		config WRT0 = OFF	;Block 0 not write-protected
		config WRT1 = OFF	;Block 1 not write-protected
		config WRT2 = OFF	;Block 2 not write-protected
		config WRT3 = OFF	;Block 3 not write-protected
#if (IdTypePIC == 0x6F)
		config WRT4 = OFF	;Block 4 not write-protected
		config WRT5 = OFF	;Block 5 not write-protected
		config WRT6 = OFF	;Block 6 not write-protected
		config WRT7 = OFF	;Block 7 not write-protected
#endif
	;Setup CONFIG6H
		config WRTC = ON	;Configuration registers write-protected
		config WRTB = ON	;Boot block write-protected
		config WRTD = OFF	;Data EEPROM not write-protected
	;Setup CONFIG7L
		config EBRT0 = OFF	;Block 0 not protected from table reads executed in other blocks
		config EBRT1 = OFF	;Block 1 not protected from table reads executed in other blocks
		config EBRT2 = OFF	;Block 2 not protected from table reads executed in other blocks
		config EBRT3 = OFF	;Block 3 not protected from table reads executed in other blocks
#if (IdTypePIC == 0x6F)
		config EBRT4 = OFF	;Block 4 not protected from table reads executed in other blocks
		config EBRT5 = OFF	;Block 5 not protected from table reads executed in other blocks
		config EBRT6 = OFF	;Block 6 not protected from table reads executed in other blocks
		config EBRT7 = OFF	;Block 7 not protected from table reads executed in other blocks
#endif
	;Setup CONFIG7H
		config EBRTB = OFF	;Boot block not protected from table reads executed in other blocks

;----------------------------- PROGRAM ---------------------------------
	cblock 0
	buffer:14
	crc
	i
	flag
	cnt1
	cnt2
	cnt3
	endc
	
;0000000000000000000000000 RESET 00000000000000000000000000

		ORG     0x0000
		GOTO    IntrareBootloader

;view with TabSize=4
;&&&&&&&&&&&&&&&&&&&&&&&   START     &&&&&&&&&&&&&&&&&&&&&&
;----------------------  Bootloader  ----------------------
;PC_flash:		C1h		U		H		L		64/128  ... <64/128 bytes> ...  crc
;PC_eeprom:		C1h		40h   		EEADRH  	EEADR   	1		EEDATA		crc
;PC_cfg			C1h		U OR 80h	H		L		14  ... <14 bytes>   ...  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:
						;Init int clock & serial port
	lfsr	FSR1,_TXREG			;FAR1 = TXREG1 or TXREG2

	bsf	OSCCON,IRCF0			;int clock 16MHz

#if (SELECTEUSART == 2)
	movlb	.15				;bank0 -> bank15
	clrf	ANCON2,BANKED	  		; setup digital I/O
#endif

	movlw 	((1<<TXEN) | (1<<BRGH))		;init serial port
	movwf 	_TXSTA,BANKED
	movlw	spbrg_value
	movwf	_SPBRG,BANKED
	movlw	((1<<SPEN) | (1<<CREN))
	movwf	_RCSTA,BANKED
	movlb	.0				;bank15 -> bank0

						;wait for computer
	rcall 	Receive
	sublw 	0xC1				;Expect C1h
	bnz 	way_to_exit
	movlw   IdTypePIC			;send PIC type
	movwf   INDF1

MainLoop:
	movlw 	'C'				; "-Everything OK, ready and waiting."
mainl:
	movwf   INDF1
	clrf 	crc
	rcall 	Receive				;Upper
	movwf 	TBLPTRU
	movwf 	flag
	rcall 	Receive				;High
	movwf 	TBLPTRH
	movwf 	EEADRH				;(for EEPROM case)
	rcall 	Receive				;Low
	movwf 	TBLPTRL
	movwf 	EEADR				;(for EEPROM case)

	rcall 	Receive				;Count
	movwf 	i

	clrf	FSR0L				;FSR0 = Buffer TOP
	tblrd*-					;TBLPTR = TBLPTR - 1
rcvoct:
	rcall 	Receive
	btfsc 	flag,7				;Skip if not Config
	movwf 	POSTINC0			;(for Config case)
	movwf 	EEDATA				;(for EEPROM case)
	movwf 	TABLAT				;(for PFM case)
	tblwt+*
	decfsz 	i,F
	bra 	rcvoct

	rcall 	Receive				;CRC
ziieroare:					;CRC failed
	movlw	'N'
	bnz	mainl

	btfsc 	flag,7				;Skip if not Config
	bra	wr_cfg				;Write Config
	movlw 	(1<<WREN)			;Setup EEPROM
	btfss 	flag,6				;Skip if EEPROM
	rcall 	Erase
	rcall 	Write
	bra 	MainLoop

wr_cfg:
	decf	FSR0L,F				;FSR0 = FSR0 - 1
	movf	INDF0,W				;Set TABLAT
	movwf	TABLAT
	movlw	((1<<EEPGD)|(1<<CFGS)|(1<<WREN));Setup cfg
	rcall 	Write
	tblrd*-					;TBLPTR = TBLPTR - 1
	tstfsz	FSR0L				;FSR0L = 0 ?
	bra	wr_cfg
	bra 	MainLoop

;************************ Subroutines ************************

Erase:
	movlw	((1<<EEPGD)|(1<<FREE)|(1<<WREN)); Setup erase
Write:
	movwf	EECON1
	movlw	0x55
	movwf 	EECON2
	movlw 	0xAA
	movwf 	EECON2
	bsf 	EECON1,WR
	retlw	((1<<EEPGD)|(1<<WREN))		; Setup writes

Receive:
	movlw 	(xtal/2000000+1)		; for 20MHz => 11 => 1second delay
	movwf 	cnt1
rpt2:
	clrf 	cnt2
rpt3:
	clrf 	cnt3
rptc:
	btfss 	_PIR,_RCIF			;test RX
	bra 	notrcv
	incf	FSR1L,F				;FSR1 = RCREG1 or RCREG2 -> TXREG1 or TXREG2
	movf 	POSTDEC1,W			;return read data in W
	addwf 	crc,F				;compute crc
	return
notrcv:
	decfsz 	cnt3,F
	bra 	rptc
	decfsz 	cnt2,F
	bra 	rpt3
	decfsz 	cnt1,F
	bra 	rpt2
						;timeout
way_to_exit:
	clrf	EECON1				; deactivate EECON
	movlb	.15
	bcf	_SPBRG,SPEN			; deactivate UART
	movlb	.0
	bra	first_address

;*************************************************************
; After reset
; Do not expect the memory to be zero,
; Do not expect registers to be initialised like in catalog.

            END
Name:  Capture.JPG
Views: 18615
Size:  275.0 KB