TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: D1to en 18 de Enero de 2017, 10:40:22

Título: adquisicion de datos desde interrupt
Publicado por: D1to en 18 de Enero de 2017, 10:40:22
Hola a todos, estaba leyendo un par de libros de programacion y me topé con unas lineas de codigo que no comprendo, uso el pic 16f877a y mikroc pro. Cuabdo leo un puerto a/d normalmente lo hago mas o menos asi
Radc = adc_read(0) ;
Pero la imagen, la cual corresponde a un vector de interrupcion es diferente. Segun yo entiendo se lee el bit 0 del adc y se almacrba en un variable tipo float, pero despues de eso no entiendo  empezando por el >>... agradeceria mucho la atuda de alguien.   
 - Tienes que ingresar para ver archivos adjuntos -
Título: Re:adquisicion de datos desde interrupt
Publicado por: MGLSOFT en 18 de Enero de 2017, 12:05:10
Por lo que veo, tanto SENSOR como Punto_de_Control son variables tipo float.

Lo que hace la anteposición de (float) es un Casting (o Casteo) para pasar el resultado que viene después a float, para asignarlo a dichas variables.

Luego lo que hace >> es desplazar el resultado de la conversión A/D 2 veces a la derecha (ver en hoja de datos del micro como entrega ese valor el micro) para ponerlo en esa variable, al final hace un AND con 0xFF para dejar solo los 8 bits del valor convertido.

Los resultados de ambas conversiones se entregan en valores flotantes con el rango 0.0 a 255.0

Nota: el numero entre parentesis despues de ADC_READ es el canal a convertir, no es un bit.
Título: Re:adquisicion de datos desde interrupt
Publicado por: D1to en 18 de Enero de 2017, 14:31:01
Gracias por tu pronta respuesta, aunque no entendi bien la ultima parte sobre el and(&) con 0xff podrías explicarme un poco más y sobre el dezplazamiento del valor. Otra consulta aun si estoy en void interrupt puedo usar solo el adc read? O debo poner ese cod en caso de q use un lm 35 por ejemplo.
Título: Re:adquisicion de datos desde interrupt
Publicado por: KILLERJC en 18 de Enero de 2017, 14:46:16
ADC_Read lee el ADC, si el ADC es de 10 bits quiere decir que en una variable de 16 bits va a quedar algo asi con justificado a la derecha:

Lectura del ADC: 0000 00bb aaaa aacc

Al hacer >> 2 , simplemente rota los bits 2 espacios a la derecha quedando:

ADC_Read()>>2 : 0000 0000 bbaa aaaa

Observaras que se pierden los 2 ultimos bits. La idea de esto es simplemente tomar los 8 mas significantes. Luego aplica una AND con el valor 0xFF

1010 0000 bbaa aaaa
0000 0000 1111 1111  = 0xFF
---------------------------
0000 0000 bbaa aaaa

A este le cambie algunos bits, como ves por el resultado, la idea es que lo unico que no sea 0 sean ese byte. Esto es por que los demas bits son "indefinidos" los cuales deberian leerse como 0, pero por las dudas se asegura de que si los demas bits estan cambiados no afecte al resultado y quede acotado solo en un byte


Citar
Otra consulta aun si estoy en void interrupt puedo usar solo el adc read? O debo poner ese cod en caso de q use un lm 35 por ejemplo.

Eso depende de lo que quieras hacer... El ADC te da 10 bits es decir desde 0 a 1023, Esta operacion hace que ese numero pase a ser de 0 a 255, ¿Te es suficiente con 8 bits? Si es asi entonces mejor con 8, ya que le estas quitando los de menor peso a la lectura del ADC que son los que mas fluctuarian.
Título: Re:adquisicion de datos desde interrupt
Publicado por: D1to en 18 de Enero de 2017, 15:21:05
Muchas gracias por su  MGLSOFT y KILLERJC  ahora todo quedo claro. Tengan un bien día  :D  :D  :D