Define CONF_WORD = 0x31c4 'Palabra de configuracion (Fuses)
Define CLOCK_FREQUENCY = 4 'Frecuencia del reloj en Mhz
'********************************************************************************
'NOMBRE: 12F675_Ejemplo_2_COMPARADOR MODE
'MICRO: PIC12F675, 4Mhz Interno
'DESCRIPCION: Uso del comparador analogico
'FECHA/AUTOR: By COS, 07/09
'Version 1.0
'Lectura de la entrada analogica AN2 y se asigna su valor
'a la cvref interna del modulo comparador.
'Se utiliza como entrada para comparar la CIN-
'VRR =1 : CVREF = (VR3:VR0 / 24) * VDD, uso esta configuracin en el modulo comparador
'********************************************************************************
'Define SEROUT_DELAYUS = 0 'Serout sin demoras entre bytes
Symbol adc_ok = ADCON0.GO 'adc_ok = 0 -> el modulo ADC tiene una lectura lista
'************************ Declaracion de variables ******************
Dim adc_and2 As Word
Dim cvref_in As Word
Dim c_out As Byte
'***************** Asignacion de valores a las variables *******
adc_and2 = 0
c_out = 0
cvref_in = 0
'************* Configuracion modulos generales (E/S) *********
CMCON = %00000100 'comparator CN1=ON
VRCON = %10100000 'vref ON, vrr = 1 (cvref -> min. =0 y max. = 3.125V)
ANSEL = %00010110 'fosc/8 (4Mhz=2uSeg.), an2 y an1 en mode analogico, resto de pin digitales
ADCON0 = %00001001 'adc a 8bit, vdd reference, adc On
'ADCON0.ADFM = 1 '10BIT ADC
ADCON0.GO = 1 'Inicia conversion ADC
OSCCAL = 0x47 'calibracion del oscilador interno
TRISIO = 0xff 'tri-state pins, entradas
TRISIO.4 = 0 'GP4 pin, como salida, Tx puerto serie
TRISIO.5 = 1 'GP5 pin, como entrada
'*********************Configuracion del Timer1*****************************
T1CON.TMR1CS = 0 'bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0 'bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'bit de seleccion del prescaler para el reloj del timer1
T1CON.TMR1ON = 0 'parado el contador del TMR1
PIE1.TMR1IE = 0 'desactiva las interrupciones del timer1
'--------------------------------------Main Programa------------------------------
WaitMs 500 'espera 5Seg.
main: 'Rutina del programa principal (inicio)
If adc_ok = 0 Then Gosub lectura_adc 'Comprueba si el ADC tiene lectura
Gosub v_ref_in 'Calcula tension de referencia interna modulo comparador
c_out.0 = CMCON.COUT 'Resultado comparacion
Serout GPIO.4, 2400, CrLf, "ADC_AND2: ", #adc_and2, " CVREF: ", #cvref_in, CrLf
Serout GPIO.4, 2400, #c_out, CrLf
WaitMs 200
Goto main 'Redirecciona el flujo del programa al inicio
End 'Fin del programa
lectura_adc: 'Asigna lectura del ADC
'adc_and2.HB = ADRESH 'Asigna valor ADC alto, 10bit
'adc_and2.LB = ADRESL 'Asigna registro ADC valor bajo 10bit
adc_and2 = ADRESH 'Para 8bit
ADCON0.GO = 1 'Activa lectura del ADC
Return
v_ref_in: 'Asigna volor de cvref segun la entrada analogica an2
cvref_in = (15 * adc_and2) / 255 'Convierte entrada analogica 8bit a 4bit
VRCON.VR3 = cvref_in.3
VRCON.VR2 = cvref_in.2
VRCON.VR1 = cvref_in.1
VRCON.VR0 = cvref_in.0
cvref_in = 0
cvref_in.3 = VRCON.VR3
cvref_in.2 = VRCON.VR2
cvref_in.1 = VRCON.VR1
cvref_in.0 = VRCON.VR0
'VRR = 0: cvref = vdd/4 + (VR3:VR0 / 32) * vdd
'VRR =1 : CVREF = (VR3:VR0 / 24) * VDD, USO ESTA CONFIGURACION
Return