Hola
Pues mi problema está en que al mandar un dato de 10 bits por el puerto serie hacia la computadora me llegan valores muy grandes. Basicamente lo que hago es declarar mi convertidor AD de 10 bits, posteriormente el dato leído lo descompongo en dos, los primeros 8 bits y los ultimos 2 bits. Con los primeros ocho bits no tengo problemas, llegan correctamente al visual. Pero cuando envío los otros dos bits pues en ocasiones llegan valores muy grandes, siendo que el valor maximo debe ser 3. Bueno, el código que utilizo es el siguiente, espero me puedan echar una mano.
Codigo:
main()
{
int i,temp,datolow,datohigh;
long dato;
set_tris_b(0x00);
setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
while (TRUE)
{
dato=0;
datolow=0;
datohigh=0;
output_high(PIN_B7);
delay_us(30);
dato = read_adc();
datolow=dato;
temp=make8(dato,1);
datohigh=temp&3;
putc(datohigh);
putc(datolow);
}
}
No se si mi error esté en el momento de aplicar la función AND, de antemano gracias.
Yo lo veo así , pero no estoy seguro de la sintaxis ya lo corregireis .
Codigo:
int16 dato
Byte datolow,datohigh
dato = read_adc();
datolow = dato;
datohigh = (dato >> 8)
putc(datohigh);
putc(datolow);
Hola, pues este es el código que utilizo
Codigo:
#include <16f874A.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,WRT
#device ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main()
{
int i,temp,datolow,datohigh;
long dato;
set_tris_b(0x00);
setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
while (TRUE)
{
dato=0;
datolow=0;
datohigh=0;
output_high(PIN_B7);
delay_us(30);
dato = read_adc();
datolow=dato;
temp=make8(dato,1);
datohigh=temp&3;
putc(datohigh);
putc(datolow);
}
}
Creo entender lo que me dices con el printf, así que trataré por ese lado y luego les comento como me fue.
Hola Pocher, entonces todo lo demás de mi programa está bien ? O debo cambiar algo, porque lo he modificado pero no se si lo que hice está bien.
Codigo:
#include <16f874A.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,WRT
#device ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main()
{
int16 dato;
byte datolow,datohigh,temp;
dato=0;
datolow=0;
datohigh=0;
temp=0;
set_tris_b(0x00);
setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
while (TRUE)
{
dato=0;
datolow=0;
datohigh=0;
output_high(PIN_B7);
delay_us(30);
dato = read_adc();
datolow=dato;
temp=(dato>>8);
datohigh=temp&3;
putc(datohigh);
putc(datolow);
}
}
Según yo probé con un pequeño programa de visual y pues el putc me envía el dato tomado, entonces llega al visual en ascii y ahí lo vuelvo a transformar en entero.
Me refiero a esto:
Codigo:
#include <16F876.h>
#device adc=10
#fuses XT, NOPROTECT, PUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main()
{
int i,temp,datolow,datohigh;
long dato;
set_tris_b(0x00);
setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
while (TRUE)
{
//dato=0;
//datolow=0;
//datohigh=4;
output_high(PIN_B7);
delay_ms(1000);
dato = read_adc();
datolow=dato;
temp=make8(dato,1);
datohigh=temp&3;
//putc(datohigh);
//putc(datolow);
printf("%lu ",dato);
printf("%u ",datohigh);
printf("%u ",datolow);
}
}
Con putc() solo sirve para enviar un caracter.