'****************************************************************
'* Name : utilizacion A/D del pic 16f88 *
'* Author : MECATRODATOS *
'****************************************************************
'------ DESCRIPCION DEL PROGRAMA--------
'Este programa muestra los números con signo en
'PicBasic Pro en un rango de salida de los valores -50,0 a 50,0.
'La entrada es una gama digital de 10-bit de 0 a 1023.
'------------Conexiones-----------
' 16F88 Pin Wiring
' --------- ----------
' RA0 LCD pin 11(DB4)
' RA1 LCD pin 12(DB5)
' RA2 LCD pin 13(DB6)
' RA3 LCD pin 14(DB7)
' RA4 Resistive Input
' RB3 LCD Enable(E)
' RB4 LCD Register Select(RS)
' See schematic for the usual connections
'---------LCD Connexiones---------
' LCD Pin Wiring
' --------- ----------
' 1 Ground(Vss)
' 2 + 5v(Vdd)
' 3 Center of 20K Pot(Contrast)
' 4 RB4(Register Select,RS)
' 5 Ground(Read/Write,R/W)
' 6 RB3(Enable)
' 7 No Connection(DB0)
' 8 No Connection(DB1)
' 9 No Connection(DB2)
' 10 No Connection(DB3)
' 11 RA0(DB4)
' 12 RA1(DB5)
' 13 RA2(DB6)
' 14 RA3(DB7)
'---------Constantes / Definicion --------------------------------
'Para liberar AN4 (Pin RA4) como una entrada analógica, el Registro Default
'LCD de Seleccion (RS) debe ser Eliminado de RA4. Este se traslada a PORTB.4
'Usando las declaraciones LCD DEFINE a continuación. Todos los demás pines
'del LCD por Default y funciones no se cambian.
define LCD_RSREG PORTB ' PORTB - RS port
define LCD_RSBIT 4 ' Bit 4 - RS bit
DEFine ADC_BITS 10 ' Establece el número de bits en
' El resultado que 10
'---------Variables---------
x var word ' BYTE de entrada del potenciómetro
temp_int var word ' Variable para porcion entera
temp_fract var word ' Variable para porcion en fraccion decimal
'---------Initialization--------
ANSEL = %00010000 ' El pin AN4 en modo analógico, pero los otros
' pines en modo digital.
' Vea la tabla siguiente.
' Analog Bit Analog or Digital PIC16F88 Pin
' ------------ ------------------ --------------
' AN0 Digital RA0
' AN1 Digital RA1
' AN2 Digital RA2
' AN3 Digital RA3
' AN4 Analog RA4
' AN5 Digital RB6
' AN6 Digital RB7
ADCON1 = %10000000 ' Justifica valor de 10-bit a la variable x
' hacia la derecha
' En 16-bit WORD. Agrega "0" en La mayoría de
' 6 bits significativos de la Palabra,
' Desplazando el valor de 10-bits de x para
' la derecha.
OSCCON = $60 ' Establece el oscilador interno en el
' 16F88 a 4 MHz
'--------Codigo rincipal--------
loop:
pause 1000 ' Pausas de 1 segundo para permitir la
' configuracion del LCD
adcin 4, x ' Leer el voltaje analógico y AN4
' Convertir a valor digital de 10-bit
' Y guarda en variable x.
lcdout $FE,1,dec x ' En primera línea, pantalla de 10-bit
' Valor de x
x = x * 44/45 ' Comenzar la conversión de 10-bit rango de
' entrada,(0 - 1023), la gama de salida de LCD
' -50.0 A 50.0).
' Rango de salida / entrada Rango = 100/1023
' = 0,09775. Se debe utilizar un número entero
' Numerador para el cálculo. Numerador
' Debe ser inferior a 65, puesto que
' 65 * 1023> 65535, el límite para la Variable
' WORD. se encontró que 44/45 = 0,9777
' Se aproxima a la razon de 0,09775.
' El cambio en el punto decimal se hace
' En la fórmula siguiente.
temp_int = x/10 - 50 ' Obtener parte entera. Dividido por 10 a
' Cambio de punto decimal de 0,9777 a
' 0,09777. Resta 50 a cambio de 0 a 100
' Rango de salida de -50,0 a 50,0.
temp_fract = x//10 'Obtener el resto porción
lcdout $FE,$c0,sDEC temp_int, ".", DEC1 temp_fract
' En la segunda línea de LCD, pantalla del entero
' Parte de x, temp_int, como un decimal firmado
'(SDEC) y la porción restante de x,
' Temp_fract, como un decimal.
pause 250 ' Pausa de 250 ms
goto loop ' Saltar a la etiqueta de bucle
end