Hola:
Este programita está basado en las enseñanzas de él maestro VSzener.
Acá hay un programa con el cual nuestra intención es testear sensores, al principio lo habíamos realizado con El pic 16F84a, pero evidentemente como este micro controlador no tiene la suficiente cantidad de memoria nos pasamos al 16F28, sin embargo no sé por qué razón, supongo que por la cantidad de memoria no me permite colocar variables globales. También me gustaría saber la forma, en realidad se cómo mandar por el puerto serial pero quiso o lo mande o imprima los datos cuando estos cambien y no estarlos enviando constantemente.
En cuanto a las representación que usamos esto fue, debido a que usando la representación de un número flotante nos consumía una gran cantidad de memoria. Si les es de ayuda esto se interpreta en la siguiente manera.
printf(lcd_putc,"V4:%d.%d",dato /100,(dato-(dato/100)*100)); //muestra por
Supongamos
dato = 211 (en realidad serían 2,11 volts), la primera parte imprime sólo la parte entera, dato /100 = 211/100 = imprime la parte entera o sea = 2.
Luego imprime la coma . El siguiente paso es la parte de decimal = dato-(dato/100)*100) que al solo imprimir la parte entera imprimirá el 11.
////////////////////////////////////////////////////////////////////////////////////
//
// 28/Mayo/06
//
// Programa: Manejo del dispositivo PCF8591 en modo A/D
// Version: 0.0
//
// Dispositivo: PIC 16F84A Compilador: CCS vs3.245
// Entorno IDE: MPLAB IDE v7.31 Simulador: Proteus 6.7sp3
//
// Notas: Este programa muestra como usar el conversor pfc8591 como adc.
// La Vref es de 2,56v por lo tanto la resolucion del conversor es 10mV.
// Básicamente lo que aquí hacemos es inicializar el conversor con la palabra
// de configuración y luego sólo resta leer (obviamente estamos modificando la
// tención analógica de entrada) sólo nos resta corregir un ligero error que es
// el que apenas pasa el valor de 128 en que se muestra valor negativo.
// Se muestra por pantalla de lcd(LM016L)
//
//
// Conexiones: RA1 -> SDA pcf8591
// RA0 -> SCL pcf8591
//
// lcd(LM016L)
// B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
// VSS y VEE -> gnd
// VDD ->VCC
//
// pcf8591
// A0,A1,A2.EXT , AGND ->gnd
// AN0,AN1,AN2,AN3 divisor resistivo con potenciometro (2.5v Variables)
// VREF=2.56 (en est6e caso)(pin14) divisor resistivo con potenciometro
//
//
//////////////////////////////////////////////////////////////////////////////////
/******************************************************/
/********** Programa Medidor de Presion con 16f628 ***/
/******************************************************/
#include <16f628.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,noPUT,nolvp//ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE
#include <lcd.c> //libreria para lcd
#define PCF8591_SCL PIN_A0 //definicion de pines...
#define PCF8591_SDA PIN_A1 //...de manejo del pcf8591
#include <vs_pcf8591.c> //libreria pcf8591
#use rs232(baud=9600, xmit=PIN_A2, rcv=PIN_A3) //manejo del RS232
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion( )
{
int8 dato; //almacena lectura del pcf8591
dato=read_adc_value( ); //lee del pcf8591
lcd_gotoxy(9,2);
printf(lcd_putc,"V4:%d.%d",dato/100,(dato-(dato/100)*100)); //muestra por lcd, la ultima parte obedece solo
//a una forma de representar con enteros
printf("V4=%3u \t ",dato);//con esta parte se imprime en El puerto serial (RS232)
dato=read_adc_value( ); //lee del pcf8591
lcd_gotoxy(1,1);
printf(lcd_putc,"V1:%d.%d",dato/100,(dato-(dato/100)*100)); //muestra por lcd
//a una forma de representar con enteros
printf("V1=%3u \t ",dato);//con esta parte se imprime en El puerto serial (RS232)
dato=read_adc_value( ); //lee del pcf8591
lcd_gotoxy(9,1);
printf(lcd_putc,"V2:%d.%d",dato/100,(dato-(dato/100)*100)); //muestra por lcd
printf("V2=%3u \t ",dato);//con esta parte se imprime en El puerto serial (RS232)
dato=read_adc_value( ); //lee del pcf8591
lcd_gotoxy(1,2);
printf(lcd_putc,"V3:%d.%d",dato/100,(dato-(dato/100)*100)); //muestra por lcd
printf("V3=%3u \t ",dato);//con esta parte se imprime en El puerto serial (RS232)
set_timer0(0 ); //carga TMR0
}
///PROGRAMA
void main(void)
{
lcd_init( ); //inicializamos lcd
lcd_putc(" Medidor de \n Presion...");
delay_ms(2000);
lcd_putc("\f");
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(0 ); //carga TMR0 -> temporizacion maxima aprox 65.5ms
enable_interrupts(GLOBAL); //activadas interrupciones
pcf8591_adc_init(0b00000100); //inicializamos pcf8591
while(TRUE);//bucle infinito
}