?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{FILE START}

library

?curdirlinks? - Rev 6

?prevdifflink? - Blame - ?getfile?

//*****************************************************************************
// File Name    : ds18b20.c
// Title                : Dallas 1-Wire DS18B20 Temperature Sensor Library
// Revision             : 3
// Notes                : 
// Target MCU   : Atmel AVR series
// Editor Tabs  : 4
//
//*****************************************************************************
 
//----- Include Files ---------------------------------------------------------
#include "rprintf.h"            // include rprintf function library
#include "dallas.h"                     // include dallas support
#include "ds18b20.h"            // include ds18b20 support

void ds18b20Init(void)
{
        // initialize the 1-wire
        dallasInit();
}

u08 ds18b20Setup(dallas_rom_id_T* rom_id, u08 resolution, s08 alarm_low, s08 alarm_high)
{
        u08 error;

        // check resolution
        if ((resolution < DS18B20_RES_MIN) || (resolution > DS18B20_RES_MAX))
                return DALLAS_RESOLUTION_ERROR;

        // check address
        error = dallasAddressCheck(rom_id, DS18B20_FAMILY);
        if (error != DALLAS_NO_ERROR)
                return error;

        // reset and select node
        error = dallasMatchROM(rom_id);
        if (error != DALLAS_NO_ERROR)
                return error;

        // starts writting at address 0x02, T_H
        dallasWriteByte(DS18B20_WRITE_SCRATCHPAD);
        dallasWriteByte(alarm_high);
        dallasWriteByte(alarm_low);

        // convert resolution to bitmask
        // valid value are 9-12 encoded as 0-4, resolution stored in bits 5&6 and bits 0-4 are always one
        resolution = ((resolution - 9) << 5) | 0x60;
        dallasWriteByte(resolution);

        // reset and select node
        error = dallasMatchROM(rom_id);
        if (error != DALLAS_NO_ERROR)
                return error;
        
        // start reading at address 0x00
        dallasWriteByte(DS18B20_READ_SCRATCHPAD);
        
        dallasReadByte();                                                       // 0x00, temp lsb
        dallasReadByte();                                                       // 0x01, temp msb

        // verify the data
        if ((s08)dallasReadByte() != alarm_high)        // 0x02, alarm high
                return DALLAS_VERIFY_ERROR;
        if ((s08)dallasReadByte() != alarm_low)         // 0x03, alarm low
                return DALLAS_VERIFY_ERROR;
        if (dallasReadByte() != resolution)                     // 0x04, resolution
                return DALLAS_VERIFY_ERROR;

        return DALLAS_NO_ERROR;
}

u08 ds18b20Start(dallas_rom_id_T* rom_id)
{
        u08 error;

        // check address
        error = dallasAddressCheck(rom_id, DS18B20_FAMILY);
        if (error != DALLAS_NO_ERROR)
                return error;

        // reset and select node
        error = dallasMatchROM(rom_id);
        if (error != DALLAS_NO_ERROR)
                return error;
        
        // send convert command
        dallasWriteByte(DS18B20_CONVERT_TEMP);
        
        return DALLAS_NO_ERROR;
}

/*------ DallasTempGetResult ------*/
u08 ds18b20Result(dallas_rom_id_T* rom_id, u16 *result)
{
        u08 error;

        union int16_var_U
        {
                u16 i16;
                u08 i08[2];
        } int16_var;

        // check address
        error = dallasAddressCheck(rom_id, DS18B20_FAMILY);
        if (error != DALLAS_NO_ERROR)
                return error;

        // reset and select node
        error = dallasMatchROM(rom_id);
        if (error != DALLAS_NO_ERROR)
                return error;
        
        // send command
        dallasWriteByte(DS18B20_READ_SCRATCHPAD);
        
        // read results 1 byte at a time
        int16_var.i08[0] = dallasReadByte();
        int16_var.i08[1] = dallasReadByte();
        *result = int16_var.i16;

        return DALLAS_NO_ERROR;
}

u08 ds18b20StartAndResult(dallas_rom_id_T* rom_id, u16 *result)
{
        u08 error;

        // start
        error = ds18b20Start(rom_id);
        if(error != DALLAS_NO_ERROR)
                return error;

        // wait
        dallasWaitUntilDone();

        // return any errors - results passed by reference
        return ds18b20Result(rom_id,result);    
}

void ds18b20Print(u16 result, u08 resolution)
{
        // print raw value
        rprintfProgStrM(" 0x");
        rprintfu16(result);
        rprintfChar(' ');

        // print real temp
        rprintfNum(10, 4, TRUE , ' ', result>>4);
        rprintf(".");
        rprintfNum(10, 4, FALSE, '0', (10000*((u32)(result&0x000F)))/16 );
        rprintfProgStrM(" C");
}

/* OLD VERSION

void ds18b20Print(u16 result, u08 resolution)
{
        u08 numerator;

        // print header
        rprintfProgStrM(" 0x");
        rprintfu16(result);
        rprintfChar(' ');

        // extract fractional part
        numerator = result & 0x000F;

        // extract integer part
        result >>= 4;

        // deal with negative numbers
        if ((s08)result < 0)
        {
                // for negative fractions
                if (numerator)
                {
                        numerator = 16-numerator;       // fractions are reversed               
                        ++result;                                       // the integer is one more than 2's complement
                        if (!(s08)result)                       // between -1 and 0
                                rprintfChar('-');               // we have to take care of the negative sign
                }
        }

        // print integer part (signed)
        rprintfNum(10,4,1,'0',(s08)result);
        rprintfChar(' ');

        //Print fractional part. use numerator for numerator, resolution for denomiator
        // bit resolution    setup mask     degree resolution
        // --------------    ----------     -----------------
        //       9              0x00              1/2
        //      10              0x20              1/4
        //      11              0x40              1/8
        //      12              0x60              1/16
        numerator >>= (12-resolution);     // scale fractional part of result to resolution
        resolution = 2 << (resolution - 9);     // create denominator as 2^(res-9)
        rprintfNum(10,3,0,0,numerator);
        rprintfChar('/');
        rprintfNum(10,3,0,0,resolution);
}
*/
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3