понедельник, 11 августа 2014 г.

Приехали MAXIM DS18B20

Приехали MAXIM DS18B20, заказанные под термоконтроллер (фанбас) для сервера. Стал пробовать и столкнулся с завышением показаний, приблизительно на 3 градуса. Брак? Как оказалось, нет. На демороликах в Ютубе – та же проблема. На одном из ресурсов удалось выяснить, что это обычное явление: саморазогрев такого термометра. Способы борьбы донельзя простые: приклеить к металлическому «флажку»; вставить в металлическую трубку; приклеить к контролируемому объекту; радикально снизить частоту опроса.



Попутно разбираюсь с макеткой PinBoard: вполне позитивные впечатления. Код на микро-Паскале:

program OneWire;

// LCD module connections
var LCD_RS : sbit at PORTD2_bit;
var LCD_EN : sbit at PORTD3_bit;
var LCD_D4 : sbit at PORTD4_bit;
var LCD_D5 : sbit at PORTD5_bit;
var LCD_D6 : sbit at PORTD6_bit;
var LCD_D7 : sbit at PORTD7_bit;

var LCD_RS_Direction : sbit at DDD2_bit;
var LCD_EN_Direction : sbit at DDD3_bit;
var LCD_D4_Direction : sbit at DDD4_bit;
var LCD_D5_Direction : sbit at DDD5_bit;
var LCD_D6_Direction : sbit at DDD6_bit;
var LCD_D7_Direction : sbit at DDD7_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 TEMP_RESOLUTION : byte = 12; {DS18B20}

var text : array[9] of char;
    temp : word;

procedure Display_Temperature( temp2write : word );
const RES_SHIFT = TEMP_RESOLUTION - 8;

var temp_whole : byte;
    temp_fraction : word;

  begin
    text := '000.0000';
    // check if temperature is negative
    if (temp2write and 0x8000) then
      begin
        text[0] := '-';
        temp2write := not temp2write + 1;
      end;

    // extract temp_whole
    temp_whole := word(temp2write shr RES_SHIFT);

    // convert temp_whole to characters
     if ( temp_whole div 100 ) then
         text[0] := temp_whole div 100  + 48
    else
       text[0] := '0';

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

    // extract temp_fraction and convert it to unsigned int
    temp_fraction  := word(temp2write shl (4 - RES_SHIFT));
    temp_fraction  := temp_fraction and 0x000F;
    temp_fraction  := temp_fraction * 625;

    // convert temp_fraction to characters
    text[4] := word(temp_fraction div 1000) + 48;         // Extract thousands digit
    text[5] := word((temp_fraction div 100)mod 10 + 48);     // Extract hundreds digit
    text[6] := word((temp_fraction div 10)mod 10 + 48);     // Extract tens digit
    text[7] := word(temp_fraction mod 10) + 48;         // Extract ones digit

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

begin
  text := '000.0000';
  Lcd_Init();                                    // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                           // Clear LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                      // Turn cursor off
  Lcd_Out(1, 1, ' Temperature:   ');

  Lcd_Chr(2,13,223);                             // Print degree character, 'C' for Centigrades
                                                 // different LCD displays have different char code for degree
  Lcd_Chr(2,14,'C');                             // if you see greek alpha letter try typing 178 instead of 223

  //--- main loop
  while (TRUE) do
    begin
      //--- perform temperature reading
      Ow_Reset(PORTB, 2);                        // Onewire reset signal
      Ow_Write(PORTB, 2, 0xCC);                  // Issue command SKIP_ROM
      Ow_Write(PORTB, 2, 0x44);                  // Issue command CONVERT_T
      Delay_ms(750);
      Ow_Reset(PORTB, 2);
      Ow_Write(PORTB, 2, 0xCC);                  // Issue command SKIP_ROM
      Ow_Write(PORTB, 2, 0xBE);                  // Issue command READ_SCRATCHPAD
      Delay_ms(400);

      temp :=  Ow_Read(PORTB, 2);
      temp := (Ow_Read(PORTB, 2) shl 8) + temp;

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

      Delay_ms(3000);
    end;
end.

Комментариев нет:

Отправить комментарий

Ваш комментарий откроется после проверки и подтверждения.
Благодарю за понимание необходимости проверки!