DS18b20 problems.

Thread Starter

tryingtolearn

Joined Apr 4, 2010
17
Hello, I am having problems with setting the alarm function for a ds18b20 on my 16f887. I kinda understand how to write the code to write to the scratch pad and search for an alarm. I don't however understand the format of what I am to enter. Say I want the high at 26C and the low at 18C.

So I tried writing an if statement for the pic to do the comparison but can't get it to actually compare and send port pin high/low.

Any help in either of these methods would be much appreciated.

Rich (BB code):
sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC7_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISC2_bit;
sbit LCD_EN_Direction at TRISC7_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections

//  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
//  18S20: 9  (default setting; can be 9,10,11,or 12)
//  18B20: 12
const unsigned short TEMP_RESOLUTION = 12;

char *text = "000.0000";
unsigned temp;


void Relay () {
if (*text <= 18)
RA6_bit = 0xff;
else
RA6_bit = 0x00;
}

void Display_Temperature(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;
  unsigned int temp_fraction;



  // Check if temperature is negative
  if (temp2write & 0x8000) {
     text[0] = '-';
     temp2write = ~temp2write + 1;
     }

  // Extract temp_whole
  temp_whole = temp2write >> RES_SHIFT ;

  // Convert temp_whole to characters
  if (temp_whole/100)
     text[0] = (temp_whole/100  + 48);
  else
     text[0] = '0';

  text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  text[2] =  temp_whole%10     + 48;             // Extract ones digit

  // Extract temp_fraction and convert it to unsigned int
  temp_fraction  = temp2write << (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;

  // Convert temp_fraction to characters
  text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  text[7] =  temp_fraction%10      + 48;         // Extract ones digit


  // Print temperature on LCD
  Lcd_Out(2, 5, text);



}





void main() {
  ANSEL  = 0;                                    // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                                  // Disable comparators
  C2ON_bit = 0;

  TRISA = 0x00;
  PORTA = 0x00;
  Lcd_Init();                                    // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                           // Clear LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                      // Turn cursor off
  Lcd_Out(1, 1," Temperature:   ");              //" Temperature:   "
  // Print degree character, 'C' for Centigrades
  Lcd_Chr(2,13,223);                             // Different LCD displays have different char code for degree
                                                 // If you see greek alpha letter try typing 178 instead of 223
//  Lcd_Chr(2,16,'F');
  Lcd_Chr(2,14,'C');

  //--- Main loop
  do {
    //--- Perform temperature reading
    Ow_Reset(&PORTE, 2);                         // Onewire reset signal
    Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTE, 2, 0x44);                   // Issue command CONVERT_T
    Delay_us(120);

    Ow_Reset(&PORTE, 2);
    Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTE, 2, 0xBE);                   // Issue command READ_SCRATCHPAD

    temp =  Ow_Read(&PORTE, 2);
    temp = (Ow_Read(&PORTE, 2) << 8) + temp;

    //--- Format and display result on Lcd
    Display_Temperature(temp);
    Relay;

    Delay_ms(500);

  } while (1);
}
 

Thread Starter

tryingtolearn

Joined Apr 4, 2010
17
I figured it out. Its probably a lot more work than what is needed but I got it working and thats what I was after. It turns relay on in between 23.5c and 27c. Now to figure Fahrenheit conversion out.

Added the following code to make it work:

Rich (BB code):
unsigned text100;
unsigned text200;
unsigned text300;
unsigned text400;
unsigned text500;

////existing/////
text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  text[7] =  temp_fraction%10      + 48;         // Extract ones digit
////end of existing/////

if ((temp_whole/23) )
text100 = 1;
else
text100=0;

if ((temp_fraction/5000))
text200 = 1;
else
text200 = 0;

if (temp_whole/24)
text300 =2;
else
text300=0;

if (temp_whole/27)
text500=-3;
else
text500=0;

text400= ((text100+text300+text200+text500));

if (text400/2)
RA6_bit = 0xff;
else
RA6_bit = 0x00;
 
Top