Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

DS18B20 7seg aktarım

Başlatan Mr.Java, 11 Mart 2013, 20:30:43

Mr.Java

Arkadaşlar merhaba.7Seg displaylara ds18b20 aktarmaya çalışıyorum fakat bir türlü yapamadım.Mikroc kütüphanesini kullanıyorum 18B20 için.Yaptığımda displaylerde 0000 yanıp yanıp sönüyor sadece.Bu arada RA1 pinine bağlı sensör.

//  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
//  18S20: 9  (default setting; can be 9,10,11,or 12)
//  18B20: 12
#include "BoardConfig.h"
#define display_1 0
#define display_2 1
#define display_3 2
#define display_4 3
uchar dis_num[4];
uchar dizi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

void display_goster(void)
{
     uchar i,j,k;
     RA3=0;
     for(j=0;j<50;j++)
     for(k=0x80,i=0;i<4;i++)
     {
      RC4=1;
      portd=k;
      RC4=0;
      RC3=1;
      PORTD=dizi[DIS_NUM[i]];
      RC3=0;
      k>>=1;
      delay_MS(2);
      RC4=1;
      PORTD=0X00;
      RC4=0;
      delay_MS(2);
     }
}
const unsigned short TEMP_RESOLUTION = 12;

char *text = "00.00";
unsigned temp;

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;
  else
     text[0] = '0';

  text[1] = (temp_whole/10)%10;          //Onlar basamağı
  text[2] =  temp_whole%10;             // Birler basamağı

  // Extract temp_fraction and convert it to unsigned int
  temp_fraction  = temp2write << (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;
  text[4] =  temp_fraction/1000;         // Yüzler basamağı
  text[5] = (temp_fraction/100)%10;      // Binler basamağı

  DIS_NUM[display_1]=(uchar)text[1];
  DIS_NUM[display_2]=(uchar)text[2];
  DIS_NUM[display_3]=(uchar)text[4];
  DIS_NUM[display_4]=(uchar)text[5];
  display_goster();


}


void main() {
  Board_Ayar();
  TRISA=0b00000010;
  PORTA=0;
  CMCON |=7;

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

    Ow_Reset(&PORTA, 1);
    Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 1, 0xBE);                   // Issue command READ_SCRATCHPAD

    temp =  Ow_Read(&PORTA, 1);
    temp = (Ow_Read(&PORTA, 1) << 8) + temp;

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

    Delay_ms(500);
  } while (1);
}

haydarpasamikro

CMCON= 7 yaparak sadece comparator birimini pasif yapmışsınız. RA pinleri aynı zamanda analog giriş. Bu sebeple portu dijitale getirmeniz gerek.

ADCON1 = 7 yazın altına. Tüm A ve E portları dijital maksatlı kullanılacak gibi.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Mr.Java

#2
Hay allah nasıl göremedim ben onu :D Teşekkürler.Fakat displayda bu defa yanıp yanıp sönüyor bilgi sürekli.Benim yapmak istediğim sadece displayda 21.3C olarak göstermek.

mesaj birleştirme:: 11 Mart 2013, 21:01:26

Tamam onuda çözüm en altta delay'ı fazla vermişisiz.Teşekkürler.Umarım birilerine yardımcı olur bu kodlar.
Son bir sorum olacak.Nem nasıl okuyacağız bunda.Diyelim ki displayda 10sn sıcaklık 10sn nem göstermek istiyorum.Olabilir mi ?

haydarpasamikro

SHT11 hem nem hem de ısı veriyor. Birçok örnekleri var. LCD de uygulamaları çok.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Mr.Java

Teşekkürler.Onuda deneriz.Bu sensörde kafama takıldı.Sıcaklık atıyorum 21,5 ise bende 2150 olarak gösteriyor.Display ve sıcaklık tanımlamamda yüzler basamağındaki anotlarıda belirlememe rağmen sıcaklık 2150 olarak gösteriyor.Ben 21.5C olarak göstermek istiyorum ne yapmam lazım ?

haydarpasamikro

7-Segment displayin nokta, h(dp) segmentini sürmeniz lazım nokta(.) için. En sağ display bilgisi  için ise C çıksın istiyorsak C ye karşılık gelen 7-segment değerini(a,d,e,f) segmentlerini siz sürmeniz lazım.Yani kodda biraz düzenleme lazım
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Mr.Java

Sorum şöyle ki;
C harfinin karşılığını dizide belireyip çağırıyorum zaten lakin displaylarda kaydırma yöntemi kullandığım için harf şekilsiz çıkıyor.

2.sorum ise 7segment dizi için tüm tanımlamalarım ortak anota göre belirlememe rağmen (.) işareti çıkmıyor ?

Mr.Java

Tamam noktayıda hallettik fakat C işaretini ne yaptıysam yapamadım.Kodun en son
ki çalışır hali.. Sadece C harfi kaldı..

//DS18B20 Dijital Sensör uygulamam.
//  18S20: için 9
//  18B20: için 12
#include "BoardConfig.h"
#define display_1 0
#define display_2 1
#define display_3 2
#define display_4 3
uchar dis_num[4];
uchar dizi[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xC6};

void display_goster(void)
{
     uchar i,j,k;
     RA3=0;
     for(j=0;j<50;j++)
     for(k=0x80,i=0;i<4;i++)
     {
      RC4=1;
      portd=k;
      RC4=0;
      RC3=1;
      if(i==1)PORTD=dizi[DIS_NUM[i]]&0x7f;
      else PORTD=dizi[DIS_NUM[i]];

      RC3=0;
      k>>=1;
      delay_MS(2);
      RC4=1;
      PORTD=0X00;
      RC4=0;
      delay_MS(2);
     }
}
const unsigned short TEMP_RESOLUTION = 12;

char *text = "00.00";
unsigned temp;

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

  // Sıcaklık Negatif mi ?
  if (temp2write & 0x8000) {
     text[0] = '-';
     temp2write = ~temp2write + 1;
     }

  // Tam değer elde ediliyor
  temp_whole = temp2write >> RES_SHIFT ;

  // Dönüştürme safası.
  if (temp_whole/100)
     text[0] = temp_whole/100;
  else
     text[0] = '0';

  text[1] = (temp_whole/10)%10;          //Onlar basamağı
  text[2] =  temp_whole%10;             // Birler basamağı

  // Display için sıcaklık bilgileri dönüştürülüp displaye basılıyor.
  temp_fraction  = temp2write << (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;
  text[4] =  temp_fraction/1000;         // Yüzler basamağı
  text[5] = (temp_fraction/100)%10;      // Binler basamağı

  DIS_NUM[display_1]=(uchar)text[1];
  DIS_NUM[display_2]=(uchar)text[2];
  DIS_NUM[display_3]=(uchar)text[4];
  DIS_NUM[display_4]=(uchar)text[5];
  display_goster();


}


void main() {
  Board_Ayar();
  TRISA=0b00000010;
  PORTA=0;
  ADCON1 = 7;
  CMCON |=7;

  //--- Main loop
  do {
    //--- Perform temperature reading
    Ow_Reset(&PORTA, 1);
    Ow_Write(&PORTA, 1, 0xCC);
    Ow_Write(&PORTA, 1, 0x44);
    Delay_us(120);

    Ow_Reset(&PORTA, 1);
    Ow_Write(&PORTA, 1, 0xCC);
    Ow_Write(&PORTA, 1, 0xBE);

    temp =  Ow_Read(&PORTA, 1);
    temp = (Ow_Read(&PORTA, 1) << 8) + temp;


   
    Display_Temperature(temp);

    Delay_ms(5);
  } while (1);
}

haydarpasamikro

display göster fonks. içinde i 0,1,2,3 olabiliyor. Bu da display basamağını saydırıyor. Eğer basamak birer ise ki i =3 olmalı, eğer i=3 ise değeri değilde C karakter kodunu D portuna aktarın.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Mr.Java

Konu çözüldü teşekkürler.