1. Leer un valor por alguna entrada analógica del PIC.
2. Manejo de un display alfanumérico con PIC.
Lectura de un valor analogico
Esta característica es muy importante a la hora de trabajar con sensores, debido a que estos entregan valores de tensión para reflejar la variable física que esta midiendo.
En estas entradas se pueden sensar valores de 0 a 5 V y se pueden representar(según el PIC) con diferentes resoluciones, como por ejemplo 256 valores, 1024(revisar datasheet).
Así si trabajamos con una resolución de 256 tendremos para 0V una salida de 0 y para los 5V veremos el numero 255, lo mismo con otras resoluciones y valores intermedios.
Para configurar las entradas analógicas debemos ir a Analog en el wizard y seleccionar que entradas ocuparemos para nuestros propósitos, por ejemplo yo configurare A0, A1 y A3.
setup_adc_ports(AN0_AN1_AN3);
Y al lado en Units una resolucion de 0-1023(1024 valores).
Display alfanumerico
Los displays son muy usados para permitir al usuario leer de una forma facil alguna variable, mensaje, dato, etc.
Los hay en varios modelos y caracteristicas donde las principales son el numero de filas y columnas que tienen disponible para desplegar mensajes. Estos se expresan como una matriz donde por ejemplo si el display puede desplegar 16 caracteres en dos filas se dice que es un display alfanumerico de 16x2.
Configurarlo en CCS es muy fácil y para eso en el mismo wizard nos dirigimos a Drivers y seleccionamos LCD driver. Las conexiones las podemos ver en I/O Pins pero yo las expondré en los ejemplos descargables.
Ya con el código hecho por el wizard nos queda leer el valor analógico y desplegar caracteres en el display. Expondré el código en el cual están comentado todas las lineas importantes.
______________________________________________________
#include <16F873A.h>
#device adc=10 //resolucion de 1024 valores
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=20000000) //oscilador externo de 20MHz
#include <LCD.C>
float a=0; //definimos la variable "a"
void main()
{
setup_adc_ports(AN0_AN1_AN3); //especifica que canales son configurados como analogicos
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init(); //se inicializa el display
while(true){
set_adc_channel(0); //especifica de que canal se leera el valor analogico
a=read_adc(); //se lee el valor analogico y se guarda digitalmente en la variable "a"
printf(lcd_putc,"\f"); //limpiamos el display alfanumerico
printf(lcd_putc,"Valor Digital"); //en la primera linea aparece el mensaje "Valor Digital"
lcd_gotoxy(1,2); //saltamos al primer cuadro de la segunda linea del display
printf(lcd_putc,"%f",a); //imprimimos el valor digital "a" en la segunda linea
delay_ms(100); //esperamos un tiempo de 100ms para esperar a la siguiente conversion
}
}
______________________________________________________________