LIST p=18F13K22
#INCLUDE <p18f13k22.inc>
CONFIG FOSC = IRC
CONFIG PLLEN = ON
CONFIG BOREN = OFF
CONFIG WDTEN = OFF
CONFIG MCLRE = OFF
CONFIG HFOFST = OFF
CONFIG LVP = OFF
CONFIG CP0 = ON
CONFIG CP1 = ON
CONFIG CPB = OFF
CONFIG CPD = OFF
CONFIG WRT0 = OFF
CONFIG WRT1 = OFF
CONFIG WRTB = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTRB = OFF
CBLOCK 0x000
VL
VH
VS
W_TEMP
STATUS_TEMP
BSR_TEMP
INTER
B1
ENDC
ORG 0x00
GOTO INICIO
ORG 0x008
; GOTO BAJA
RETFIE;ALTA_PRIORIDAD
ORG 0x018
GOTO BAJA
;RETFIE
#DEFINE SERVO1 PORTB,6
VALORH EQU 0XFF
VALORL EQU 0XCF
;**************************************************************
INICIO
BSF OSCCON,IRCF2 ;CONFIGURO EL OSCILADOR INTERNO
BSF OSCCON,IRCF1 ;A 16MHZ
BSF OSCCON,IRCF0
;
CLRF SLRCON
CLRF ANSEL ;CONFIGURAMOS TODOS LOS PINES
CLRF ANSELH ;COMO I/O DIGITAL
;CONFIGURACION DE LOS PUERTOS
CLRF PORTA ;PONGO TODAS LAS SALIDAS
CLRF PORTB ;EN NIVEL BAJO
CLRF PORTC
CLRF LATA
CLRF LATB
CLRF LATC
CLRF TRISA ;CONFGIRO LOS PUERTOS
CLRF TRISB ;COMO SALIDAS
CLRF TRISC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BSF RCON,7; DEFINIMOS INTERRUPCIONES COMO BAJA PRIORIDAD
CLRF IPR1
CLRF IPR2
CLRF INTCON
BSF PIE1,TMR1IE; ACTIVAMOS INTERRUPCION TMR1
CLRF T1CON; CONFIGURAMOS EL TIMER 1 CON PREESCALER 1 Y DE 8 BITS
BSF T1CON,7
CALL CONF_ADC
CALL INI_TMR
CLRF VL
CLRF VH
CLRF VS
CLRF B1; BANDERA DE AYUDA
MOVLW VALORH
MOVWF TMR1H
MOVWF VALORL
MOVWF TMR1L
; ANTES DE ENTRAR AL LOOP ACITVAMOS LAS INTERRUPCIONES Y TMR1
BCF PIR1,TMR1IF; LIMPIAMOS BANDERA DE INTERRUPCION TMR1
CALL SET_SERVO
BSF T1CON,TMR1ON; ACTIVAMOS TMR0
BSF INTCON,6
BSF INTCON,7; HABILITAMOS INTERRUPCIONES
BSF T1CON,7
CALL CON_CH0
MOVFF VH,VS
MOVLW 0XFF
MOVWF INTER
PRINCIPAL
CALL CON_CH0
MOVFF VH,PORTC
GOTO PRINCIPAL
CONF_ADC
MOVLW B'00001110'; JUSTIFICADO A LA IZQUIERDA
MOVWF ADCON2
CLRF ADCON1
MOVLW B'00000000'; VAMOS A SELECCIONAR EL ADC 0 Y HABILITAR EL PUERTO DE CONVERSIÓN
MOVWF ADCON0
BSF TRISA,0
BSF ANSEL,ANS0 ;CONFIGURAMOS LA ENTRADA A0 PARA LEERLA
RETURN
CON_CH0
BSF ADCON0,ADON
BSF ADCON0,GO
PROCESO
BTFSC ADCON0,GO
GOTO PROCESO
MOVFF ADRESH,VH
MOVFF ADRESL,VL
RETURN
SET_SERVO
BSF SERVO1
MOVLW .9
CALL RET_X100us
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ENTRA A VECTOR DE INTERRUPCION
BAJA
MOVFF W,W_TEMP
MOVFF BSR,BSR_TEMP
MOVFF STATUS,STATUS_TEMP
BTFSS PIR1,TMR1IF
RETFIE
BTFSC B1,0
GOTO INTER17
BCF T1CON,TMR1ON
BCF PIR1,TMR1IF
MOVLW VALORH
MOVWF TMR1H
MOVLW VALORL
MOVWF TMR1L
; MOVF VS,W
; BTFSS STATUS,Z
; GOTO $+2
; GOTO CLEAR_SERVO1
DECFSZ VS,F
GOTO KEEP_SERVO1
CLEAR_SERVO1
BSF B1,1
BCF SERVO1
KEEP_SERVO1
MOVFF W_TEMP,W
MOVFF BSR_TEMP,BSR
MOVFF STATUS_TEMP,STATUS
BSF T1CON,TMR1ON
DECFSZ INTER,F
RETFIE
BSF PORTB,7
;GENERAMOS AQUI LA INTERRUPCION DE 17.9ms
MOVLW 0X74
MOVWF TMR1H
MOVLW 0X2F
MOVWF TMR1L
BSF T1CON,5
BSF T1CON,4; PRENDEMOS PREESCALER DE 8
BSF B1,0
BCF SERVO1
RETFIE
INTER17
CALL SET_SERVO
MOVFF VH,VS
BCF B1,0
BCF T1CON,5
BCF T1CON,4
MOVLW VALORH
MOVWF TMR1H
MOVLW VALORL
MOVWF TMR1L
MOVFF W_TEMP,W
MOVFF BSR_TEMP,BSR
MOVFF STATUS_TEMP,STATUS
RETFIE
#INCLUDE<RET.INC>
END