Problema ADC USART pic16f877a Hi-tech

Cordial saludo a todos, actualmente estoy haciendo un programa que multiplexa ciertas senales dependiendo de los requerimientos del computador, para esto hice un programa en C que parece funcionar bien, el problema es que la información que estoy recibiendo es errónea, actualmente uso la alimentación como voltaje de referencia, tal vez ocurra una saturacion en algún momento o algo así, a continuación pongo el programa que estoy usando, estoy poniendo un delay de 2000 us en el ADC, por que estaba intentando varias posibilidades, aunque realmente esto no me ha funcionado.
Agradezco si alguien me puede ayudar:

#include <pic.h>
#include "delay.h"
char DATO;
char serial;
int i;
void TxSerial(int num, char d_ ) // Función para transmitir un dato de forma serial
{ // a continuacion se implanta el protocolo de comunicacion para enviar los datos

char s;
switch(num){
// los primeros bits muestran 1100, esto se mantedra igual para todos los canales, representa
// la C en hexagecimal, y es un mecanismo de prueba de errores, los otros 4 bits representan el
// canal a digitalizar.

case 1:
while( !TRMT );
TXREG='T';
while( !TRMT );
TXREG = d_;
break;

case 2:
while( !TRMT );
TXREG='P';
while( !TRMT );
TXREG = d_;
break;

case 3:
while( !TRMT );
TXREG = 0b00001100;
while( !TRMT );
TXREG = d_;
break;

case 4:
while( !TRMT );
TXREG = 0b00011100;
while( !TRMT );
TXREG = d_;
break;

case 5:
while( !TRMT );
TXREG = 0b00101100;
while( !TRMT );
TXREG = d_;
break;

case 6:
while( !TRMT );
TXREG = 0b00111100;
while( !TRMT );
TXREG = d_;
break;

default:
break;
}
}

void main( void ) // Funcion principal.
{
TRISC = 0b11000000;
TXSTA = 0b00100100;
RCSTA = 0x90;
SPBRG = 21;
INTCON = 0; // Se apagan todas las interrupciones.
TRISA=0b11111111;
ADCON0=0b10000001;
ADCON1=0b10000000;
RCREG = 0;

while(1){

RCIF=0;
if( RCIF ) {
if(OERR=0){
CREN=0;
OERR=0;
CREN=1;
}
DATO=RCREG;

if(DATO=='1'){
DelayUs(2000);
CHS0=0;
CHS1=0;
CHS2=0;
ADGO=1;
while(ADGO);
serial=ADRESL;
TxSerial(1,serial);

DelayUs(2000);
CHS0=1;
CHS1=0;
CHS2=0;
ADGO=1;
while(ADGO);
serial=ADRESL;
TxSerial(2,serial);
}


if(DATO=='2'){

DelayUs(2000);
CHS0=0;
CHS1=1;
CHS2=0;
ADGO=1;
while(ADGO);
serial=ADRESL;
TxSerial(3,serial);

DelayUs(2000);
CHS0=1;
CHS1=1;
CHS2=0;
ADGO=1;
while(ADGO);
serial=ADRESL;
TxSerial(4,serial);

DelayUs(2000);
CHS0=0;
CHS1=0;
CHS2=1;
ADGO=1;
while(ADGO);
serial=ADRESL;
TxSerial(5,serial);
}
RCIF=0;
}
}
}


__CONFIG(0x3F3A);
 
Atrás
Arriba