üstadlar elimde şuan pic16f628a var ve basitte olsa bir saat uygulaması yapmak istiyorum. bunun için ds1302 entegresini kullanmam gerektiğini öğrendim ama nasıl kullanacağımı bilmiyorum. bu konuda yardım edebilirmisiniz?
DS1307 ile yapılmış MikroC örneği buldum. belki yarar işine.
http://picnote.blogspot.com/2009/01/simple-clock-using-ds1307-pic16f877a.html (http://picnote.blogspot.com/2009/01/simple-clock-using-ds1307-pic16f877a.html)
ayrıca bu sitede çok sayıda mikroc örneği bulunuyor. incelemende fayda var.
sanırım aradığın kod bu:
// *****************************************************************
// Dosya Adı : 14_4.c
// Açıklama : DS1302 RTC
// Notlar : Proteus programı simülasyonu
// : XT ==> 4 MHz
// *****************************************************************
//------------------------------------------------------------------
// DS1302'nin mikrodenetleyiciye bağlantıları tanımlanıyor
//------------------------------------------------------------------
#define ds1302 PORTC
#define ds1302_tris TRISC
#define rst_pin F0
#define clk_pin F1
#define data_pin F2
//------------------------------------------------------------------
// DS1302'nin mikrodenetleyiciye bağlantıları tanımlanıyor
//------------------------------------------------------------------
unsigned char saniye, dakika, saat, gun, ay, yil, haftaningunu;
char *str=" \0";
//------------------------------------------------------------------
// Hexadesimal değeri LCD'de görüntülemek için text'e dönüştürür.
//------------------------------------------------------------------
void BintoStr(char data)
{
str[0]= 48 + ((data & 0xF0) >> 4); // En değerli dört bit ve
str[1]= 48 + (data & 0x0F); // en değersiz dört bit
// text'e dönüştürüldü
}
//------------------------------------------------------------------
// DS1302'nin mikrodenetleyiciye bağlantıları tanımlanıyor
//------------------------------------------------------------------
void init_3wire()
{
// ds1302'ye bağlanan pinler yönlendiriliyor.
ds1302_tris.data_pin = 0;
ds1302_tris.rst_pin = 0;
ds1302_tris.clk_pin = 0;
// ds1302'ye bağlanan pinler LOW seviyesine çekiliyor
ds1302.data_pin = 0;
ds1302.rst_pin = 0;
ds1302.clk_pin = 0;
}
//------------------------------------------------------------------
// DS1302'nin mikrodenetleyiciye bağlantıları tanımlanıyor
//------------------------------------------------------------------
void reset_3wire()
{
// ds1302 resetleniyor
ds1302.clk_pin = 0;
ds1302.rst_pin = 0;
ds1302.rst_pin = 1;
}
//------------------------------------------------------------------
// DS1302'nin mikrodenetleyiciye bağlantıları tanımlanıyor
//------------------------------------------------------------------
void write_byte_3wire(unsigned char veri)
{
unsigned char i;
// data pini çıkışa yönlendiriliyor.
ds1302_tris.data_pin = 0;
for(i = 0; i < 8; ++i)
{
// Verinin 0. biti 1 ise data_pin HIGH, 0 ise LOW seviyesine
// çekiliyor.
if(veri.F0) ds1302.data_pin = 1; else ds1302.data_pin = 0;
// Saat darbesi uygulanıyor. (yükselen kenar)
ds1302.clk_pin = 0;
ds1302.clk_pin = 1;
veri = (veri>>1); // Veri 1 bit sağa kaydırılıyor.
}
}
//------------------------------------------------------------------
// DS1302'nin mikrodenetleyiciye bağlantıları tanımlanıyor
//------------------------------------------------------------------
unsigned char read_byte_3wire()
{
unsigned char i, veri;
// data pini veri okumak için girişe yönlendiriliyor.
ds1302_tris.data_pin = 1;
veri = 0x00; // Verinin ilk değeri sıfır
for(i=0; i<8; ++i)
{
// 1 bit okumak için saat darbesi uygulanıyor
ds1302.clk_pin = 1;
ds1302.clk_pin = 0;
veri >>= 1; // veri bir bit sağa kaydırılıyor.
// ds1302'nin data_pininden gene veri 1 ise verinin 7. biti 1
// yapılıyor, aksi durumda verinin 7. biti 0 yapılıyor.
if(ds1302.data_pin) veri.F7 = 1; else veri.F7 = 0;
}
return veri; // okunan veriyi fonksiyon dışına taşı
}
//------------------------------------------------------------------
// DS1302'ye tarih, saat ve haftanın günü bilgisi yazılıyor ve
// batarya şarj devresi tespit ediliyor.
//------------------------------------------------------------------
void DS1302_Init()
{
init_3wire(); // 3 yol iletişimi kullanıma hazırla
reset_3wire(); // 3 yol iletişimi resetle
write_byte_3wire(0x8E); // kontrol kaydedicisine erişim
// sağlanıyor
write_byte_3wire(0); // Yazma koruması kaldırılıyor.
reset_3wire(); // 3 yol iletişimi resetle
write_byte_3wire(0x90); // trickle charger kaydedicisine
// erişim sağlanıyor
write_byte_3wire(0xAB); // 8 Kohm direnç üzerinden 2
// diyotlu şarj birimi seçildi
reset_3wire(); // 3 yol iletişimi resetle
write_byte_3wire(0xBE); // sıralı 8 adet kaydediciye
// yazılacağı belirtiliyor.
write_byte_3wire(saniye); // saniye bilgisini yaz
write_byte_3wire(dakika); // dakika bilgisini yaz
write_byte_3wire(saat); // saat bilgisini yaz
write_byte_3wire(gun); // gun bilgisini yaz
write_byte_3wire(ay); // ay bilgisini yaz
write_byte_3wire(haftaningunu); // haftanın günü bilgisini yaz
write_byte_3wire(yil); // yıl bilgisini yaz
write_byte_3wire(0); // Kontrol kaydedicisine 0 bilgisi yaz
reset_3wire(); // 3 yol iletişimi resetle
}
//------------------------------------------------------------------
// DS1302'den zaman bilgisi okunuyor.
//------------------------------------------------------------------
void DS1302_ReadTime()
{
reset_3wire(); // 3 yol iletişimi resetle
// DS1302'den sıralı saat ve tarih bilgisi okuma başlatılıyor
write_byte_3wire(0xBF);
saniye = read_byte_3wire(); // saniye bilgisini oku
dakika = read_byte_3wire(); // dakika bilgisini oku
saat = read_byte_3wire(); // saat bilgisini oku
gun = read_byte_3wire(); // gun bilgisini oku
ay = read_byte_3wire(); // ay bilgisini oku
haftaningunu = read_byte_3wire();// haftanın günü bilgisini oku
yil = read_byte_3wire(); // yil bilgisini oku
reset_3wire(); // 3 yol iletişimi resetle
}
//------------------------------------------------------------------
// DS1302'den daha tarih, saat ve haftanın günü bilgisini LCD'de
// görüntüler.
//------------------------------------------------------------------
void Display_Time()
{
LCD_Out(1,1,"Tarih="); // 1.satır, 1.karakterden yazmaya başla
BintoStr(gun); // gün bilgisini text'e dönüştür
LCD_Out_Cp(str); // ve imlecin bulunduğu yerden
// başlayarak yaz
LCD_Out_Cp("-"); // - işareti imlecin bulunduğu yerden
// başlayarak yaz
BintoStr(ay); // ay bilgisini text'e dönüştür
LCD_Out_Cp(str); // ve imlecin bulunduğu yerden
// başlayarak yaz
LCD_Out_Cp("-"); // - işareti imlecin bulunduğu yerden
// başlayarak yaz
LCD_Out_Cp("20"); // yılın ilk 2 hanesini imlecin
// bulunduğu yerden başlayarak yaz
BintoStr(yil); // yil bilgisini text'e dönüştür
LCD_Out_Cp(str); // ve imlecin bulunduğu yerden
// başlayarak yaz
LCD_Out(2,1,"St="); // 2.satır, 1.karakterden yazmaya başla
BintoStr(saat); // saat bilgisini text'e dönüştür
LCD_Out_Cp(str); // ve imlecin bulunduğu yerden
// başlayarak yaz
LCD_Out_Cp(":"); // : işareti imlecin bulunduğu yerden
// başlayarak yaz
BintoStr(dakika); // dakika bilgisini text'e dönüştür
LCD_Out_Cp(str);
LCD_Out_Cp(":"); // : işareti imlecin bulunduğu yerden
// başlayarak yaz
BintoStr(saniye); // saniye bilgisini text'e dönüştür
LCD_Out_Cp(str);
LCD_Out_Cp(" "); // 2 karakter boşluk imlecin bulunduğu
// yerden başlayarak yaz
switch(haftaningunu) // haftanın gününü LCD'de görüntüler
{
case 1: LCD_Out_Cp("PTS");break; // haftanın günü 1 ise
// PAZARTESİ
case 2: LCD_Out_Cp("SAL");break; // haftanın günü 2 ise
// SALI
case 3: LCD_Out_Cp("CAR");break; // haftanın günü 3 ise
// ÇARŞAMBA
case 4: LCD_Out_Cp("PER");break; // haftanın günü 4 ise
// PERŞEMBE
case 5: LCD_Out_Cp("CUM");break; // haftanın günü 5 ise
// CUMA
case 6: LCD_Out_Cp("CTS");break; // haftanın günü 6 ise
// CUMARTESİ
case 7: LCD_Out_Cp("PAZ");break; // haftanın günü 7 ise
// PAZAR
}
}
//------------------------------------------------------------------
// LCD ve DS1302 RTC birimini kullanıma hazırlar.
//------------------------------------------------------------------
void init()
{
// LCD bağlantısı tanımlanıyor
LCD_Config(&PORTB,4,5,7,3,2,1,0);
LCD_Cmd(LCD_CURSOR_OFF); // imleci gizle
saniye = 0x50;
dakika = 0x59;
saat = 0x23;
gun = 0x27;
ay = 0x04;
yil = 0x06;
haftaningunu = 0x04; // Perşembe
DS1302_Init();
}
//------------------------------------------------------------------
// Ana program DS1302 saat entegresine bir tarih ve saat bilgisi
// yazar. Daha sonra tarih, saat ve haftanın gününü sürekli okuyarak
// LCD ekranda görüntüler.
//------------------------------------------------------------------
void main()
{
init();
do
{
DS1302_ReadTime();
Display_Time();
} while(1);
}
// *****************************************************************
kusura bakmayın yüzsüzlük ediyor gibi olmasın ama eğer elinizde varsa bu kodun kullanıldıgı isis şemasınıda ekler misiniz?