Autor Tema: Como se concatenan dos bytes  (Leído 3685 veces)

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

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Como se concatenan dos bytes
« en: 04 de Diciembre de 2010, 09:58:27 »
Hola estoy empezando con los micro y ya estoy trabado :oops: resulta que tengo un pic 12f675 q tiene un conversor AD de 10 bits, mi pregunta basicamente es como leer el resultado dado q se guarda en dos bytes (ADRESH,ADRESL). desde ya muchas gracias! ;-)

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Como se concatenan dos bytes
« Respuesta #1 en: 04 de Diciembre de 2010, 11:56:47 »
Yo he hecho una pequeña funcion para esto:
Código: [Seleccionar]
unsigned char read_adc(void)
{
char buf[15];
int i=0;
int j=0;
int cont=0;

if( ADIF==1){ //An A/D conversion completed (must be cleared in software)
palabra_low= ADRESL;
palabra_high=ADRESH;
ADIF=0;
}  

for(i=0,i=7,i++)
{

if(palabra_low & 2^i)
buf[i] = '1';
else
   buf[i] = '0';
cont++;

if(cont==8)
j=8;
  
}              
            
for(j=8,j=15,j++)
{

if(palabra_high & 2^j)
buf[j] = '1';
else
  buf[j] = '0';
                
}    
return buf;
}

No se si esta bien, aun no me he parado a mirarla en question pero la idea ahi la tienes. Un saludo
« Última modificación: 04 de Diciembre de 2010, 12:17:34 por edu1989 »

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Como se concatenan dos bytes
« Respuesta #2 en: 04 de Diciembre de 2010, 12:32:42 »
No hace falta hacerlo tan complicado. Defines 1 variable de 16 bits, i haces lo siguiente:

variable = ADRESH<<8; desplazas 8 veces ADRESH
variable = variable+ADRESL;


Un Saludo.
Share the world !

Blog's

http://www.area0x33.com

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Como se concatenan dos bytes
« Respuesta #3 en: 04 de Diciembre de 2010, 13:00:01 »
Perfecto! Muchas gracias.
La variable la definiria como unsigned char * buffer, por ejemplo? ( creo que un unsigned char son 16bits...)

Adjunto mi codigo:
Código: [Seleccionar]
unsigned char read_adc(void)
{

GODONE=1; //A/D conversion in progress

if( ADIF==1){ //An A/D conversion completed (must be cleared in software)
buffer = ADRESH<<8;
buffer = buffer+ADRESL;
ADIF=0;
}   

return buffer;
}

buffer lo tengo declarado asi:
unsigned char * buffer;
« Última modificación: 04 de Diciembre de 2010, 13:07:22 por edu1989 »

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Como se concatenan dos bytes
« Respuesta #4 en: 04 de Diciembre de 2010, 13:54:53 »
Que compilador estas usando ?
Share the world !

Blog's

http://www.area0x33.com

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Como se concatenan dos bytes
« Respuesta #5 en: 04 de Diciembre de 2010, 13:57:20 »
Hi- Tech PICC-18 para el 18f4550

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Como se concatenan dos bytes
« Respuesta #6 en: 04 de Diciembre de 2010, 14:05:03 »
Perfecto! Muchas gracias.
La variable la definiria como unsigned char * buffer, por ejemplo? ( creo que un unsigned char son 16bits...)

Adjunto mi codigo:
Código: [Seleccionar]
unsigned char read_adc(void)
{

GODONE=1; //A/D conversion in progress

if( ADIF==1){ //An A/D conversion completed (must be cleared in software)
buffer = ADRESH<<8;
buffer = buffer+ADRESL;
ADIF=0;
}  

return buffer;
}

buffer lo tengo declarado asi:
unsigned char * buffer;

  No Edu, no uses el símbolo * porque eso indica que es un puntero.

  Para este caso, read_ADC tiene que devolver un tipo int, porque el conversor es de 10 bit y no entran en un char. Entonces usas un variable del tipo int para llamar a la función read_ADC

unsigned int valor_leido;            // variable que se usa para la lectura

unsigned int read_ADC(void)      // función que devuelve la lectura del ADC
{
  .....
  .....
  ....
  return ((ADRESH << 8 ) + (ADRESL));
}

y se utilizaría....

valor_leido = read_ADC();
« Última modificación: 04 de Diciembre de 2010, 14:35:54 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Como se concatenan dos bytes
« Respuesta #7 en: 04 de Diciembre de 2010, 14:33:54 »
Hola, tal y como ha dicho AngelGris para declarar una variable de 16 bits debes poner: unsigned int buffer ya que el char es para 8 bits.

Para hacer una rutina que sea read_adc yo haría lo siguiente:
Código: C
  1. unsigned int read_adc(void){
  2. GODONE=1;          // Activamos la conversion ADC
  3. while(ADIF==0);   // Espera hasta que la conversion ADC se haya completado
  4. ADIF=0;          // Limpiamos el flag de la conversion ADC
  5. return (ADRESH<<8)+ADRESL;  // Nos devuelve el valor de la conversion ADC
  6.  
  7. }

Para obtener el valor del ADC siguiendo esta funcion se haria de la siguiente manera:

Código: C
  1. unsigned int buffer;   // Se declara buffer como una variable unsigned int (para que sea de 16 bits)
  2. buffer=read_adc();

Share the world !

Blog's

http://www.area0x33.com

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Como se concatenan dos bytes
« Respuesta #8 en: 04 de Diciembre de 2010, 17:37:17 »
.


No conozco nada de este lenguaje, pero si es un derivado del C ¿no existe el tipo union?
Código: C
  1. union dato
  2. {
  3. unsigned int var1;
  4. unsigned char[4]var2;
  5. };
« Última modificación: 04 de Diciembre de 2010, 21:33:40 por mtristan »
When you see a good move, look for a better one (Emanuel Lasker)

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Re: Como se concatenan dos bytes
« Respuesta #9 en: 04 de Diciembre de 2010, 21:09:37 »
Muchas gracias por su ayuda, pero el problema es que como recien estoy empezando uso assembler y no tengo un compilador en C, podrian ecplicarme como funciona y de ahi tratare de volcarlo a assembler...

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Como se concatenan dos bytes
« Respuesta #10 en: 04 de Diciembre de 2010, 21:42:32 »
.


En assembler no hay tipos de datos, así que solamente se puede trabajar con valores de 8 bits  :? (en caso de que el uC sea de 8 bits, como este). La forma de manejar los datos depende de lo que quieras hacer con ellos...

When you see a good move, look for a better one (Emanuel Lasker)

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Re: Como se concatenan dos bytes
« Respuesta #11 en: 04 de Diciembre de 2010, 22:43:59 »
Lo que estoy queriendo hacer es una medición de temperatura, el sensor es un LM35, la medición la ingreso al pic y realizo la conversión AD hasta ahi todo bien :) pero a ese valor lo quiero mostrar en una pantalla LCD, entoces lo que tengo que hacer es realizar una rutina que me entregue un valor en BCD, es decir un byte para centena, otro para decena y otro para unidad. Me dijeron que debo concatenar lo bytes del AD, Esto es así??

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como se concatenan dos bytes
« Respuesta #12 en: 04 de Diciembre de 2010, 23:03:31 »
Lo que estoy queriendo hacer es una medición de temperatura, el sensor es un LM35, la medición la ingreso al pic y realizo la conversión AD hasta ahi todo bien :) pero a ese valor lo quiero mostrar en una pantalla LCD, entoces lo que tengo que hacer es realizar una rutina que me entregue un valor en BCD, es decir un byte para centena, otro para decena y otro para unidad. Me dijeron que debo concatenar lo bytes del AD, Esto es así??

Para convertir el valor del conversor (0-255 si es 8-bits, o 0-1023 si es 10-bits) a temperatura realizas una regla de tres simple. Luego el resultado lo puedes convertir a BCD. Por aquí hay rutinas necesarias:

http://www.todopic.com.ar/foros/index.php?topic=23812.msg213329#msg213329



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Camello83

  • PIC10
  • *
  • Mensajes: 22
Re: Como se concatenan dos bytes
« Respuesta #13 en: 05 de Diciembre de 2010, 00:34:00 »
Muchas gracias!!! muy buenas las rutinas, las probé con unos ejemplos numéricos y anda de diez :mrgreen: ahora voy a ponerlo en el micro, mientras vaya avanzando voy a ir subiendo los progresos!!!!!!
 :-/ :-/ :-/ :-/ :-/