Hola!
Posteo la librería modificada, para los siguientes modelos/modos: DS1820 o DS18S20 con alimentación desde pin Vdd o bien alimentación desde pin DQ(alimentación parásita).
También cambié la búsqueda del archivo touch.c a la carpeta de drivers del CCS, y no a la carpeta del proyecto.
* Si NO se utiliza alimentación parásita, no hace falta modificar nada más que el PIN donde se conectará el sensor. Modifiqué la rutina para que una vez comenzada la petición de conversión realice "read-time slots" hasta que el sensor indique que ha finalizado la conversión. Esto asegura que la demora sea mínima al querer leer el resultado de una conversión.
* Si se utiliza alimentación parásita, hace falta declararlo. Esto se realiza decomentando la línea:
//#define PARASITE
y a continuación, hace falta declarar qué modelo se esta utilizando, esto puede hacerse decomentando alguna de las dos lineas segun corresponda:
//#define DS1820
//#define DS18S20
En este tipo de alimentación, se espera mediante un delay_ms() el tiempo correcto según el modelo elegido. No puede realizarse un polling del estado de la conversión como en el caso de alimentación NO parásita.
Espero que sirva.
////////////////////////////////////////////////////////////////////////////
//// Library for a Dallas 1820/18S20 Temperature chip ////
//// ////
//// init_temp(); Call before the other functions are used ////
//// ////
//// ////
//// d = read_full_temp(); Read the temp in degrees C (0 to 125) ////
//// ////
////////////////////////////////////////////////////////////////////////////
#ifndef DS1820_PIN
#define DS1820_PIN PIN_A2
#endif
#define TOUCH_PIN DS1820_PIN
#include <touch.c>
//uncomment if your using parasite power
//#define PARASITE
//if your using parasite power, you must specify the model you're using.
//#define DS1820
//#define DS18S20
#ifdef PARASITE
#ifdef DS1820
#define waitForConversion() delay_ms(500); //check http://www.maxim-ic.com/datasheet/index.mvp/id/3021 to see why this value...
#else
#ifdef DS18S20
#define waitForConversion() delay_ms(750); //check http://www.maxim-ic.com/datasheet/index.mvp/id/3021 to see why this value...
#endif
#endif
#else
#define waitForConversion() while(!touch_read_bit());
#endif
void init_temp() {
}
float read_full_temp()
{
BYTE i, buffer[9];
float minstep;
if (touch_present()) { // get present (reset) (2)
touch_write_byte(0xCC); // Skip ROM (3)
touch_write_byte (0x44); // Start Conversion
waitForConversion();
touch_present(); // get present (reset) (5)
touch_write_byte(0xCC); // Skip ROM (6)
touch_write_byte (0xBE); // Read Scratch Pad
for(i=0; i<9;i++) // read 9 bytes (7)
buffer[i] = touch_read_byte();
}
//minstep = (float)(buffer[0]/2)-0.25+((float)( buffer[7]-buffer[6])/buffer[7]);
if(buffer[1]){
minstep = (float)(-1)*(~make16(buffer[1],buffer[0])+1)/2;
}else{
minstep = (float)(make16(buffer[1],buffer[0])/2);
}
minstep = minstep - 0.25 + ((float)( buffer[7] - buffer[6])/buffer[7]);
return (minstep);
}
Saludos.