TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: mikipic 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!
-
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:
UINT16 ADC;
UINT8 BufferUSB[64];
Buffer[0]=ADC;
Buffer[1]=(ADC>>8);
En la PC:
UINT16 ADC;
UINT8 BufferUSB[64];
ADC=Buffer[0]+Buffer[1]*256;Saludos!
-
hola! gracias por la ayuda :) :)
pero que significa esa instruccion : " Buffer[1]=(ADC>>8)" es como desplazar los bits?? disculpa esque recien soy nuevo :(
-
En CCS yo la haría de la siguiente forma:
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!!!
-
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
-
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
-
En CCS yo la haría de la siguiente forma:
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
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
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'}
-
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???
-
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.
-
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...
-
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!!!
-
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)
.
-
una opcion bastante rara, dificil y abstracta de comprender es la siguiente
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.