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.
PCF8583 den saat-tarih DS18B20 den sıcaklık verilerini okuyan ve bu değerleri tamsayıya dönüştüren program
Projenin fotoğrafları aşağıdadır.
İyi günler dilerim...
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.
Hiç yorum yok:
Yorum Gönder