ORG .250
COMIENZO_DESPUES_DE_BOOT
ORG 0X1C00
BOOTLOADER
CALL CONFIG_CCP2_PWM
CALL CONFIG_RS232
CALL CONFIG_TMR1
CALL CONFIG_TMR2
CALL CONFIG_TRISES
CALL CONFIG_ADCON1
CALL CONFIG_OPTION_REG
CALL CONFIG_INTERRUPTS
BANKSEL ADDRH
CLRF ADDRH
CLRF ADDRL
CALL CONFIG_RS232
BANKSEL N_POTE
MOVLW .4
MOVWF N_POTE ;A BASE DE ESPERAR ENTRE BLOQUE Y BLOQUE SE PUEDE OBVIAR QUE HA TERMINADO DE RECIBIR EL PROGRAMA 8SEG
BOOTLOADER_CONFIG_1
;-------------------------------------------------------------
demora_2seg
movlw .43 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0b
movlw .226 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1b
movlw .205 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2b
clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
BANKSEL PIR1
BTFSC PIR1,RCIF
GOTO LLEGADA ;test de mensaje SYSEX
VUELTA ;para que vuelva de llegada
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2b ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1b ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0b ; 2 no, loop
clrwdt ; 1 ciclo delay
;------------------------------------------
BANKSEL N_POTE
DECFSZ N_POTE,F
GOTO BOOTLOADER_CONFIG_1
;------------------------------------------
FIN_BOOTLOADER
BANKSEL PUNTEROS
BTFSC PUNTEROS,4 ;SI NO SE RECIBIO NADA DE SYSEX O SE RECIBIO EL BYTE EOX ESTE PIN
;->ESTARÁ A CERO POR LO QUE SALDRÁ DEL BOOTLOADER PARA IR AL PROGRAMA PRINCIPAL
GOTO BOOTLOADER_CONFIG_1
BANKSEL PCLATH
PAGESEL COMIENZO_DESPUES_DE_BOOT
GOTO COMIENZO_DESPUES_DE_BOOT
;------------------------------------------
; This write routine FLASH-MEMORY
;
GUARDA_FLASH
BANKSEL N_BUTON_CON
DECF N_BUTON_CON,F ;DECREMENTA EL CONTADOR SIEMPRE SON PARTE ALTA Y PARTE BAJA DOS ENVIOS
;->POR DIRECCION, ESTE NUNCA LLEGA A CERO
BANKSEL ADDRH
MOVF ADDRH,W ; Load initial address
MOVWF EEADRH ;
MOVF ADDRL,W ;
MOVWF EEADR ;
BANKSEL RCREG
MOVF RCREG,W ; Load initial data address
BANKSEL PIR1
BCF PIR1,RCIF
BANKSEL EEDATA
MOVWF EEDATA ;LO PONE EN LA PARTE BAJA DE LA MEMORIA
BANKSEL PIR1
LOOP
BTFSC PIR1,RCIF ;ESPERA HASTA EL SIGUIENTE DATO
GOTO LOOP
BCF PIR1,RCIF
BANKSEL RCREG
MOVF RCREG,W
MOVWF EEDATH ; ;Y LO PONE EN LA PARTE ALTA DE LA MEMORIA
BSF STATUS,RP0 ; Bank 3
BSF EECON1,EEPGD ; Point to program memory
BSF EECON1,WREN ; Enable writes
MOVLW 0X55 ; Start of required write sequence:
MOVWF EECON2 ; Write 55h
MOVLW 0XAA ;
MOVWF EECON2 ; Write AAh
BSF EECON1,WR ; Set WR bit to begin write
NOP ; Any instructions here are ignored as processor
; halts to begin write sequence
NOP ; processor will stop here and wait for write complete
LOOP1 ; after write processor continues with 3rd instruction
BANKSEL PIR2
BTFSS PIR2,EEIF ;ESTA SECUENCIA NO ME QUEDA CLARA ES EL MISMO FLAG EL DE LA EEPROM QUE LA FLASH
GOTO LOOP1 ;ESPERA HASTA QUE TERMINE DE ESCRIBIR LA FLASH CUANDO EL FLAG SE PONGA A UNO
BCF PIR2,EEIF
BANKSEL EECON1
BCF EECON1,WREN ; Disable writes
BCF STATUS,RP0 ; Bank 2
ANDLW 0x03 ; Indicates when four words have been programmed
XORLW 0x03 ;
CLRW
GOTO VUELVE_DE_GUARDAR
;------------------------------------------------------
RECONOCIMIENTO
CALL SYSEX_DATO
BANKSEL REG_DIVISOR
MOVWF REG_DIVISOR
MOVLW IDENTIFICATIVO
SUBWF REG_DIVISOR,W
BTFSS STATUS,Z
RETURN
MODELO
CALL SYSEX_DATO
BANKSEL REG_DIVISOR
MOVWF REG_DIVISOR
MOVLW NMODELO
SUBWF REG_DIVISOR,W
BTFSS STATUS,Z
RETURN
BSF PUNTEROS,4
RETURN
;------------------------------------------------------
;------------------------------------------------------
;------------------------------------------------------
LLEGADA
BCF PIR1,RCIF
BANKSEL RCREG
MOVF RCREG,W
MOVWF REG_DIVISOR
MOVLW SYSEX
SUBWF REG_DIVISOR,W
BTFSC STATUS,Z
BSF PUNTEROS,4 ;CALL RECONOCIMIENTO ;SI ES UN MENSAJE SYSEX PONE A UNO
MOVLW EOX
SUBWF REG_DIVISOR,W
BTFSC STATUS,Z
BCF PUNTEROS,4 ;ERA SYSEX_OFF Y VUELVE AL PROGRAMA
REPROGRAMA
BTFSS PUNTEROS,4 ;SOLO CUANDO RECIBE UN COMANDO SYSEX SALTA PARA ESPERAR EL PROGRAMA
GOTO VUELTA ;SI NO VUELVE A LA RUTINA A ESPERAR UN COMANDO SYSEX
BUSQUEDA
CALL SYSEX_DATO
MOVLW COMIENZO ;ESPERA HASTA QUE LLEGUE 0X3A EN ASCII SERIAN LOS :
SUBWF REG_DIVISOR,W
BTFSS STATUS,Z
GOTO BUSQUEDA ;UNA VEZ LLEGA ESTE PUEDE CONTINUAR EL PROGRAMA
;----------------------------
CALL SYSEX_DATO ;RECIBE EL Nº DE BYTES A RECIBIR
BANKSEL N_BUTON_CON
MOVWF N_BUTON_CON ;SE GUARDA PARA DECREMENTAR Y QUE EL PROGRAMA VUELVA A ESPERAR
INCF N_BUTON_CON,F ;ESTO ES PARA IGUALAR QUE AL LLEGAR DE UNO A CERO SALTA Y NO PONGA .255
;----------------------------CABECERA, INDICA EL NUMERO DE BYTES A SER ENVIADOS
CALL SYSEX_DATO ;POSICION ALTA DE LA MEMORIA DONDE SE VA A EMPEZAR A ESCRIBIR
BANKSEL ADDRH
MOVWF ADDRH
;----------------------------PARTE ALTA DE LA DIRECCION A ESCRIBIR
CALL SYSEX_DATO ;POSICION BAJA DE LA MEMORIA DONDE SE VA A EMPEZAR A ESCRIBIR
BANKSEL ADDRL
MOVWF ADDRL
;----------------------------PARTE BAJA DE LA DIRECCION A ESCRIBIR
CALL SYSEX_DATO ;SI ES UN 01 SE ACABO EL PROGRAMA
BANKSEL FINAL_REG ;PERO ESTE PUEDE SER 02 03 04 05 DE MOMENTO VAMOS A PENSAR QUE SOLO PUEDE LLEGAR 00 ó 01
MOVWF FINAL_REG
MOVLW 0X01
SUBWF FINAL_REG,W
BTFSC STATUS,Z ;SI ES DIFERENTE DE 01 SALTA
GOTO TERMINO ;SI ES 01 ACABO EL HEX Y VA AL FINAL
REPROGRAMA1 ;SI NO FUE 01 ES POR QUE VAN A LLEGAR DATOS
BANKSEL N_BUTON_CON
DECFSZ N_BUTON_CON,F ;SALTA CUANDO SE AGOTAN LOS REGISTROS DE ENVIO
GOTO REPROGRAMA2 ;CUANDO LLEGA A CERO EL REGISTRO SALE DE LA RUTINA
BUSQUEDA_CHECKSUM
CALL SYSEX_DATO ;PARA ESPERAR EL CHECSUM QUE INDICA EL FINAL DE LA TRAMA
BANKSEL REG_DIVISOR
MOVWF REG_DIVISOR
MOVLW CHECKSUM
SUBWF REG_DIVISOR,W
BTFSC STATUS,Z
GOTO BUSQUEDA ;QUE ESPERARA HASTA EL SIGUIENTE BLOQUE DE DATOS
CALL ERROR_SYSEX
GOTO BUSQUEDA_CHECKSUM ;SI NO LLEGA EL CHECSUM VUELVE PARA ESPERARLO DEBERIA DE PONER ERROR EN TODA ESTA TRAMAS
;SI NO LLEGA EL BYTE ESPERADO QUE ENVIE ALGO PARA RECONOCERLO
ERROR_SYSEX ;SI EL BYTE ESPERADO NO COINCIDE CON EL QUE QUEREMOS ENVIARA ESTO
MOVLW ERROR_BYTE
CALL ENVIAR_USART
RETURN
TERMINO
CALL SYSEX_DATO ;DESPUES DE HABER LLEGADO 01 DEBERIA DE LLEGAR 0XFF
BANKSEL FINAL_REG
MOVWF FINAL_REG
MOVLW 0XFF ;FINAL DEL HEX BYTE 0XFF
SUBWF FINAL_REG,W
BTFSC STATUS,Z
GOTO TERMINO
TERMINO_1
CALL SYSEX_DATO ;FINAL DEL MIDI BYTE EOX
BANKSEL REG_DIVISOR
MOVWF REG_DIVISOR
MOVLW EOX
SUBWF REG_DIVISOR,W
BTFSS STATUS,Z
GOTO TERMINO_1
BANKSEL PUNTEROS
BCF PUNTEROS,4 ;LO PONE A NIVEL BAJO PARA INICAR QUE HA TERMINADO EL PROGRAMA
GOTO FIN_BOOTLOADER
;-------------------------------
REPROGRAMA2
CALL SYSEX_PROGRAM
GOTO REPROGRAMA1
;-------------------------------
SYSEX_PROGRAM
BANKSEL PIR1 ;ESPERA HASTA RECIBIR PROXIMO DATO
BTFSS PIR1,RCIF
GOTO SYSEX_PROGRAM
GOTO GUARDA_FLASH ;LO GUARDA EN LA MEMORIA
VUELVE_DE_GUARDAR
BANKSEL ADDRL
INCFSZ ADDRL,F ;INCREMENTA LA DIRECCION HASTA QUE TERMINE EL LOOP REPROGRAMA1
RETURN
MAS_UNO
INCF ADDRH,F
CLRF ADDRL
RETURN
;--------------------------------
SYSEX_DATO
BANKSEL PIR1
BTFSS PIR1,RCIF
GOTO SYSEX_DATO
BANKSEL RCREG
MOVF RCREG,W
BANKSEL PIR1
BCF PIR1,RCIF
RETURN
;--------------------------------MACROS DE CONFIGURACION Y USART
ENVIO_DE_USART
CONFIGURACION_16F877
;--------------------------------------------------------
END