TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: badtzdizzy en 23 de Junio de 2004, 12:19:00

Título: Valores erroneos enviados por el puerto serie
Publicado por: badtzdizzy en 23 de Junio de 2004, 12:19:00
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.
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: pocher en 23 de Junio de 2004, 13:15:00
Si dices que los primeros 8 bits te llegan bien, pués entonces la & estará bien ¿no?, ya que:

datohigh=temp&3;
putc(datohigh);

Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: Ginho_rj en 23 de Junio de 2004, 22:10:00
porque mandas de oito em oito bits,porque não manda tudo de uma vez?
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: pocher en 24 de Junio de 2004, 00:22:00
No entiendo como declarando datolow y datohigh como int puedes enviarlos al hiperterminal con putc() ¿?

¿Puedes poner el programa entero?
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: Sispic en 24 de Junio de 2004, 00:44:00
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);

Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: pocher en 24 de Junio de 2004, 10:11:00
Bueno, te lo digo yo. Unicamente tienes que cambiar los putc por printf y ya te funcionará.
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: badtzdizzy en 24 de Junio de 2004, 11:33:00
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.
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: pocher en 24 de Junio de 2004, 23:02:00
Pon también dato=0; datolow=0; datohigh=0; en el main, no en el while
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: badtzdizzy en 25 de Junio de 2004, 11:00:00
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.
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: pocher en 25 de Junio de 2004, 11:12:00
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.
Título: RE: Valores erroneos enviados por el puerto serie
Publicado por: badtzdizzy en 25 de Junio de 2004, 12:47:00
Hi Pocher

Pues ahora si ya te entendí, mi duda ahora es si puedo hacer la misma manipulación en el visual o le tengo que dar un tratamiento especial. Por ejemplo, cuando usaba el putc, pues en el visual cargaba ese primer valor en una variable, luego la del segundo putc y tambien la cargaba en otra variable. Finalmente realizaba unas operaciones matemáticas y obtenia un solo valor que debería variar entre 0 - 1023, pero resultaba que en ocasiones tenía valores muy grandes que llegaban hasta el 65000 y algo. Bueno, haré lo que me dices y luego te aviso como me fue. Finalmente lo que quiero es graficar esos datos. En este caso ya no será la conversión de ascii que hacía verdad? Gracias.