;******************************************************************************
; *
; Filename: Trasmisión de Datos *
; Date: 25/07/07 *
; File Version: *
; *
; Author: Alejandro López Rincón *
; Company: *
; *
;******************************************************************************
; *
; Files required: P18F4550.INC *
; *
;LIST P=18F4550, F=INHX32 ;directive to define processor and file format
LIST P=18F452, F=INHX32
#include <P18F452.INC> ;processor specific variable definitions
;*******************************************************************************
;Configuration bits
__CONFIG _CONFIG4L,_LVP_OFF_4L & _STVR_OFF_4L & _DEBUG_OFF_4L
;ICPORT disabled
;Stack full/underflow will not cause Reset
;Single-Supply ICSP disabled
;Instruction set extension and Indexed Addressing mode ENABLED
;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
__CONFIG _CONFIG2H,_WDT_OFF_2H
; HW Disabled - SW Controlled
;******************************************************************************
;12 MHz Reales
__CONFIG _CONFIG1H,_HSPLL_OSC_1H ; & _OSCS_ON_1H
; Oscillator Switchover mode disabled
; Fail-Safe Clock Monitor disabled
; HS oscillator, PLL enabled, HS used by USB
;__CONFIG _CONFIG1L,_CPUDIV_OSC1_PLL2_1L& _PLLDIV_3_1L
;12 MHz REALES
; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
; Divide by 3 (12 MHz oscillator input)
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
;FORMA EN QUE ESTAN CONECTADOS LOS PINES
#define CHS LATC,2
CBLOCK 0x080
WREG_TEMP ;variable used for context saving
STATUS_TEMP ;variable used for context saving
BSR_TEMP ;variable used for context saving
ENDC
CBLOCK 0x000
DATA_OUT
DATA_IN
cont1
cont2
VALOR
DELAY_0
VAL
;
INICIO ;VARIABLE PARA INICIALIZACION DEBE DE SER 01
CORRECTO ;VARIBALE PARA DECIR QUE FUE CORRECTO EL ENVIO DEBE DE SER 00
CONTADOR_RESPUESTA ;VARIABLE PARA LA CANTIDAD DE INFORMACION QUE SE VA A LEER
INICIO_DATA ;0XFE DATO DE EMPEZAR A LEER O ESCRIBIR
VAL_MAYOR ;PARA EL CONTADOR DE 512 BYTE SUPERIOR
VAL_MENOR ;PARA EL CONTADOR DE 512 BYTE INFERIOR
ADC_MAYOR ;PARA EL CONTADOR DEL ADC BYTE SUPERIOR
ADC_MENOR ;PARA EL CONTADOR DEL ADC BYTE INFERIOR
DIR0_SD ;HIGHEST BYTE SD DIR
DIR1_SD
DIR2_SD
DIR3_SD
ENDC
;******************************************************************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here
ORG 0xf00000
DE "Test Data",0,1,2,3,4,5
;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.
ORG 0x0000
goto Main ;go to start of main code
;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.
ORG 0x0008
bra HighInt ;go to high priority interrupt routine
;******************************************************************************
;Low priority interrupt vector and routine
; This code will start executing when a low priority interrupt occurs.
; This code can be removed if low priority interrupts are not used.
ORG 0x0018
movff STATUS,STATUS_TEMP ;save STATUS register
movff WREG,WREG_TEMP ;save working register
movff BSR,BSR_TEMP ;save BSR register
; *** low priority interrupt code goes here ***
movff BSR_TEMP,BSR ;restore BSR register
movff WREG_TEMP,WREG ;restore working register
movff STATUS_TEMP,STATUS ;restore STATUS register
retfie
;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here to avoid conflicting with
; the low priority interrupt vector.
HighInt:
;prioridad alta recepcion de datos
btfsc PIR1,RCIF
call RC_ISR ;** high priority interrupt code goes here ***
retfie FAST
;******************************************************************************
;Start of main program
; The main program code is placed here.
Main:
CALL CONFIG_USART
bsf PORTB,0
clrf cont1
clrf cont2
delay_init
decfsz cont1,f
goto delay_init
decfsz cont2,f
goto delay_init
bcf PORTB,0
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;CARGAR VALOR DE INICIO Y CORRECTO
MOVLW 0X01
MOVWF INICIO
CLRF CORRECTO
MOVLW .18
MOVWF CONTADOR_RESPUESTA
MOVLW 0XFE
MOVWF INICIO_DATA
;ENVIAR 10 INSTRUCCIONES PARA INICIALIZAR LA TARJETA
BSF CHS
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
BCF CHS
;ENCENDER LA TARJETA
BCF CHS
;COMMAND 0 : 0X40,0X00,0X00,0X00,0X00,0X95
MOVLW 0X40
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X95
CALL TRANSMIT
;CHECO SI SE ENVIO CORRECTAMENTE
CPFSEQ INICIO
GOTO NO
GOTO OK
NO
MOVLW 0XFF
CALL TRANSMIT
CPFSEQ INICIO
GOTO NO
GOTO OK
;SE ENVIO CORRECTAMENTE ENVIO EL DATO POR EL UART 0X01
OK
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando..
MOVLW 0X65
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
;COMMAND 1 : 0X41,0X00,0X00,0X00,0X00,0XFF
NO_CMD_1
MOVLW 0X41
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
CPFSEQ CORRECTO
GOTO NO_CMD_1
GOTO OK_CMD_1
OK_CMD_1
MOVLW 0X66
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
NO_CMD_4A
MOVLW 0X4A
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0X00
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
CPFSEQ CORRECTO
GOTO NO_CMD_4A
GOTO OK_CMD_4A
OK_CMD_4A
MOVLW 0X67
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
RES_CMD_4A
MOVLW 0XFF
CALL TRANSMIT
CPFSEQ INICIO_DATA
GOTO RES_CMD_4A
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
DATA_CMD_4A
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando..
DECFSZ CONTADOR_RESPUESTA
GOTO DATA_CMD_4A
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
;****************************************************INICIALIZAR******************************************
CLRF DIR0_SD
CLRF DIR1_SD
CLRF DIR2_SD
CLRF DIR3_SD
; MOVLW 0X02
; MOVWF DIR2_SD
MAINLOOP
MOVLW 0X02
MOVWF ADC_MAYOR
CLRF ADC_MENOR
CAPTURA_DATOS
CALL ADC
MOVFF ADC_MAYOR,FSR0H
MOVFF ADC_MENOR,FSR0L
MOVFF VALOR,INDF0
INCFSZ ADC_MENOR
GOTO CAPTURA_DATOS
INCF ADC_MAYOR
MOVLW 0X04
CPFSEQ ADC_MAYOR
GOTO CAPTURA_DATOS
MOVLW 0X02
MOVWF ADC_MAYOR
CLRF ADC_MENOR
CALL ESCRIBIR_SD
INCF DIR2_SD
INCFSZ DIR2_SD
GOTO MAINLOOP
INCFSZ DIR1_SD
GOTO MAINLOOP
MOVLW 0X07
CPFSEQ DIR0_SD
GOTO MAINLOOP
CLRF DIR0_SD
GOTO MAINLOOP
;******************************************************************************
;++++++++++
CONFIG_USART
;+++++++++++INICIALIZAR EL PUERTO B COMO SALIDA DIGITAL Y EL PUERTO A (AN0 Y AN1 COMO ENTRADAS ANALOGICAS)
CLRF PORTB
CLRF LATB
CLRF TRISB
MOVLW 0X0F
MOVWF ADCON1
;++++++++++++ CONFIGURACION DEL ADC PARA USAR EL AN0 A 12 MHZ
;MOVLW B'00000000' freq./64, 16 tad,left justified
MOVLW B'10000000'
MOVWF ADCON0
;MOVLW B'00110110'
MOVLW B'01000000'
MOVWF ADCON1
BSF TRISA,0
;++++++++++++++++++++ EUSART
movlw .155 ; inicializo con 155 SPBRG (19200 bauds)
movwf SPBRG
MOVLW B'00100100'
MOVWF TXSTA
MOVLW B'10010000'
MOVWF RCSTA
;MOVLW B'00000000'
;MOVWF BAUDCON
CLRF PORTC
CLRF LATC
CLRF TRISC
;inicializacion de interrupciones y entrada y salida del puerto c
BSF TRISC,7
BCF TRISC,6
CLRF PIE1
BSF IPR1,7
BSF PIE1,RCIE
BSF INTCON,7
BSF INTCON,6
BSF RCON,7
BSF IPR1,5
;CONFIGURAR SPI
MOVLW B'00110010'
MOVWF SSPCON1
BCF SSPSTAT,7
BCF SSPSTAT,6
BCF TRISC,5
BCF TRISC,3
BSF TRISC,4
BCF TRISC,2
RETURN
;+++++
RC_ISR
bcf PIR1,RCIF ; apago el flag de la interrupcion
movff RCREG, DATA_IN ; Guardo el dato recibido en
; data_in
bcf RCSTA,CREN ; Limpio por si hubo errores en la
bsf RCSTA,CREN ; recepcion
movlw "p" ;
xorWF DATA_IN,w ;
BTFSS STATUS,Z
goto OFF
CALL ADC
MOVFF VALOR,TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
RETURN
OFF
movlw "a" ;
xorWF DATA_IN,w ;
btfss STATUS,Z ;
GOTO off2
BsF PORTB,0
RETURN
off2
movlw "x" ;
xorWF DATA_IN,w ;
btfss STATUS,Z ;
GOTO OFF3
MOVLW "Y"
movwf TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
MOVLW "E"
movwf TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
MOVLW "S"
movwf TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
RETURN
OFF3
movlw "o" ;
xorWF DATA_IN,w ;
btfss STATUS,Z ;
GOTO no_send
BCF PORTB,0
RETURN
no_send
return
;*********************ADC
ADC
BSF ADCON0,ADON
MOVLW .76
MOVWF DELAY_0
DELAY
DECFSZ DELAY_0
BRA DELAY
BSF ADCON0,GO
LOOP2
BTFSC ADCON0,GO
GOTO LOOP2
MOVFF ADRESH,VALOR
BCF ADCON0,ADON
; MOVFF VALOR,PORTB
RETURN
;*********************TRANSMIT
TRANSMIT
MOVWF SSPBUF
LOOP_T
BTFSS SSPSTAT,BF
GOTO LOOP_T
MOVF SSPBUF,W
RETURN
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
ESCRIBIR_SD
NO_CMD_51
MOVLW 0X58
CALL TRANSMIT
; MOVLW 0X00
MOVF DIR0_SD,W
CALL TRANSMIT
; MOVLW 0X00
MOVF DIR1_SD,W
CALL TRANSMIT
; MOVLW 0X00
MOVF DIR2_SD,W
CALL TRANSMIT
; MOVLW 0X00
MOVF DIR3_SD,W
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
CPFSEQ CORRECTO
GOTO NO_CMD_51
GOTO OK_CMD_51
OK_CMD_51
MOVLW 0X70
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando...
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFF
CALL TRANSMIT
MOVLW 0XFE
CALL TRANSMIT
MOVLW 0X02
MOVWF VAL_MAYOR
CLRF VAL_MENOR
DATOS
;MOVLW 0XFF
; MOVLW 'M'
; CALL TRANSMIT
MOVFF VAL_MAYOR,FSR0H
MOVFF VAL_MENOR,FSR0L
MOVF INDF0,W
CALL TRANSMIT
INCFSZ VAL_MENOR
GOTO DATOS
INCF VAL_MAYOR
MOVLW 0X04
CPFSEQ VAL_MAYOR
GOTO DATOS
MOVLW 0X02
MOVWF VAL_MAYOR
CLRF VAL_MENOR
; INCFSZ VAL_MENOR
; GOTO DATOS
; INCF VAL_MAYOR
; MOVLW 0X02
; CPFSEQ VAL_MAYOR
; GOTO DATOS
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando..
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando..
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando..
MOVLW 0XFF
CALL TRANSMIT
MOVWF TXREG
btfss TXSTA, TRMT ; poleo hasta que el dato se haya enviado
GOTO $-2 ; no se ha enviado el dato, esperando..
RETURN
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
;****************************************************ESCRIBIR*************************************************
END