Picproje Elektronik Sitesi

DERLEYİCİLER => MikroC - PIC => Konuyu başlatan: alperyazir - 19 Şubat 2012, 00:43:41

Başlık: micro c de ds1302 kullanımı
Gönderen: alperyazir - 19 Şubat 2012, 00:43:41
ü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?
Başlık: Ynt: micro c de ds1302 kullanımı
Gönderen: pwm.c - 19 Şubat 2012, 09:01:49
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.
Başlık: Ynt: micro c de ds1302 kullanımı
Gönderen: pwm.c - 19 Şubat 2012, 09:21:15
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);
}
// *****************************************************************
Başlık: Ynt: micro c de ds1302 kullanımı
Gönderen: alperyazir - 19 Şubat 2012, 16:15:04
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?