; ================================================== ; == Botload, el bootloader de EuskalBot == ; ================================================== ; Basado en tinybld RADIX DEC LIST P=18F2520 include "p18f2520.inc" ; ================================================== ; CONFIGURACIÓN ; ================================================== ; configuración de placa y rs232 xtal EQU 10000000 baud EQU 115200 ; calcular SPBRG, redondeando correctamente ; settings: BRG16=1, BRGH=1 ; cuando la PLL esta actica, BRGH=0 nos da un divisor de 4 adicional spbrgval EQU ((xtal+(baud*2))/(baud*4))-1 ; configuración del PIC __CONFIG _CONFIG1H, _OSC_HSPLL_1H & _FCMEN_OFF_1H & _IESO_OFF_1H __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOREN_SBORDIS_2L & _BORV_2_2L __CONFIG _CONFIG2H, _WDT_OFF_2H __CONFIG _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_PORTC_3H __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_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 ; dirección de configuración que contiene el modo de oscilador (PLL o no) CONFIG1H EQU 0x300001 ; dirección con el ID del PIC DEVID1 EQU 0x3ffffe ; dirección con flags sobre el codigo de usuario SW_FLAGS_ADDR EQU 0x007FFE ; ================================================== ; VARIABLES ; ================================================== BLVARS UDATA_ACS FLAGS RES 1 SW_FLAGS RES 1 RCV_CD_1 RES 1 RCV_CD_2 RES 1 RCV_CD_3 RES 1 CRC RES 1 CMD RES 1 CTR RES 1 CTRO RES 1 PROGBUF UDATA 0x100 BUFFER RES 64 #define USING_PLL FLAGS,0 #define RECONFIG FLAGS,1 ; ================================================== ; VECTORES ; ================================================== ; vector de reset de usuario (saltar al bootloader) CPU_RST_VECTOR CODE 0x0 goto STARTBL ; vector de reset del bootloader (saltar al codigo) BL_VECTORS CODE 0x7E00 STARTBL bra START BL_INTH_VECTOR CODE 0x7E02 INTBL bra USERINT_HANDLER ; codigo principal del bootloader LOADER CODE ; ================================================== ; MACROS ; ================================================== SENDCHAR MACRO CHR movlw CHR rcall UART_SEND ENDM ; no contar con que W tenga el valor correcto, porque a veces no se usa MOVLWF MACRO FILE,LITERAL if LITERAL==0xFF setf FILE else if LITERAL==0x00 clrf FILE else movlw LITERAL movwf FILE endif endif ENDM ; ================================================== ; CÓDIGO ; ================================================== START ; resetear flags clrf FLAGS RECONFIGURE bcf USING_PLL ; leer byte de config CONFIG1H MOVLWF TBLPTRU, upper CONFIG1H MOVLWF TBLPTRH, high CONFIG1H MOVLWF TBLPTRL, low CONFIG1H tblrd* ; comprobar modo PLL movf TABLAT,W andlw b'00001111' xorlw _OSC_HSPLL_1H & b'00001111' ; si la PLL esta activa, apuntarlo skpnz bsf USING_PLL ; leer byte de flags del software MOVLWF TBLPTRU, upper SW_FLAGS_ADDR MOVLWF TBLPTRH, high SW_FLAGS_ADDR MOVLWF TBLPTRL, low SW_FLAGS_ADDR tblrd* movff TABLAT, SW_FLAGS ; configurar TX UART, modo rapido (divisor BRG /4) MOVLWF TXSTA, (0<