Autor Tema: dudas sobre comunicacion serial y ADC resolucion  (Leído 4127 veces)

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

Desconectado mikipic

  • PIC10
  • *
  • Mensajes: 19
dudas sobre comunicacion serial y ADC resolucion
« en: 22 de Octubre de 2012, 18:17:15 »
hola que tal, estoy haciendo un programa para hacer una adquisicion de datos usando el adc del 16f877a. y mandando los datos en forma serial a la pc.

Mi duda es la siguiente: si utilizo el adc con 10 bits de resolución, como puedo mandar el dato serial-mente si la comunicacion serial tiene el parametro de 8 bits de datos.



gracias!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #1 en: 22 de Octubre de 2012, 19:24:25 »
Mirá este ejemplo de Suky.
Saludos.
          Jukinch
Divides ya sean los 10-bits o 16-bits en dos registros de 8-bits que luego re-armas en la PC. Ejemplo:

Código: [Seleccionar]
UINT16 ADC;
UINT8 BufferUSB[64];


Buffer[0]=ADC;
Buffer[1]=(ADC>>8);

En la PC:

Código: [Seleccionar]
UINT16 ADC;
UINT8 BufferUSB[64];

ADC=Buffer[0]+Buffer[1]*256;
Saludos!
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado mikipic

  • PIC10
  • *
  • Mensajes: 19
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #2 en: 23 de Octubre de 2012, 01:57:27 »
hola! gracias por la ayuda :)     :)

pero que significa esa instruccion :    " Buffer[1]=(ADC>>8)"   es como desplazar los bits??  disculpa esque recien soy nuevo  :(

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #3 en: 23 de Octubre de 2012, 22:11:44 »

En CCS yo la haría de la siguiente forma:

Citar
set_adc_channel(1);
      delay_ms(1);
      conversion = read_adc();
      parte_baja = make8(conversion,0);
      parte_alta = make8(conversion,1);
      printf("%d",parte_alta);
     printf("%d",parte_baja);

Donde parte_alta y parte_baja son variables de tipo entero, mientras la variable conversion puede ser de tipo long.

Saludos!!!
« Última modificación: 23 de Octubre de 2012, 22:14:01 por Chenao »
Un saludo desde Pereira - Colombia

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #4 en: 24 de Octubre de 2012, 11:51:12 »
hola! gracias por la ayuda :)     :)

pero que significa esa instruccion :    " Buffer[1]=(ADC >> 8 )"   es como desplazar los bits??  disculpa esque recien soy nuevo  :(

Asi es, significa que desplazas el valor de la variable ADC 8 bits, equivalente a dividirla entre 256. Por ejemplo si la variable contiene el valor de 626 decimal al realizarle la operación de desplazamiento de 8 bits el resultado sería 2. Es decir:

626 dec. >> 8 = 2  ó 1001110010 bin >> 8 = 10 bin.

Al desplazarlo 8 bits eliminarías los 8 bits de la izquierda, dando como resultado 10
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #5 en: 24 de Octubre de 2012, 12:03:03 »
Otro ejemplo:
-----------------------------------------------------------------------------------------------------------------------------
Los operadores de desplazamiento a nivel de bit "<<" y ">>" Desplazan a la izquierda o a la derecha un número especificado de bits.
En un desplazamiento a la izquierda los bits que sobran por el lado izquierdo se descartan y se rellenan los nuevos espacios con ceros. De manera análoga pasa con los desplazamientos a la derecha. Veamos un ejemplo:

    c = 0x1C    00011100

c << 1    c = 0x38    00111000
c >> 2    c = 0x07    00000111

Como en binario se trabaja en base dos cada posición de desplazamiento implica dividir o multiplicar por 2

>> divide por 2.

<< multiplica por 2

   c = 0x1C    00011100

c << 1    c = 0x38    00111000 multiplica por 2
c >> 2    c = 0x07    00000111 divide 2 veces por 2
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #6 en: 24 de Octubre de 2012, 12:12:45 »

En CCS yo la haría de la siguiente forma:
Código: [Seleccionar]
set_adc_channel(1);
      delay_ms(1);
      conversion = read_adc();
      parte_baja = make8(conversion,0);
      parte_alta = make8(conversion,1);
      printf("%d",parte_alta);
     printf("%d",parte_baja);

Una forma mas corta de hacer esto es de la siguiente manera

Código: [Seleccionar]
set_adc_channel(1);
      delay_ms(1);
      conversion = read_adc();
      printf("%Lu",conversion);

La última línea te permite enviar un entero de 16 bits convertido en una cadena de caracteres sin necesidad de dividir los bytes de la variable conversion
Código: [Seleccionar]
printf("%Lu",conversion);
Es decir, si el valor es 626, el PIC convertirá eso en la cadena "626". Lo que equivale al arreglo de los siguientes 4 caracteres {'6','2','6','\0'}
« Última modificación: 24 de Octubre de 2012, 12:14:48 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado mikipic

  • PIC10
  • *
  • Mensajes: 19
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #7 en: 24 de Octubre de 2012, 20:38:37 »



eso quiere decir que la funcion printf("%lu",conversion)  manda una cadena???.  yo pense que si era LU mandaba enteros largos y %d enteros de 8..
.... entonces no habria necesidad de mandar parte alta y baja por serparado???

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #8 en: 24 de Octubre de 2012, 21:56:46 »

Citar
eso quiere decir que la funcion printf("%lu",conversion)  manda una cadena???.  yo pense que si era LU mandaba enteros largos y %d enteros de 8...... entonces no habria necesidad de mandar parte alta y baja por serparado???

En efecto, pero existe un problema y es que se pierde ancho de banda en la comunicación tal y como comenta el compañero bigluis.
Un saludo desde Pereira - Colombia

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #9 en: 24 de Octubre de 2012, 22:51:17 »
Si, se pierde exactamente el doble de tiempo enviando u string, pero....
Del otro lado no hay que hacer una rutina de armado de la word nuevamente, no es asi??
O sea que se recupera tiempo de nuevo.
Yo creo que si transmite los datos a 38400 bps, es casi improbable poder ver la diferencia de esa perdida.
Mas aun si lo que se transmite es un solo dato, y no una lista de datos, lo que se envia como string...
« Última modificación: 25 de Octubre de 2012, 21:29:11 por MGLSOFT, Razón: maldita N del teclado !! »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #10 en: 25 de Octubre de 2012, 13:00:47 »

Citar
Yo creo que si transite los datos a 38400 bps, es casi improbable poder ver la diferencia de esa perdida.
Mas aun si lo que se transmite es un solo dato, y no una lista de datos, lo que se evia como string...

Si se va a transmitir un sólo dato no creo que exista problema alguno, el problema es cuando se quiere enviar una lista de datos o un dato muy repetidamente, yo lo que haría sería dividir la palabra en dos bytes y enviar los datos (parte_alta, parte_baja) como un valor tipo char.

Saludos!!!
Un saludo desde Pereira - Colombia

Desconectado mikipic

  • PIC10
  • *
  • Mensajes: 19
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #11 en: 25 de Octubre de 2012, 21:00:10 »
no toy seguro pero creo  que putc() y printf() se diferencian porque la primera envia un caracter y la segunda manda un cadena de caracteres.

entonces se ahorraria mas si uso putc de esta manera ?

1) metodo1
putc(parte_alta);
putc(parte_baja); 


y EN LA COMPUTADORA RECONSTRUYO EL VALOR 

que si uso el metodo 2?

2) metodo 2

printf(valor); mando de un porraso todo el valor y ya no tengo que reconstruir el valor en la pc


ahora? que seria mejor usar en caso de que tenga que enviar continunuamente el resultado de una conversion  de 10 bits???   
 por ejemplo el voltaje de un ptenciomentro al ADC del pic  y poder visualizar todos esos valores en visual basic o matlab(tiempo real)
.


 






Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: dudas sobre comunicacion serial y ADC resolucion
« Respuesta #12 en: 27 de Octubre de 2012, 20:57:25 »
una opcion bastante rara, dificil y abstracta de comprender es la siguiente

Código: [Seleccionar]
      conversion = read_adc();                  //se obtiene el valor del ADC
      parte_alta = make8(conversion,1);         //Obtenemos la parte alta de la conversion
      printf("%c%c",conversion,parte_alta);     //enviamos parte baja y parte alta en forma de caracteres

  • cuando haces printf("%c",conversion) le haces creer al compilador que el valor de 'conversion' es un caracter de 8 bits. Por lo tanto este imprimirá la parte baja del entero largo en pantalla en forma de caracter.
  • Cuando haces printf("%c",parte_alta) le haces creer al compilador que el valor de 'parte_alta' es un caracter de 8 bits. Por lo tanto este imprimirá la parte alta del entero largo en pantalla en forma de caracter.

El problema estrá cuando recibas el dato en la PC ya que tendrás que hacer una función para leer esto. Seria algo asi:

conversion = get("%c%c");

aunque dudo mucho que esto funcione. jajajajaj.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA


 

anything