Autor Tema: Como funciona la libreria original de ccs c del DS18B20  (Leído 4510 veces)

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

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Como funciona la libreria original de ccs c del DS18B20
« en: 05 de Diciembre de 2019, 11:11:28 »
Hola muchach@s, espero se encuentre bien, estoy haciendo unas practicas con las librerías originales que trae el ccs c, ahora estoy trabajando en la librería ds18b20.c
Yo se que existen otras librerías y las he utilizado y funcionan perfectamente bien, pero yo quiero aprender un poco sobre las originales.
Código: C
  1. //// Controlador para el termómetro digital Dallas DS18B20, con Dallas one ////
  2. //// interfaz de cable. ////
  3. //// ////
  4. //// ds18b20_init () ////
  5. //// Inicia el módulo y el controlador. ////
  6. //// ////
  7. //// int1 = ds18b20_read (firmado int16 * pTemp) ////
  8. //// Lee la temperatura del dispositivo y guarda el valor de lectura en pTemp ////
  9. //// puntero. Devuelve VERDADERO si hablamos con éxito con el dispositivo ////
  10. //// y pTemp se actualizó; devuelve FALSE si hubo un error ////
  11. //// en comunicación y pTemp no se actualiza. ////
  12. //// Esto bloqueará el PICmicro mientras espera el ////
  13. //// DS18B20 para devolver una conversión, que puede tomar más de 750 ms. ////
  14. //// También esta rutina puede atascarse en un bucle infinito y no ////
  15. //// regresa si hay un problema con el bus. ////
  16. //// Para limitar el interbloqueo, use ds18b20_start_conversion () y ////
  17. //// ds18b20_get_conversion () en su lugar. ////
  18. //// La temperatura devuelta es grados C, pero fraccional; ////
  19. //// divide entre 16 para obtener el numerador entero. ////
  20. //// ////
  21. //// int1 ds18b20_start_conversion (void) ////
  22. //// Esto inicia una conversión de temperatura en el DS18B20. ////
  23. //// Devuelve VERDADERO si la comunicación fue exitosa, FALSO si existe ////
  24. //// había algo mal con el bus o el dispositivo. ////
  25. //// ////
  26. //// int1 ds18b20_get_conversion (firmado int16 * pTemp) ////
  27. //// Después de que se inicia una conversión, puede esperar a Tconv ////
  28. //// (que es 750 ms para la conversión de resolución máxima) o encuesta ////
  29. //// el bus con ds18b20_read_bit () (si devuelve un valor distinto de cero ////
  30. //// entonces la conversión ha finalizado). Una vez finalizada la conversión ////
  31. //// entonces esta función lee la conversión almacenada en ////
  32. //// dispositivo DS18B20. ////
  33. //// ////
  34. //// CONEXIONES ////
  35. //// ////
  36. //// PIN_DS18B20_DATA ////
  37. //// #define esto al pin PIC GPIO conectado al DS18B20 ////
  38. //// pin de datos. ////
  39. //// Ejemplo: #define PIN_DS18B20_DATA PIN_D0 ////
  40. //// ////
  41. //////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////
  42. //// (C) Copyright 1996,2016 Servicios informáticos personalizados ////
  43. //// Este código fuente solo puede ser utilizado por usuarios con licencia de CCS C ////
  44. //// compilador. Este código fuente solo se puede distribuir a otros ////
  45. //// usuarios con licencia del compilador CCS C. Ningún otro uso, reproducción ////
  46. //// o la distribución está permitida sin un permiso por escrito. ////
  47. //// Programas derivados creados con este software en código objeto ////
  48. //// forma no están restringidos de ninguna manera. ////
  49. //// ////
  50. //// http://www.ccsinfo.com ////
  51. //////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////
  52.  
  53. /// begin config ///////////////////////////////////////////// //////////////
  54.  
  55. #ifndef PIN_DS18B20_DATA
  56. #define PIN_DS18B20_DATA PIN_B5
  57. #endif
  58.  
  59. /// end config ////////////////////////////////////////////////////////////
  60.  
  61.  
  62. void ds18b20_init(void)
  63. {
  64.    output_float(PIN_DS18B20_DATA);
  65. }
  66.  
  67. /*
  68. This method will initialize the DS18B20 for transactions to occur
  69. PARAMS: none
  70. RETURNS: TRUE if start pulse response read from unit
  71. */
  72. int1 ds18b20_start(void)
  73. {
  74.    int1 ret = FALSE;
  75.    
  76.    output_low(PIN_DS18B20_DATA);
  77.    delay_us(500);
  78.    output_float(PIN_DS18B20_DATA);
  79.    delay_us(70);//wait to read the SLAVES response
  80.    if (!input(PIN_DS18B20_DATA))
  81.    {
  82.       ret = TRUE;
  83.       delay_us(430);
  84.    }
  85.    return(ret);
  86. }
  87. /*
  88. This method will write a bit to the DS18B20 following write time slots
  89. PARAMS: int1 value to write
  90. RETURNS: none
  91. */
  92. void ds18b20_write(int1 value)
  93. {
  94.    output_low(PIN_DS18B20_DATA);//drives output low for master
  95.    delay_us(2);//delays for 2us
  96.    output_bit(PIN_DS18B20_DATA,value);//sets MASTER to input mode to release pin
  97.    delay_us(60);
  98.    output_float(PIN_DS18B20_DATA);//sets MASTER to input mode to release pin
  99.    delay_us(2);//delays for 2 microseconds which is within 15us max
  100. }
  101. /*
  102. This method will call write() for each bit of a byte to be sent
  103. PARAMS: BYTE value to write
  104. RETURNS: none
  105. */
  106. void ds18b20_write_byte(unsigned int8 value)
  107. {
  108.    unsigned int8 i;
  109.    for(i=1;i<=8;++i)
  110.    {
  111.       ds18b20_write(shift_right(&value,1,0));
  112.    }
  113. }
  114. /*
  115. This method will read a value from the DS18B20 following the read time slots
  116. PARAMS: none
  117. RETURNS: A bit from the DS1993
  118. */
  119. int1 ds18b20_read_bit(void)
  120. {
  121.    int1 value;
  122.    output_low(PIN_DS18B20_DATA);//drives output low for master
  123.    delay_us(2);
  124.    output_float(PIN_DS18B20_DATA);//sets MASTER to input mode to release pin
  125.    delay_us(8);//waits to read
  126.    value=input(PIN_DS18B20_DATA);
  127.    delay_us(120);
  128.    return value;
  129. }
  130. /*
  131. This method will call read() and update a byte bit by bit
  132. PARAMS: none
  133. RETURNS: A byte from the DS1993
  134. */
  135. unsigned int8 ds18b20_read_byte()
  136. {
  137.    unsigned int8 i, value;
  138.    
  139.    for(i=0; i<8; i++)
  140.    {
  141.       shift_right(&value,1,ds18b20_read_bit());
  142.    }
  143.    return value;
  144. }
  145.  
  146. int1 ds18b20_start_conversion(void)
  147. {
  148.    if (!ds18b20_start())
  149.       return(FALSE);
  150.    ds18b20_write_byte(0xCC);
  151.    ds18b20_write_byte(0x44);
  152.    return(TRUE);
  153. }
  154.  
  155. int1 ds18b20_get_conversion(signed int16 *pTemp)
  156. {
  157.    union
  158.    {
  159.       unsigned int8 b[2];
  160.       signed int16 w;
  161.    } ret;
  162.    
  163.    if (!ds18b20_start())
  164.       return(FALSE);
  165.      
  166.    ds18b20_write_byte(0xCC);
  167.    ds18b20_write_byte(0xBE);
  168.    ret.b[0] = ds18b20_read_byte();
  169.    ret.b[1] = ds18b20_read_byte();
  170.    
  171.    *pTemp = ret.w;
  172.    
  173.    return(TRUE);
  174. }
  175.  
  176. int1 ds18b20_read(signed int16 *pTemp)
  177. {
  178.    if (!ds18b20_start_conversion())
  179.       return(FALSE);
  180.      
  181.    while(!ds18b20_read_bit());
  182.      
  183.    return(ds18b20_get_conversion(pTemp));
  184. }
  185.  
  186. /*
  187. This method will initiate a temperature read (12 bit resolution) and convert
  188. of the module by skipping the ROM of the module and reading from
  189. the scratch pad
  190. PARAMS: pTemp - where temperature is stored if valid read
  191. RETURNS: TRUE if ds18b20 is on bus and acting properly
  192. */
  193. /*
  194. int1 ds18b20_read(signed int16 *pTemp)
  195. {
  196.    unsigned int8 busy = 0;
  197.    union
  198.    {
  199.       unsigned int8 b[2];
  200.       signed int16 w;
  201.    } ret;
  202.    
  203.    if (!ds18b20_start())
  204.       return(FALSE);
  205.    ds18b20_write_byte(0xCC);
  206.    ds18b20_write_byte(0x44);
  207.    while(busy==0)
  208.       busy=ds18b20_read_byte();
  209.      
  210.    if (!ds18b20_start())
  211.       return(FALSE);
  212.    ds18b20_write_byte(0xCC);
  213.    ds18b20_write_byte(0xBE);
  214.    ret.b[0] = ds18b20_read_byte();
  215.    ret.b[1] = ds18b20_read_byte();
  216.    
  217.    return(ret.w);
  218. }
  219. */
Ahora como logro hacer una lectura del sensor con estas funciones ya que no logro hacerlo.
Con esto no me funciona.
float Temp;
Temp=ds18b20_read();
Me sale el siguiente error
A numeric expression must appear here
Gracias a todos los que puedan responder.
Les dejo la practica que estoy haciendo.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como funciona la libreria original de ccs c del DS18B20
« Respuesta #1 en: 05 de Diciembre de 2019, 21:36:14 »
Esta esperando que le indiques donde guardarlo.

Código: C
  1. int1 status;
  2. signed int16 valor;
  3.  
  4. status = ds18b20_read(&valor)

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Como funciona la libreria original de ccs c del DS18B20
« Respuesta #2 en: 05 de Diciembre de 2019, 23:53:28 »
Gracias maestro killerjc por responder pero sigo sin entender como trabaja o función, me lo puede explicar un poco mejor  8) :lol: :oops:
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como funciona la libreria original de ccs c del DS18B20
« Respuesta #3 en: 06 de Diciembre de 2019, 08:12:47 »
Empezas por la funcion que estas llamando:


Citar
int1 ds18b20_read(signed int16 *pTemp)  <---  Dice que con el return devuelve un booleano TRUE para correcto y FALSE para un error y ademas su parametro que lo explico despues
{
   if (!ds18b20_start_conversion())   <--- Comienza la conversion, es decir envia el pulso de inicio, revisa si esta presente, borra y pide comienzo de conversion de temperatura
      return(FALSE);
     
   while(!ds18b20_read_bit());  <-- Lee un bit, imagino esperando alguna señal de DS18B20
     
   return(ds18b20_get_conversion(pTemp));  <-- Finalmente llama a la función para leer la temperatura.
}

Observaras que la funcion ds18b20 requiere como parametro un puntero a un entero de 16bit con signo. Ese era uno de tus problemas.

Respecto a como funciona dentro (como lee, los comandos que envia,etc) esta explicado en el datasheet del DS18B20.
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Como funciona la libreria original de ccs c del DS18B20
« Respuesta #4 en: 06 de Diciembre de 2019, 14:05:06 »
Maestro killerjc,  yo entiendo el funcionamiento de las funciones para escribir y leer del ds, yo ya he hecho proyectos con este sensor, lo que no entendía era como llamar a la función, pero gracias a su ayuda ya me quedo mas claro.  Muchas gracias por su tiempo.   :-/ ((:-))
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.


 

anything