micro c de ds1302 kullanımı

Başlatan alperyazir, 19 Şubat 2012, 00:43:41

alperyazir

ü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?

pwm.c

DS1307 ile yapılmış MikroC örneği buldum. belki yarar işine.
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.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

pwm.c

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);
}
// *****************************************************************
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

alperyazir

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?