Hola a todos llevo 2 dia renegando con este codigo jajjaja. pero he avanzado mucho, lo unico que no se si es que esta funcionando mal PROTEUS o si esta mal el codigo, metira cualquier cosa la uart. lo que hice fue conetar dos micro por puerto serie en donde el transmisor envia los datos del ADC y el receptro muetro los datos de ADC, sin convertilo a float. hay valores en donde anda, pero con otro no. Aca le subo todo lo que he hecho, tanto codigo de Transmisor como el receptor y el ciruito
///////////////////////////////////////////////////////////////////////////RECEPTOR///////////////////////////////////////
#include <16f877a.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#use standard_io(b)
#use delay(clock=20000000)
#use rs232(baud=2400,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=8)//,invert)
#include <flex_lcd.c>
int i=0;
////////////////////////////////DECODE MANCHESTER///////////////////////////////
int Recibir_dato(int dato)
{
int i=0,dec=0,x=0,enc=0,band=0;
enc = dato;
x=0;
for(i=3; i>0; i--)
{band=0;
band=enc&0b11000000; //corroboro que bit estan en 1 y 0, y voy haciendolo de 2 bit a dos bit
if(band==0b10000000) //1
{bit_set(dec,x); //coloco un 1 en la pocicion i
}
if(band==0b01000000) //0
{bit_clear(dec,x); //coloco un 0 en la pocicion i
}
if((band==0b00)||(band==0b11)) //como el codigo manchester no acepta que se repitan los 00 ni los 11 devuelve un valor error.
{return 0xff; //lo uso para ver si trabaja bien el coder y decoder
}
enc<<=2; //desplazo asia la izquierda, el dato de dos en dos, es lo mismo que multiplicarlo en 4
x++;
}
return dec; //devuelvo 4bit de la palabra
dato=0;
}
Void main (void)
{ lcd_init();
int valor=0,low=0,high=0,datomanch=0,status=0,dato=0,valorfinal=0;
float p;
while(true)
{valor=0;
low=0;
high=0;
datomanch=0;
dato=0;
valor = getc(); //tomo los valores de la uart
datomanch=recibir_dato(valor); //envio los valores a la funcion
if(status==0) //uso esta bandera para trabajar de 4 bit en 4bit. cuando es 0 trabajo con los bit 0 al 3,
{status=1; //cuando es 1 trabajo con los bit 4 al 7
low=datomanch; //low son los primeros 4 bit
valorfinal=0; //utilizo esta bandera para que no me imprima el valor del ADC hasta que no tenga completo el el valor enviado del ADC
}
else
{status=0;
high=datomanch; //son los bit los utilmos 4 bit
high<<=4;
dato=(high | low); //sumo todo los bit, recuperando el valor enviado
valorfinal=1;
}
if(datomanch==0xff) // imprimo si hay error
{printf(lcd_putc,"\fERROR");
}
else
{if(valorfinal==1)
{p=(dato*5/(256-1)); //realizo la conversion del ADC
printf(lcd_putc,"\fADC=%d",dato); //imprimo los datos recibido del ADC
//printf(lcd_putc,"\nVolt=%1.2fV",p);
}
}
delay_ms(50);
}
}
/////////////////////////////////////////////////////////////////////////Transmisor/////////////////////////////////////////////////
#include <16f877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#use standard_io(b)
#use delay(clock=20000000)
#use rs232(baud=2400,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=8)//,invert)
#include <flex_lcd.c>
/////////////////////////////////CODE MANCHESTER////////////////////////////////
void Enviar_dato(int dato)
{
int i,j,b,me,x;
b=dato;
for (i=0; i<2; i++) //divido en 2 al BYTE y cada nibble los guardo y trabajo en "me".
{ me = 0; //hay que recordar que el bit menos significativo esta a la derecha
x=0;
for (j=0 ; j<4; j++)
{ if (bit_test(b,j)) // si en la posicion j del Byte b hay un 1 entonces pongo en el bit x===>0 y en el bitx++==>1
{bit_clear(me,x);
x++;
bit_set(me,x);
x++;
}
else // si en la posicion j del Byte b hay un 0 entonces pongo en el bit x===>1 y en el bitx++==>0
{bit_set(me,x);
x++;
bit_clear(me,x);
x++;
}
}
putc(me);
}
}
void main()
{setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
int q;
while(true)
{
set_adc_channel(0);
delay_us(20);
q=read_adc();
Enviar_dato(q);
}
}
Otra consulta puede ser que cuando se transmite en RS232 el receptor reciba los datos invertidos ejemplo.
Transmitido==> 0b10100101
Recibido ===>0b01011010
Relacion
TX RX
bit 0 bit6
bit 1 bit7
bit 2 bit4
bit 3 bit5
bit 4 bit2
bit 5 bit3
bit 6 bit0
bit7 bit1
yo creo que no pero eso es lo que me tira cuando lo debageo en el proteus.
si me pueden tirar una onda.
Gracias por la pagina, con ese prog empece y lo fui modificando por que no me andaba.