Bootloader for 18f452 [solved] - thenorthstar - 2011-04-01
Please help me .
How can I write code in the Offset?
#ORG ????????? How can I write code in the Offset?
my code is
Code: #include <18F452.h>
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
#fuses HS, NOWDT,NOLVP, NOPROTECT,NOBROWNOUT, NOPUT, STVREN, NODEBUG, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay(clock=10000000)
#use fast_io(a)
#define MODBUS_TYPE MODBUS_TYPE_SLAVE
#define MODBUS_SERIAL_RX_BUFFER_SIZE 64
#define MODBUS_SERIAL_BAUD 38400
#define MODBUS_SERIAL_RX_PIN PIN_C7
#define MODBUS_SERIAL_TX_PIN PIN_C6
#define MODBUS_SERIAL_ENABLE_PIN PIN_C5
#define MODBUS_SERIAL_RX_ENABLE PIN_C5 // Controls RE pin for RS485 transceiver
#define MODBUS_SERIAL_INT_SOURCE MODBUS_INT_RDA
#define MODBUS_SERIAL_TYPE MODBUS_RTU // use MODBUS_ASCII for ASCII mode
#include <modbus.c>
RE: Bootloader for 18f452 - Mikael Gustavsson - 2011-04-01
What do you mean by this?
>How can I write code in the Offset?
Regarding "bl protection tripped", please post your settings.inc and settings under the advanced tab in the gui. Also activate debug mode on the options menu and do a download, post the output or a screen-shot.
RE: Bootloader for 18f452 - thenorthstar - 2011-04-02
(2011-04-01, 22:01:39)Mikael Gustafsson Wrote: What do you mean by this?
>How can I write code in the Offset?
Regarding "bl protection tripped", please post your settings.inc and settings under the advanced tab in the gui. Also activate debug mode on the options menu and do a download, post the output or a screen-shot.
Thank you for your response and I'm sorry for writing in English
>How can I write code in the Offset? mean like this,
The following code, Righ, for this bootloader?
Quote:#define flash_max getenv("PROGRAM_MEMORY")
#org flash_max-321,flash_max-1
void bootloader()
{
}
You want to write the code and add my code.
settings under the advanced tab in the gui;
http://www.4shared.com/photo/l0-gem-4/Setting.html
settings.inc and my code;
http://www.4shared.com/file/F7SVPBiY/PIC18F.html
Please hepl me.
RE: Bootloader for 18f452 - Mikael Gustavsson - 2011-04-02
You usually don't need to make the application aware of the boot loader.
You should not check "don't write goto at 0x00" under the advanced tab.
Which compiler do you use?
* Remove #org flash_max-321,flash_max-1, void bootloader(){}
* Uncheck "don't write goto at 0x00"
* Activate debug mode
* Download
* Post result
RE: Bootloader for 18f452 - thenorthstar - 2011-04-03
(2011-04-02, 18:55:47)Mikael Gustafsson Wrote: You usually don't need to make the application aware of the boot loader.
You should not check "don't write goto at 0x00" under the advanced tab.
Which compiler do you use?
* Remove #org flash_max-321,flash_max-1, void bootloader(){}
* Uncheck "don't write goto at 0x00"
* Activate debug mode
* Download
* Post result
[/code]
Hi, I'm remove the line
Quote:#define flash_max getenv("PROGRAM_MEMORY")
#org flash_max-321,flash_max-1
void bootloader()
{
}
and Uncheck "don't write goto at 0x00" under the advanced tab. And download my hex code.
And Program is working , but the bootloader is cancel for 0X7E30 last addresses in the row to change , not working again.
I'm use CCS compiler V4.114 Version And ds30_Loader_101106 Version.
How do I add a code into the my CCS Code for bootloader continuous use? Plaese help me.
There is a problem. ds30_Loader_110115 version does not work.
RE: Bootloader for 18f452 - Mikael Gustavsson - 2011-04-04
Thanks for all the information. The flash contents looks ok after download.
The change you noticed at 0x7e30 is the goto to the user application.
Do you write configs?
Do you press download within 2 seconds after PIC reset?
Or do you press download and the reset the PIC?
I think the exception is already fixed just not released yet.
RE: Bootloader for 18f452 - thenorthstar - 2011-04-05
(2011-04-04, 22:46:34)Mikael Gustafsson Wrote: Thanks for all the information. The flash contents looks ok after download.
The change you noticed at 0x7e30 is the goto to the user application.
Do you write configs?
Do you press download within 2 seconds after PIC reset?
Or do you press download and the reset the PIC?
I think the exception is already fixed just not released yet.
Thank you very much.
Yes, I write configs and press download and the reset the PIC, not again
How do I add a code into the my ccs code for ds30 bootloader always to use in my project?
for example,
When I use tiny bootloader, my ccs code to add the following code.
Code: #include <18F452.h>
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
//!//#fuses HS, NOWDT,NOLVP, NOPROTECT,BROWNOUT, NOPUT, STVREN, NODEBUG, LVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#define flash_max getenv("PROGRAM_MEMORY")
//==============Bootloader Adress=============================================
#org flash_max-264,flash_max-1
void bootloader()
{
}
//==============Bootloader Adress=============================================
#use delay(clock=10000000)
#use fast_io(a)
#use fast_io(d) //Port yönlendirme komutları D portu için geçerli
#include "2x16_4x20_LCD.c"
//=========================================================================================
I add this code in my ccs code,I always use tiny bootloader without a problem. But I would like to use ds30loader.
Do I need to add code to my ccs code like this for ds30loader always use?
Tiny Bootloader for 485 link below
http://www.4shared.com/file/b4HD1kbL/Tiny_bootloadefor_485.html
Thank you for your interest.
RE: Bootloader for 18f452 - Mikael Gustavsson - 2011-04-05
Unless you know exactly what you do and you have a good reason to, DON'T write configs.
Please try that first.
RE: Bootloader for 18f452 - thenorthstar - 2011-04-06
(2011-04-05, 22:15:36)Mikael Gustafsson Wrote: Unless you know exactly what you do and you have a good reason to, DON'T write configs.
Please try that first.
My friend, as you said, I did not write configs, but not again. my code is working but bootloader is canceled
Can I make a request from you?
There is a Bootloader code and small code example below.
My Code:
Code: //**************CCS V4.114*****************
#include <18F452.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=10000000)
#use fast_io(a)
#use fast_io(d)
#include "2x16_4x20_LCD.c"
//=========================================================================================
void main()
{
set_tris_a(0b00000111);
set_tris_d(0b00000000);
output_d(0x00);
delay_ms(10);
lcd_init();
while(TRUE)
{
LCD_gotoxy(3,1);
printf(lcd_putc,"ds30 Loadre");
LCD_gotoxy(1,2);
printf(lcd_putc,"Download Example");
}
}
Bootloader:
Code: ;------------------------------------------------------------------------------
; Includes
;------------------------------------------------------------------------------
#include "settings.inc"
;------------------------------------------------------------------------------
; UARTs
;------------------------------------------------------------------------------
#ifndef USE_UART1
#ifndef USE_UART2
#ifndef USE_CAN
error "No communication is specified"
#endif
#endif
#endif
#ifdef USE_CAN
#ifndef HAS_CAN
error "CanBus specified for a device that only has uart"
#endif
#ifdef USE_UART1
error "UART1 and Canbus specified"
#endif
#ifdef USE_UART2
error "UART2 and Canbus specified"
#endif
#ifdef USE_TXENABLE
error "TX enable is not available for CAN"
#endif
#endif
#ifdef USE_UART1
#ifdef USE_UART2
error "Both uarts are specified"
#endif
#ifdef TXSTA
#define TXSTA_ TXSTA ;uart status
#define RCSTA_ RCSTA ;uart status
#define SPBRG_ SPBRG ;uart baudrate
#define TXREG_ TXREG ;uart transmit
#define RCREG_ RCREG ;uart receive
else
#define TXSTA_ TXSTA1 ;uart status
#define RCSTA_ RCSTA1 ;uart status
#define SPBRG_ SPBRG1 ;uart baudrate
#define TXREG_ TXREG1 ;uart transmit
#define RCREG_ RCREG1 ;uart receive
#endif
#endif
#ifdef USE_UART2
#ifdef USE_UART1
error "Both uarts are specified"
#endif
#ifndef HAS_UART2
error "UART2 specified for a device that only has uart1"
#endif
#define TXSTA_ TXSTA2 ;uart status
#define RCSTA_ RCSTA2 ;uart status
#define SPBRG_ SPBRG2 ;uart baudrate
#define TXREG_ TXREG2 ;uart transmit
#define RCREG_ RCREG2 ;uart receive
#endif
;------------------------------------------------------------------------------
; Defines
;------------------------------------------------------------------------------
#define VERMAJ 2 ;firmware version major
#define VERMIN 0 ;firmware version minor
#define VERREV 3 ;firmware version revision
#define HELLO 0xC1
#define OK 'K' ;erase/write ok
#define CHECKSUMERR 'N' ;checksum error
#define VERFAIL 'V' ;verification failed
#define BLPROT 'P' ;bl protection tripped
#define UCMD 'U' ;unknown command
#define BL10MS ( 10 * (OSCF / 4000) / (255 * 7) ) ;10ms delay
#define BLSTART ( BLINIT / 10 ) ;count for boot receive delay
#define BLDELAY ( BLTIME / 10 ) ;count for receive delay
#define UBRG ( (((OSCF / BAUDRATE) / 8) - 1) / 2 ) ;baudrate
#define PAGESIZEW 32 ;pagesize [words]
#define PAGESIZER (PAGESIZEW/ROWSIZEW) ;pagesize [rows]
#define ROWSIZEB (ROWSIZEW*2) ;rowsize [bytes]
#define STARTADDR ( MAX_FLASH - BLPLP * PAGESIZER * ROWSIZEW * 2 ) ;bootloader placement
; Debug output
;messg STARTADDR_IS #(STARTADDR)
;messg UBRG_IS #v(UBRG)
;messg bldelayis #v(BLDELAY)
;messg blstartis #v(BLSTART)
;------------------------------------------------------------------------------
; Range check
;------------------------------------------------------------------------------
if UBRG > 255
error spbrg_value_ is out of range
#endif
if UBRG == 0
error spbrg_value_ might be out of range
#endif
if BLSTART > 255
error BLSTART_ is out of range
#endif
if BLSTART == 0
error spbrg_value_ might be out of range
#endif
if BLDELAY > 255
error BLDELAY_ is out of range
#endif
if BLDELAY == 0
error BLDELAY_ might be out of range
#endif
;------------------------------------------------------------------------------
; Variables
;------------------------------------------------------------------------------
cblock 0
crc ;receive checksum
dcnt ;datacount
cnt1 ;receive timeout timer
cnt2 ;receive timeout timer
cnt3 ;receive timeout timer
cntHello ;
rowcnt ;row iterator
rowcnt2 ;
cmd ;command
doerase ;do erase before next write
ttblptru
ttblptrh
ttblptrl
;endc
;cblock 10
buffer:65 ;receive buffer
endc
;------------------------------------------------------------------------------
; Send macro
;------------------------------------------------------------------------------
SendL macro sbyte
movlw sbyte
rcall Send
endm
;------------------------------------------------------------------------------
; Reset vector
;------------------------------------------------------------------------------
org 0x0000
goto blstart
;------------------------------------------------------------------------------
; GOTO user application
;------------------------------------------------------------------------------
org STARTADDR - 4 ;space to deposit goto to user application
loadusr nop
nop
;------------------------------------------------------------------------------
; Start of bootloader code
;------------------------------------------------------------------------------
org STARTADDR
blstart
;----------------------------------------------------------------------
; User init
;----------------------------------------------------------------------
; Enable digital i/o
#ifdef ADCON1
; error Do you need to configura uart pins to be digital? If not, remove this line
#endif
;movlw b'01100000' ;xxx disable
;movwf ADCON1 ;xxx analog on tx/rx
; Set internal oscillator to 8MHz
;movlw b'01110000'
;movwf OSCCON
; Make tx enable pin output and set to 0
#ifdef USE_TXENABLE
bcf TRISR_TXE, TRISB_TXE
bcf LATR_TXE, LATB_TXE
#endif
;----------------------------------------------------------------------
; Init
;----------------------------------------------------------------------
clrf doerase
; Uart
#ifndef USE_CAN
movlw b'00100100' ;enable transmit and
movwf TXSTA_ ; high speed mode
movlw UBRG ;use only SPBRG_ (8 bit mode default) not using BAUDCON
movwf SPBRG_
movlw b'10010000' ;enable serial port
movwf RCSTA_ ; and receive
#endif
#ifdef USE_CAN
bsf PORTB, RB2
bcf TRISB, RB2
movlb 15
movlw b'00000001'
movwf TXB0DLC,BANKED
;xxx If transmit ID & receive ID are the same then comment lines marked with * (free 2 instructions)
movlw (ID_GUI<<5)&0xE0 ;Load SID2:SID0, EXIDE = 0 / User configure transmit ID
movwf TXB0SIDL,BANKED
movlw (ID_PIC<<5)&0xE0 ;Load SID2:SID0, EXIDE = 0 / User configure receive ID *
movwf RXF0SIDL, BANKED
movlw ID_GUI>>3 ;Load SID10:SID3 / User configure transmit ID
movwf TXB0SIDH,BANKED
movlw ID_PIC>>3 ;Load SID10:SID3 / User configure receive ID *
movwf RXF0SIDH, BANKED
movlw b'11111111' ;Prevent filter 1 from causing a
movwf RXF1SIDL ; receive event
movwf RXM0SIDH ;Set mask
movlw b'11100000'
movwf RXM0SIDL
movlb 0 ;Set bit rate
movlw b'00000001' ;xxx User configure Baudrate (Default 500kBd with HSPLL and 10MHz crystal)
movwf BRGCON1
movlw b'11111010' ;xxx User configure Baudrate
movwf BRGCON2
movlw b'00000111' ;xxx User configure Baudrate
movwf BRGCON3
bsf CIOCON, ENDRHI
clrf CANCON ;Enter Normal mode
#endif
;----------------------------------------------------------------------
; Wait for computer
;----------------------------------------------------------------------
clrf cntHello
movlw BLSTART
rhello rcall RcvIni
sublw HELLO
bz sendid
; Not hello received
incf cntHello
movf cntHello
sublw HELLOTRIES
bz exit
bra rhello
;----------------------------------------------------------------------
; Send device id and firmware version
;----------------------------------------------------------------------
sendid SendL DEVICEID
SendL (VERMAJ + 128) ;128 to indicate PIC18F
SendL ((VERMIN<<4) + VERREV)
;----------------------------------------------------------------------
; Main loop
;----------------------------------------------------------------------
Main SendL OK ; "-Everything OK, ready and waiting."
mainl clrf crc
;----------------------------------------------------------------------
; Receive address
;----------------------------------------------------------------------
;Upper byte
rcall Receive
movwf TBLPTRU
; High byte
rcall Receive
movwf TBLPTRH
#ifdef BIGEE
movwf EEADRH ;for eeprom
#endif
; Low byte
rcall Receive
movwf TBLPTRL
#ifdef EEADR
movwf EEADR ;for eeprom
#endif
;----------------------------------------------------------------------
; Receive command
;----------------------------------------------------------------------
rcall Receive
movwf cmd
;----------------------------------------------------------------------
; Receive nr of data bytes that will follow
;----------------------------------------------------------------------
rcall Receive
movwf dcnt
;----------------------------------------------------------------------
; Receive data
;----------------------------------------------------------------------
lfsr FSR0, buffer ;load buffer pointer to fsr0
rcvoct rcall Receive
movwf POSTINC0
decfsz dcnt
bra rcvoct
;----------------------------------------------------------------------
; Check checksum
;----------------------------------------------------------------------
chksum tstfsz crc
bra crcfail
;----------------------------------------------------------------------
; 0x00 goto protection
;----------------------------------------------------------------------
#ifdef PROT_GOTO
; Only for write row command
;btfss cmd, 1
;bra ibufpt
; Check for row 0
tstfsz TBLPTRU
bra ibufpt
tstfsz TBLPTRH
bra ibufpt
tstfsz TBLPTRL
bra ibufpt
; Init buffer pointer
lfsr FSR0, buffer ;load buffer pointer to fsr0
; 1st word low byte = low address byte
movlw ((STARTADDR>>1)&0xff)
movwf POSTINC0
; 1st word high byte = goto instruction
movlw 0xef
movwf POSTINC0
; 2nd word low byte = upper address byte
movlw (((STARTADDR>>1)&0xff00)>>8)
movwf POSTINC0
; 2nd word high byte = uppder address nibble + goto instruction
movlw (0xf0 + (((STARTADDR>>1)&0xf0000)>>16))
movwf POSTINC0
#endif
;----------------------------------------------------------------------
; Init buffer pointer
;----------------------------------------------------------------------
ibufpt lfsr FSR0, buffer ;load buffer pointer to fsr0
;----------------------------------------------------------------------
; Check command
;----------------------------------------------------------------------
; Erase page, set do erase status flag
btfss cmd, 0
bra cmdrow
setf doerase
bra Main
; Write row
cmdrow btfsc cmd, 1
bra blprot
#ifdef EEDATA
; Write eeprom word
btfsc cmd, 2
bra eeprom
#endif
; Write config
btfsc cmd, 3
bra cfg
; Else, unknown command
SendL UCMD
bra mainl
;------------------------------------------------------------------------------
; Exit, placed here so it can be branched to from all code, max +-127
;------------------------------------------------------------------------------
#ifndef USE_CAN
exit clrf RCSTA_ ;reset receive status and control register
clrf TXSTA_ ;reset transmit status and control register
#endif
#ifdef USE_CAN
exit bsf CANCON, REQOP2 ;reset receive status and control register
#endif
bra loadusr
;----------------------------------------------------------------------
; Bootloader protection
;----------------------------------------------------------------------
blprot nop
#ifdef PROT_BL
; Make a copy of address
movff TBLPTRU, ttblptru
movff TBLPTRH, ttblptrh
movff TBLPTRL, ttblptrl
; Calculate page number of received address
movlw 6 ;2^6=64=pagesize[bytes]
movwf cnt1
bcf STATUS, C ;clear carry bit
calcpage rrcf ttblptru, 1
rrcf ttblptrh, 1
rrcf ttblptrl, 1
decfsz cnt1
bra calcpage
; Received page high < bl start page = OK
movlw ((STARTADDR/64)>>8)
subwf ttblptrh, 0
bn blprotok
; Received page = bl start page
movlw ((STARTADDR/64)>>8)
subwf ttblptrh, 0
bnz chkgt
; Received page low < bl start page low = OK
movlw ((STARTADDR/64)&0xff)
subwf ttblptrl, 0
bn blprotok
; Received page high > bl end page = OK
chkgt movlw (((STARTADDR/64)+BLSIZEP-1)>>8)
subwf ttblptrh, 0
bz chkgt2
bn chkgt2
bra blprotok
; Received page = bl end page
chkgt2 movlw (((STARTADDR/64)+BLSIZEP-1)>>8)
subwf ttblptrh, 0
bnz proterr
; Received page low > bl end page low = OK
movlw (((STARTADDR/64)+BLSIZEP-1)&0xff)
subwf ttblptrl, 0
bz proterr
bn proterr
bra blprotok
; Protection tripped
proterr SendL BLPROT
bra mainl
#endif
;----------------------------------------------------------------------
; Erase page
;----------------------------------------------------------------------
blprotok
erase btfss doerase, 0
bra wrloop
movlw b'10010100' ;setup erase
rcall Write
clrf doerase
;----------------------------------------------------------------------
; Write row
;----------------------------------------------------------------------
wrloop movlw ROWSIZEB
movwf rowcnt
movwf rowcnt2
; Load latches
wrbyte movff POSTINC0, TABLAT
tblwt *+
decfsz rowcnt
bra wrbyte
; Write
tblrd *- ;point back into row
movlw b'10000100'
rcall Write
;----------------------------------------------------------------------
; Write finished, verify row
;----------------------------------------------------------------------
lfsr FSR0, (buffer+ROWSIZEB-1) ;load buffer pointer to fsr0
; Read
verbyte tblrd *-
movf POSTDEC0, w
; Compare
cpfseq TABLAT
bra verfail
; Loop?
decfsz rowcnt2
bra verbyte
; Verify succesfull
bra Main
;----------------------------------------------------------------------
; Write eeprom byte
;----------------------------------------------------------------------
#ifdef EEADR
; Load latch
eeprom movff INDF0, EEDATA
; Write
movlw b'00000100'
rcall Write
; Verify, read byte
movlw b'00000001'
bsf EECON1, RD
movf INDF0, w
; Compare
cpfseq EEDATA
bra verfail
; Verify succesfull
bra Main
#endif
;----------------------------------------------------------------------
; Write config byte
;----------------------------------------------------------------------
; Load latch
cfg movff INDF0, TABLAT
tblwt *
; Write
movlw b'11000100'
rcall Write
; Write finished
bra Main
;----------------------------------------------------------------------
; Verify fail
;----------------------------------------------------------------------
verfail SendL VERFAIL
bra mainl
;----------------------------------------------------------------------
; Checksum error
;----------------------------------------------------------------------
crcfail SendL CHECKSUMERR
bra mainl
;------------------------------------------------------------------------------
; Write()
;------------------------------------------------------------------------------
Write movwf EECON1
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR
; Wait for write to finish, only needed for eeprom
waitwre btfsc EECON1, WR
bra waitwre
bcf EECON1,WREN ;disable writes
return
;------------------------------------------------------------------------------
; Send()
;------------------------------------------------------------------------------
#ifndef USE_CAN
Send ; Enable tx
#ifdef USE_TXENABLE
bsf LATR_TXE, LATB_TXE
nop ;needed?
nop
nop
#endif
;Send byte
movwf TXREG_
; Wait for transmit shift register to get empty
txwait btfss TXSTA_, TRMT
bra txwait
; Disable tx
#ifdef USE_TXENABLE
bcf LATR_TXE, LATB_TXE
#endif
; Send complete
return
#endif
#ifdef USE_CAN
Send
movlb 15 ;One BANKSEL
movwf TXB0D0,BANKED
bsf TXB0CON, TXREQ ;Normal priority; Request transmission
;If required, wait for message to get transmitted
txwait BTFSC TXB0CON, TXREQ,BANKED ;Is it transmitted?
BRA txwait ;No. Continue to wait...
movlb 0
; Send complete
return
#endif
;------------------------------------------------------------------------------
; Receive()
;------------------------------------------------------------------------------
#ifndef USE_CAN
Receive movlw BLDELAY
RcvIni movwf cnt1 ;
rpt2 movlw BL10MS ;
movwf cnt2 ;
rpt3 clrf cnt3
rptc clrwdt
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
; Receive timed out if we get here
bra exit
#endif
#ifdef USE_CAN
Receive movlw BLDELAY
RcvIni movwf cnt1 ;
rpt2 movlw BL10MS ;
movwf cnt2 ;
rpt3 clrf cnt3
rptc clrwdt
btfss RXB0CON, RXFUL ;Does RXB0 contain a message?
bra notrcv
movf RXB0D0, w ;Return read data in W
addwf crc, f ;Compute crc
bcf RXB0CON, RXFUL
return
notrcv decfsz cnt3
bra rptc
decfsz cnt2
bra rpt3
decfsz cnt1
bra rpt2
; Receive timed out if we get here
bra exit
#endif
;------------------------------------------------------------------------------
; End of code
;
; After reset
; Do not expect the memory to be zero,
; Do not expect registers to be initialised as described in datasheet.
;------------------------------------------------------------------------------
end
Settings:
Code: ------------------------------------------------------------------------------
; Device
;------------------------------------------------------------------------------
LIST P=18F452; ;xxx
;------------------------------------------------------------------------------
; Includes
;------------------------------------------------------------------------------
#include "devices.inc"
;------------------------------------------------------------------------------
; User preferences
;------------------------------------------------------------------------------
radix DEC
#define OSCF 10000000 ;xxx oscillator frequency
#define BAUDRATE 38400 ;xxx baudrate
#define BLTIME 1000 ;xxx data receive timeout [ms]
#define BLINIT 1000 ;xxx hello receive timeout [ms]
#define HELLOTRIES 2 ;xxx number of non hello characters received before branching to the user application
#define USE_UART1 1 ;xxx uncomment to use uart1
;#define USE_UART2 1 ;xxx uncomment to use uart2
;#define USE_CAN ;xxx uncomment to use CAN instead of UART
#define USE_TXENABLE 1 ;xxx uncomment to use a tx enable pin
#ifdef USE_TXENABLE
#define TRISR_TXE TRISC ;xxx tris register containing tx enable
#define LATR_TXE LATC ;xxx port register containing tx enable
#define TRISB_TXE 5 ;xxx tris bit for tx enable
#define LATB_TXE 5 ;xxx port bit for tx enable
#endif
;------------------------------------------------------------------------------
; CAN settings
;------------------------------------------------------------------------------
#define ID_PIC 1 ;xxx node number for this device
#define ID_GUI 0x7ff ;xxx node number of the ds30 Loader gui
;------------------------------------------------------------------------------
; Advanced settings
;------------------------------------------------------------------------------
#define PROT_GOTO 1 ;xxx protect goto at 0x00
#define PROT_BL 1 ;xxx protect bootloader
#define BLPLP 7 ;bootloader placement, pages from end
#define BLSIZEP 7 ;bootloader size [pages], used by bootloader protection
;------------------------------------------------------------------------------
; Configuration bits, these macros can be found at the end of the inc-files located in
; C:\Program Files\Microchip\MPASM Suite\
;
; These can also be set in MPLAB IDE instead, they are found in Configure->Configuration bits...
;------------------------------------------------------------------------------
;config OSC = INTIO2 ;internal oscillator
;config FSCM = OFF ;failsafe clock monitor
;config IESO = OFF ;internal external switchover mode
;config PWRT = OFF ;power-up timer
;config BOR = OFF ;brown-out reset
;config BORV = 27 ;brown-out reset value
;config WDT = OFF ;watchdog timer
;config WDTPS = 1 ;1:1 WDT prescalar
;config MCLRE = ON ;MCLR
;config STVR = ON ;stack overflow reset
;config LVP = OFF ;low voltage programming
;config DEBUG = OFF ;debug
;config CP0 = OFF ;
;config CP1 = OFF ;
;config CPB = OFF ;
;config CPD = OFF ;
;config WRT0 = OFF ;
;config WRT1 = OFF ;
;config WRTB = OFF ;
;config WRTC = OFF ;
;config WRTD = OFF ;
;config EBTR0 = OFF ;
;config EBTR1 = OFF ;
;config EBTRB = OFF ;
;__CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC3_PLL4_1L & _USBDIV_2_1L
;__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEM_OFF_1H & _IESO_OFF_1H
;__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L ; _VREGEN_OFF_2L
;__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
;__CONFIG _CONFIG3H, _MCLRE_ON_3H & _PBADEN_OFF_3H & _CCP2MX_OFF_3H
;__CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVREN_OFF_4L & _XINST_OFF_4L
;__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L
;__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
;__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
;__CONFIG _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H
;__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
;__CONFIG _CONFIG7H, _EBTRB_OFF_7H
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
Device:
Code: ifdef __18F1220
#include p18F1220.inc
#define VALID_DEV 1
#define MAX_FLASH 0x1000
#define DEVICEID 1
#define ROWSIZEW 4
endif
ifdef __18F1230
#include p18F1230.inc
#define VALID_DEV 1
#define MAX_FLASH 0x1000
#define DEVICEID 2
#define ROWSIZEW 4
endif
ifdef __18F2220
#include p18F2220.inc
#define VALID_DEV 1
#define MAX_FLASH 0x1000
#define DEVICEID 3
#define ROWSIZEW 4
endif
ifdef __18F2221
#include p18F2221.inc
#define VALID_DEV 1
#define MAX_FLASH 0x1000
#define DEVICEID 4
#define ROWSIZEW 4
endif
ifdef __18F4220
#include p18F4220.inc
#define VALID_DEV 1
#define MAX_FLASH 0x1000
#define DEVICEID 5
#define ROWSIZEW 4
endif
ifdef __18F4221
#include p18F4221.inc
#define VALID_DEV 1
#define MAX_FLASH 0x1000
#define DEVICEID 6
#define ROWSIZEW 4
endif
ifdef __18F1320
#include p18F1320.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 7
#define ROWSIZEW 4
endif
ifdef __18F1330
#include p18F1330.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 8
#define ROWSIZEW 4
endif
ifdef __18F13K22
#include p18F13K22.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 9
#define ROWSIZEW 4
endif
ifdef __18F13K50
#include p18F13K50.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 10
#define ROWSIZEW 4
endif
ifdef __18F2320
#include p18F2320.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 11
#define ROWSIZEW 4
endif
ifdef __18F2321
#include p18F2321.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 12
#define ROWSIZEW 4
endif
ifdef __18F2331
#include p18F2331.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 13
#define ROWSIZEW 4
endif
ifdef __18F23K20
#include p18F23K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 14
#define ROWSIZEW 8
endif
ifdef __18F4320
#include p18F4320.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 15
#define ROWSIZEW 4
endif
ifdef __18F4321
#include p18F4321.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 16
#define ROWSIZEW 4
endif
ifdef __18F4331
#include p18F4331.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 17
#define ROWSIZEW 4
endif
ifdef __18F43K20
#include p18F43K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x2000
#define DEVICEID 18
#define ROWSIZEW 8
endif
ifdef __18F14K22
#include p18F14K22.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 19
#define ROWSIZEW 8
endif
ifdef __18F14K50
#include p18F14K50.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 20
#define ROWSIZEW 8
endif
ifdef __18F2420
#include p18F2420.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 21
#define ROWSIZEW 16
endif
ifdef __18F2423
#include p18F2423.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 22
#define ROWSIZEW 16
endif
ifdef __18F2431
#include p18F2431.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 23
#define ROWSIZEW 4
endif
ifdef __18F2450
#include p18F2450.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 24
#define ROWSIZEW 8
endif
ifdef __18F2480
#include p18F2480.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 25
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F24K20
#include p18F24K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 26
#define ROWSIZEW 16
endif
ifdef __18F4420
#include p18F4420.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 27
#define ROWSIZEW 16
endif
ifdef __18F4423
#include p18F4423.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 28
#define ROWSIZEW 16
endif
ifdef __18F4431
#include p18F4431.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 29
#define ROWSIZEW 4
endif
ifdef __18F4450
#include p18F4450.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 30
#define ROWSIZEW 8
endif
ifdef __18F4480
#include p18F4480.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 31
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F44K20
#include p18F44K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 32
#define ROWSIZEW 16
endif
ifdef __18F2455
#include p18F2455.inc
#define VALID_DEV 1
#define MAX_FLASH 0x6000
#define DEVICEID 33
#define ROWSIZEW 16
endif
ifdef __18F2458
#include p18F2458.inc
#define VALID_DEV 1
#define MAX_FLASH 0x6000
#define DEVICEID 34
#define HAS_CAN 1
#define ROWSIZEW 16
endif
ifdef __18F4455
#include p18F4455.inc
#define VALID_DEV 1
#define MAX_FLASH 0x6000
#define DEVICEID 35
#define ROWSIZEW 16
endif
ifdef __18F4458
#include p18F4458.inc
#define VALID_DEV 1
#define MAX_FLASH 0x6000
#define DEVICEID 36
#define ROWSIZEW 16
endif
ifdef __18F2520
#include p18F2520.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 37
#define ROWSIZEW 16
endif
ifdef __18F2523
#include p18F2523.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 38
#define ROWSIZEW 16
endif
ifdef __18F2550
#include p18F2550.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 39
#define ROWSIZEW 16
endif
ifdef __18F2553
#include p18F2553.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 40
#define ROWSIZEW 16
endif
ifdef __18F2580
#include p18F2580.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 41
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F25K20
#include p18F25K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 42
#define ROWSIZEW 16
endif
ifdef __18F4520
#include p18F4520.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 43
#define ROWSIZEW 16
endif
ifdef __18F4523
#include p18F4523.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 44
#define ROWSIZEW 16
endif
ifdef __18F4550
#include p18F4550.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 45
#define ROWSIZEW 16
endif
ifdef __18F4553
#include p18F4553.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 46
#define ROWSIZEW 16
endif
ifdef __18F4580
#include p18F4580.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 47
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F45K20
#include p18F45K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 48
#define ROWSIZEW 16
endif
ifdef __18F6520
#include p18F6520.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 49
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 4
endif
ifdef __18F8520
#include p18F8520.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 50
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 4
endif
ifdef __18F2525
#include p18F2525.inc
#define VALID_DEV 1
#define MAX_FLASH 0xC000
#define DEVICEID 51
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F2585
#include p18F2585.inc
#define VALID_DEV 1
#define MAX_FLASH 0xC000
#define DEVICEID 52
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F4525
#include p18F4525.inc
#define VALID_DEV 1
#define MAX_FLASH 0xC000
#define DEVICEID 53
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F4585
#include p18F4585.inc
#define VALID_DEV 1
#define MAX_FLASH 0xC000
#define DEVICEID 54
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F6527
#include p18F6527.inc
#define VALID_DEV 1
#define MAX_FLASH 0xC000
#define DEVICEID 55
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F8527
#include p18F8527.inc
#define VALID_DEV 1
#define MAX_FLASH 0xC000
#define DEVICEID 56
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F2620
#include p18F2620.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 57
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F2680
#include p18F2680.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 58
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F26K20
#include p18F26K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 59
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F4620
#include p18F4620.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 60
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F4680
#include p18F4680.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 61
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F46K20
#include p18F46K20.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 62
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F6622
#include p18F6622.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 63
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F8622
#include p18F8622.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 64
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F2682
#include p18F2682.inc
#define VALID_DEV 1
#define MAX_FLASH 0x14000
#define DEVICEID 65
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F4682
#include p18F4682.inc
#define VALID_DEV 1
#define MAX_FLASH 0x14000
#define DEVICEID 66
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F2685
#include p18F2685.inc
#define VALID_DEV 1
#define MAX_FLASH 0x18000
#define DEVICEID 67
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F4685
#include p18F4685.inc
#define VALID_DEV 1
#define MAX_FLASH 0x18000
#define DEVICEID 68
#define HAS_CAN 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F6627
#include p18F6627.inc
#define VALID_DEV 1
#define MAX_FLASH 0x18000
#define DEVICEID 69
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F6628
#include p18F6628.inc
#define VALID_DEV 1
#define MAX_FLASH 0x18000
#define DEVICEID 70
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F8627
#include p18F8627.inc
#define VALID_DEV 1
#define MAX_FLASH 0x18000
#define DEVICEID 71
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F8628
#include p18F8628.inc
#define VALID_DEV 1
#define MAX_FLASH 0x18000
#define DEVICEID 72
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F6722
#include p18F6722.inc
#define VALID_DEV 1
#define MAX_FLASH 0x20000
#define DEVICEID 73
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F6723
#include p18F6723.inc
#define VALID_DEV 1
#define MAX_FLASH 0x20000
#define DEVICEID 74
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F8722
#include p18F8722.inc
#define VALID_DEV 1
#define MAX_FLASH 0x20000
#define DEVICEID 75
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F8723
#include p18F8723.inc
#define VALID_DEV 1
#define MAX_FLASH 0x20000
#define DEVICEID 76
#define HAS_UART2 1
#define BIGEE 1
#define ROWSIZEW 32
endif
ifdef __18F452
#include p18F452.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 77
#define ROWSIZEW 4
endif
ifdef __18F458
#include p18F458.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 78
#define ROWSIZEW 4
endif
ifdef __18F448
#include p18F448.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 79
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F258
#include p18F258.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 80
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F248
#include p18F248.inc
#define VALID_DEV 1
#define MAX_FLASH 0x4000
#define DEVICEID 81
#define HAS_CAN 1
#define ROWSIZEW 4
endif
ifdef __18F8680
#include p18F8680.inc
#define VALID_DEV 1
#define MAX_FLASH 0x10000
#define DEVICEID 82
#define BIGEE 1
#define ROWSIZEW 4
endif
ifdef __18F25K22
#include p18F25K22.inc
#define VALID_DEV 1
#define MAX_FLASH 0x8000
#define DEVICEID 83
#define HAS_UART2 1
#define ROWSIZEW 32
endif
;------------------------------------------------------------------------------
;
;------------------------------------------------------------------------------
ifndef VALID_DEV
error "Unknown device specified"
#endif
Bootlader works firstly, but When I download my code bootlader is cancelled
Can you give me an example of the application is working continuously Bootloder?Please
RE: Bootloader for 18f452 - Mikael Gustavsson - 2011-04-06
What do you mean by it gets canceled?
I suggest you adjust polling time in the gui to around 200ms.
RE: Bootloader for 18f452 - thenorthstar - 2011-04-07
(2011-04-06, 21:20:32)Mikael Gustafsson Wrote: What do you mean by it gets canceled?
My friend,
when I Check "don't write goto at 0x00" under the advanced tab and download my hex code, Bootloader is working but my program not working.
when I Uncheck "don't write goto at 0x00" under the advanced tab and download my hex code, Bootloader not working but my program is working.
RE: Bootloader for 18f452 - Mikael Gustavsson - 2011-04-07
Implement this fix first:
[broken link]
From your postings, everything looks fine, i suspect you are not fast enough pressing the download button
* Leave all settings in the advanced tab to their default values
* Change polling time to 200ms
* Set timeout in firmware settings.inc to 2000
* Reset PIC
* Press download within 2s
If it still doesn't work, send me an email and you can test the latest versions that is not release yet.
|