14 Temmuz 2015 Salı

GERÇEK ZAMANLI AYARLANABİLİR SAAT-TARİH VE SICAKLIK GÖSTERGESİ

     Evet arkadaşlar, bu yazımızda Philips firmasının ürettiği PCF8583  gerçek zaman entegresi ve Dallas firmasının ürettiği DS18B20 sıcaklık sensörünün register yapılarını ve bunların PIC mikrodenetleyiciler ile kullanımını göreceğiz.
     PCF8583  2048 bit'lik statik CMOS RAM belleği bulunan saat ve takvim entegresidir. Entegrenin RAM'i 8 bit'lik 256 byte'lık yapıya sahiptir. Adres ve data iki hat üzerinden ve çift yönlü I2C seri iletişim protokolüyle yapılır. Her bir okuma ve yazmadan sonra adres registeri otomatik olarak artar . Böylece bir sonra ki okuma yada yazma işlemi sıradaki register için yapılır. Yapısında dahili 32.768kHz'lik osilatör devresi bulunmaktadır. RAM'ın ilk 8 byte'ı saat, takvim ve sayıcı fonksiyonları için ayrılmıştır. Sonraki 8 byte boş RAM alanı veya alarm registeri olarak programlanabilir. Geriye kalan 240 byte ise boş RAM alanıdır. Yani toplamda entegrenin 256 byte'lık RAM'i vardır.
     PCF8583 entegresi I2C (Inter-Integrated-Circuit) iletişim protokolünü kullanarak çalışmaktadır. I2C iletişiminde sadece SDA (Serial Data Line) ve SCA (Serial Clock Line) olmak üzere iki hat bulunmaktadır. Bu hatlar pull-up dirençlerine ihtiyaç duymaktadır.

     Aşagıda entegrenin pin konfigürasyonu yer almaktadır.
     OSCI: Osilatör girişi,
     OSCO; Osilatör çıkışı (OSCI ve OSCO pinlerine 32.768kHz kristal bağlanır.),
     VSS:  Kaynak voltajının toprağı,
     SDA:  Seri data hattı,
     SCA:  Seri clock hattı,
     INT:   Kesme çıkışı,
     VDD: Kaynak voltajı.
                                                                                 
                                                                                                                       
 
  Yandaki şekilde PCF8583 ün register düzeni görülmektedir. Görüldüğü üzere, içinde saat ve tarih bilgilerinin saklandığı 8 adet register bulunmaktadır. 00 adresindeki register control/statüs registerıdır. Bu registerın bitleri,
      Bit 0    : timer bayragı
      Bit 1    : alarm bayragı
      Bit 2    : alarm etkinleştirme biti
      Bit 3    : mask bayragı
      Bit 4-5 : Fonksiyon modu seçim bitleri
      Bit 6    : son sayım bayragı
      Bit 7    : sayımı durdurma bayragı
                             
   Tarih ve saat registerlarında aşağıda tablodaki değerler yer almaktadır.          

hundredth of a second
00 – 99
seconds
00 – 59
minutes
00 – 59
hours (24h)
00 – 23
hours (12h)
01AM – 12PM
date
01 – 31
month
01 – 12
year
0 – 3
weekdays
0 – 6
timer
00 - 99





         Şimdi counter registerlarından birkaçını inceleyelim.

    PCF8583 ün registerlarının önemli bir kısmını inceledik. Daha detaylı bilgiyi ürün datasheetinden edinebilirsiniz.
   Şimdi de DS18B20 'i inceleyeceğiz. DS18B20 sensörü 9 ila 12 bit çözünürlükte ve -55 ile 125 derece arasında sıcaklık dönüşümü yapan ve one wire üzerinden iletişim sağlayan bir dijital sıcaklık sensörüdür. Ayrıca DS18B20'nin alarm özelliği de vardır.

 Eğer sensör üzerinde herhangi bir ayar yapılmazsa 12 bit çözünürlükte dönüşüm yapılır ve bu dönüşüm 750ms süre içerisinde tamamlanır. 12 bit haricinde 9,10 ve 11 bit çözünürlük çalışmak içinse sensörün bellek haritasını incelememiz gerekecektir.
    
    Ds18b20 nin bellek haritasına baktığımızda görülüyor ki Byte 0-9 aralığında registerlar var. Bu registerların her birinin farklı görevleri vardır. Byte 4 olan Configuration Registeri sensörün hangi çözünürlükte çalışacağını ayarlar. Configuration Register ının 5 ve 6. bitlerine karşılık gelen R0 ve R1 e belirli değerler yüklenerek çözünürlük ayarlanır. Aşağıdaki tabloda R0-R1 değerlerine karşılık çözünürlük değerleri görülmektedir.


     Sensörün okuduğu sıcaklık değeri ise dijital olarak Byte 0 (LS Byte) -Byte 1 (MS Byte) registerlarında saklanır. Byte 0 ve Byte 1 de sıcaklığın işareti, tam kısmı ve ondalıklı kısmı saklıdır. Bit0-3 aralığında sıcaklığın ondalık kısmı, bit4-10 aralığında tam kısmı ve bit10-15 arasındanda işareti belirlenir.


 Byte 0 (LS Byte) -Byte 1 (MS Byte) registerında yer alan digital değerden  gerçek sıcaklık değeri hesaolanır. Aşağıdaki tabloda belirli sıcaklık değerlerine karşılık gelen 16 bitlik dijital değerler görülmektedir. 


     TH ve TL registerları ise alarm için kullanılan registerlardır. Bu ragisterlara yüklenen değerler DS18B20 nin sıcaklık ölçüm sounucu ile karşılaştırılır. Ölçülen sıcaklık değeri TH registerında ki değere eşit yada büyükse veya TL registerındaki değere eşit yada küçükse DS18B20 içinde yer alan alarm bayrağı set olur. 
     PCF8583 saat entegresi ve DS18B20 sıcaklık sensörü hakkında bilgi edindiğimize göre artık projemizden bahsedebiliriz. Projemizde yazacağımız program PCF8583'den saat ve tarih DS18B20'den de sıcaklık  bilgilerini okuyacağız. Daha sonra okuduğumuz bu verileri 7 segment ortak katot displaye yansıtacağız. Bunun için 4 adet display kullanacağız. Displaylari tarayarak dinamik olarak süreceğiz. Ayrıca okuduğumuz verileri displaye yansıtmak ve displayleri taramak için CD4094 shift register lojik entegresini kullanacağız. Birde saat ve tarih ayarlaması yapmak için bir ayar butonumuz olacak.
     Projenin genel devresi aşağıdaki gibidir.

   Devrede isterseniz aşağıdaki PCF8583 RTC modülü de kullanabilirsiniz. Bu modüllerden almak için  mikrohex@outlook.com adresine mail atabilirsiniz.
                  


    CD4094 8-bitlik kaydırmalı kaydedicidir. CD4094 shift register, 8 bit çıkış bilgisini seri olarak tek pin üzerinden bit bit kaydırarak çıkışa transfer eden lojik entegredir. Bu entegrenin içinde data flip-floplar bulunmaktadır. Bir F-F un çıkışı diğer F-F un girişine gelecek şekilde seri bağlanmıştır. Bitleri kaydırma ve saklama bu F-F lar sayesinde gerçekleşir.
     Q1-.....-Q8 çıkış pinleridir. Strobe, Data, Clock ve Output Enable ise girişlerdir. Bu giriş pinlerini açıklayacak olursak;
     DATA: Bu pinden Q çıkışlarına gönderilecek olan 8-bit datanın bitleri sağa doğru kaydırılarak gönderilir.
     CLOCK: Flip-flop lar arasında kaydırma işlemini gerçekleştirmek için bu pinden çıkan kenarlı clock verilmelidir.
     STROBE:  Bu pin F-F ların çıkışlarındaki bilgiyi saklaması içindir. Yani strobe pini lojik 1 olursa shift register 8 bitlik veriyi Q1-......-Q8 çıkışlarına transfer eder. Eğer strobe pini lojik 0 olursa  shift register daha önce ki  8 bitlik veriyi Q1-......-Q8 çıkışlarında saklar.  
     OUTPUT ENABLE: Bu pin ise Q çıkışları ile F-F lar arasında bulunan tri-state buffer ların kontrol ucudur. Genelde bu pin F-F ların çıkışında bulunan bilgilerin Q çıkışlarına iletilmesi için sürekli lojik 1 de tutulur. Lojik 0 da tutulursa iletim olmaz.

   
    Aşağıda çalışma tablosundan data, clock ve strobe uçlarının çalışması daha iyi anlaşılmaktadır.


    PCF8583 e saat ve tarih bilgilerini yazan program

void Write_Time() {
   Soft_I2C_Init();       // Initialize full master mode
   Soft_I2C_Start();      // Issue start signal
   Soft_I2C_Write(0xA0);  // Address PCF8583, see PCF8583 datasheet
   Soft_I2C_Write(0);     // Start from address 0 (configuration memory location)
   Soft_I2C_Write(0x80);  // Write 0x80 to configuration memory location (pause counter...)
   Soft_I2C_Write(0);     // Write 0 to cents memory location
   Soft_I2C_Write(0);     // Write 0 to seconds memory location
   Soft_I2C_Write(0x30);  // Write 0x30 to minutes memory location
   Soft_I2C_Write(0x12);  // Write 0x12 to hours memory location
   Soft_I2C_Write(0x52);  // Write 0x52 to year/date memory location
   Soft_I2C_Write(0x10);  // Write 0x10 to weekday/month memory location
   Soft_I2C_Stop();       // Issue stop signal

   Soft_I2C_Start();      // Issue start signal
   Soft_I2C_Write(0xA0);  // Address PCF8530
   Soft_I2C_Write(0);     // Start from address 0
   Soft_I2C_Write(0);     // Write 0 to configuration memory location (enable counting)
   Soft_I2C_Stop();       // Issue stop signal
}


   PCF8583 den saat-tarih DS18B20 den sıcaklık verilerini okuyan ve bu değerleri tamsayıya dönüştüren program

unsigned short  seconds, minutes, hours, day, month, year;    // Global date/time variables
char temp_whole ;
bit isaret;
// Software I2C connections
sbit Soft_I2C_Scl           at RC3_bit;
sbit Soft_I2C_Sda           at RC4_bit;
sbit Soft_I2C_Scl_Direction at TRISC3_bit;
sbit Soft_I2C_Sda_Direction at TRISC4_bit;
// End Software I2C connections

//--------------------- Reads time and date information from RTC (PCF8583)
void Read_Time() {

  Soft_I2C_Start();               // Issue start signal
  Soft_I2C_Write(0xA0);           // Address PCF8583, see PCF8583 datasheet
  Soft_I2C_Write(2);              // Start from address 2
  Soft_I2C_Start();               // Issue repeated start signal
  Soft_I2C_Write(0xA1);           // Address PCF8583 for reading R/W=1
  
  seconds = Soft_I2C_Read(1);     // Read seconds byte
  minutes = Soft_I2C_Read(1);     // Read minutes byte
  hours = Soft_I2C_Read(1);       // Read hours byte
  day = Soft_I2C_Read(1);         // Read year/day byte
  month = Soft_I2C_Read(0);       // Read weekday/month byte
  Soft_I2C_Stop();                // Issue stop signal
  
}
//--------------------- Reads temperature information from Sensor (DS18B20)
void Read_Temperature(){
    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;

}
//-------------------- Formats date and time
void Transform_Time() {
  seconds  =  ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F);  // Transform seconds
  minutes  =  ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F);  // Transform months
  hours    =  ((hours & 0xF0)  >> 4)*10  + (hours & 0x0F);    // Transform hours
  year     =   (day & 0xC0) >> 6;                             // Transform year
  day      =  ((day & 0x30) >> 4)*10    + (day & 0x0F);       // Transform day
  month    =  ((month & 0x10)  >> 4)*10 + (month & 0x0F);     // Transform month
}

void Transform_Temperature() {
    if (temp & 0x8000) {
    isaret=1;
     temp = ~temp + 1;
     }
     else isaret=0;

 temp_whole= (temp&0x0FFF)>>4;
}

//------------------ Performs project-wide init
void Init_Main() {
  
  Soft_I2C_Init();           // Initialize Soft I2C communication

}

//----------------- Main procedure
void main() {
   ADCON1=0x06;
   delay_ms(500);
   isaret=0;
   Init_Main();               // Perform initialization

  while (1) {                // Endless loop
    Read_Time();             // Read time from RTC(PCF8583)
    Transform_Time();        // Format date and time
  }
}

   Projenin fotoğrafları aşağıdadır.









    İyi günler dilerim...

Hiç yorum yok:

Yorum Gönder