DS18B20 sıcaklık sensorlü devrem çalışmıyor.

Başlatan Lithium, 17 Ocak 2018, 17:46:58

Lithium

Merhaba, sorun şu ki;
bu proje simülasyon da çalışmıyor. Önemli olan nerede hata yaptığım, projemin tamamı farklı ama bu kısım hiçbir şekilde çalışmıyor. Olmadı breadboard üzerinde deneyeceğim, belki gerçekte çalışır, aklıma başka çözüm gelmiyor. Çünkü denemediğim örnek kalmadı. Bu en son basitleşmiş hali. Her şey İnternet'te bulduğum örnekler ile neredeyse aynı. indirdiğim örnekler çalışıyor ama benim ki çalışmıyor. Değerli yorumlarınızı ve yardımınızı bekliyorum, şimdiden teşekkürler.

// LCD module connections
sbit LCD_RS at LATD4_bit;
sbit LCD_EN at LATD5_bit;
sbit LCD_D4 at LATD0_bit;
sbit LCD_D5 at LATD1_bit;
sbit LCD_D6 at LATD2_bit;
sbit LCD_D7 at LATD3_bit;

sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_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_RES_B = 12;
const unsigned short TEMP_RES_S = 9;
unsigned short TEMP_RESOLUTION;

char family_code;
char family_code_hex[2];

char *text = "000.0000";
unsigned temp;
char sernum;
char sernum_hex[8];
int i;
int colona;


void Resolution()
     {
      Ow_Reset(&PORTE, 2);                         // Onewire reset signal
      Ow_Write(&PORTE, 2, 0x33);                   // Issue command Read_ROM
      Delay_us(120);

      family_code = Ow_Read(&PORTE, 2);
      bytetohex(family_code, family_code_hex[2]);
      if (family_code_hex[2] == 0x28)
         {
         Lcd_Out(2, 1, "     ");
         Lcd_Out(2, 1, "18B20");
         TEMP_RESOLUTION = Temp_Res_B;
         }
      if (family_code_hex[2] == 0x10)
         {
         Lcd_Out(2, 1, "     ");
         Lcd_Out(2, 1, "18S20");
         TEMP_RESOLUTION = Temp_Res_S;
         }
      if (family_code_hex[2] == 0xFF)
         {
         Lcd_Out(2, 1, "NoID ");
         TEMP_RESOLUTION = 0;
         }
     }


void Display_Temperature(unsigned int temp2write)
     {
     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, 7, text);
     }

void main() {
  ANSELE = 0;                                    // Configure PORTE pins as digital
  TRISE.B2 = 1;                                  // Configure RE2 pin as input

  Lcd_Init();                                    // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                           // Clear LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                      // Turn cursor off

  // Print degree character, 'C' for Centigrades
  Lcd_Chr(2,15,178);                             // 176 ASCII for degree symbol
  Lcd_Chr(2,16,'C');


  // Main loop
  do {

     Resolution();


     //Unique Part Serial Number
     Ow_Reset(&PORTE, 2);                         // Onewire reset signal
     Ow_Write(&PORTE, 2, 0x33);                   // Issue command Read_ROM
     Delay_us(120);

       colona = 17;
       for(i = 0; i <= 7; i++)
          {
            colona = colona - 2;
            sernum = Ow_Read(&PORTE, 2);
            bytetohex(sernum, sernum_hex);
            Lcd_Out(1, colona, sernum_hex);
          }


    // 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);

    Delay_ms(100);
  } while (1);
}