Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'NOMBRE:16F88_PicEBasic_FunctionGetADC_14
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.4, By COS, 2/10, 3/10, PSI v6.83
'Rutina lectura del modulo ADC
'************************************************************************************************
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4 'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA 'el bus de datos será el puerto A
Define LCD_DBIT = 0 'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS será del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E será del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
Define LCD_COMMANDUS = 2000 'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5 '(50) 'Tiempo de espera después de inicializar el Display, trucado para simulación
'------------------------------------------------------------------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
'------------------------------------Definición de puertos------------------------------------------
ANSEL = %00010000 'Selecciona modo de trabajo de los pin, bit=0 digitales y bit=1 analógicos
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07 'comparador a off
TRISA = 0xff 'Puerto A como entradas
TRISB = 0xff 'puerto B como entradas
TRISB.3 = 0 'RB3 como salida
TRISA.7 = 0 'RA7 como salida
TRISB.0 = 0 'RB0 como salida
'TRISA.4 = 1 'como entrada (RA4, adc)
'TRISA.6 = 1 'como entrada (RA6, tecla S1)
'TRISA.5 = 1 'como entrada (RA5, tecla S2)
PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off
PORTB.0 = 1 'led verde a off
'------------------------------------Inicio------------------------------------------------------------
Lcdinit 'inicializa el LCD sin cursor
WaitMs 500 'pausa para estabilizar
'/* Iniciliza la funcion getadc a 10Bit con el canal 4, que es el
'del potenciometro de la EBasic y activa un lectura al salir de la funcion*/
Call getadc(4, 4, %1101)
main: 'Inicio bucle principal
'Hace una lectura del canal por defecto y activa una lectura al salir
Call getadc(0, 0, %1000)
Lcdcmdout LcdLine1Home 'Principio de línea 1
Lcdout "ADC=", #getadc, " " 'Imprime en decimal
Goto main
End
'Include "_FunctionGetADC.bas"
'Pic16F88 o compatibles
'Lee entradas analogicas, 8bit y 10bit
'r_pin = Selecciona el canal
's_pin = Selecciona el canal por defecto
'Si r_pin <> s_pin = Fuerza cambio de canales
'init.0 = 1, establece con figuracion basica a 10 bit
'init.0 = 1 & init.1 = 1, establece configurcion basica a 8 bit
'init.2 = 1, selecciona nuevo canal de entrada
'init.3 = 1, habilita nueva lectura al salir
'Si el ADC esta configurado a 8Bit el valor esta en v_bat.HB
'Optimizada para 8Mhz.
'En el programa mediante el reg. ANSEL seleccionaremos que pins seran digitales (I/O) y o analogicos
'La función tiene que ser inicializada llamandola una vez antes de usarla
Function getadc(r_pin As Byte, s_pin As Byte, ini As Byte) As Word
If ini.0 = 1 Then
ADCON0 = %01000001 'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (min 1.6uSeg), CH AN0, switching
ADCON1 = %11000000 'volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
If ini.1 = 1 Then ADCON1.ADFM = 0 'Activa lectura 8bit del ADC
Endif
If r_pin <> s_pin Or ini.2 = 1 Then 'Se establece el nuevo canal de lectura
ADCON0 = ADCON0 And %11000111 'Selecciona channel AN0
If r_pin = 1 Then ADCON0.3 = 1 'Selecciona channel AN1
If r_pin = 2 Then ADCON0.4 = 1 'Selecciona channel AN2
If r_pin = 3 Then 'Selecciona channel AN3
ADCON0.3 = 1
ADCON0.4 = 1
Endif
If r_pin = 4 Then ADCON0.5 = 1 'Selecciona channel AN4
Endif
If ini.0 = 1 Or ini.2 = 1 Then WaitUs 10 'Tiempo estabilización despues de configuración
If ini.3 = 0 Or ini.0 = 1 Or ini.2 = 1 Then ADCON0.GO = 1 'Activa una lectura en el ADC
While ADCON0.GO = 1 'Espera que termine la lectura del módulo ADC
Wend
getadc.HB = ADRESH 'Carga el valor mas significativo del registro del ADC
getadc.LB = ADRESL 'Carga el valor menos significativo del registro del ADC
If ini.3 = 1 Then ADCON0.GO = 1 'Genera una lectura al salir
'/* Selecciona el canal por defecto, de esta forma en la proxima lectura
'nos ahorramos los 10useg. de estabilizacion del modulo * /
If r_pin <> s_pin Then ADCON0 = ADCON0 And %11000111 'Selecciona channel AN0
If s_pin = 1 And r_pin <> s_pin Then ADCON0.3 = 1 'Selecciona channel AN1
If s_pin = 2 And r_pin <> s_pin Then ADCON0.4 = 1 'Selecciona channel AN2
If s_pin = 3 And r_pin <> s_pin Then 'Selecciona channel AN3
ADCON0.3 = 1
ADCON0.4 = 1
Endif
If s_pin = 4 And r_pin <> s_pin Then ADCON0.5 = 1 'Selecciona channel AN4
End Function