Autor Tema: Valores erroneos enviados por el puerto serie  (Leído 2523 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Valores erroneos enviados por el puerto serie
« 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.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Valores erroneos enviados por el puerto serie
« Respuesta #1 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);


Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: Valores erroneos enviados por el puerto serie
« Respuesta #2 en: 23 de Junio de 2004, 22:10:00 »
porque mandas de oito em oito bits,porque não manda tudo de uma vez?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Valores erroneos enviados por el puerto serie
« Respuesta #3 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?

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Valores erroneos enviados por el puerto serie
« Respuesta #4 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);


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Valores erroneos enviados por el puerto serie
« Respuesta #5 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á.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Valores erroneos enviados por el puerto serie
« Respuesta #6 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.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Valores erroneos enviados por el puerto serie
« Respuesta #7 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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Valores erroneos enviados por el puerto serie
« Respuesta #8 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.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Valores erroneos enviados por el puerto serie
« Respuesta #9 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.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Valores erroneos enviados por el puerto serie
« Respuesta #10 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.