mikroc derleyicide ds1302 uygulamasını derleyemiyorum sorun nerde??

Başlatan malpaslan1979, 28 Aralık 2010, 20:12:14

malpaslan1979

Mikroc dilinde yapılmış ds1302 uygulamasını derlemeye çalışıyorum. Aşağıdaki komut diziliminde hata nerde acaba? C dilini bildiğim söylenemez hazır kodu hex haline getirmek istiyorum. picprogramlama teknikleri ve 16f877a kitabından aldım bu kodları...




// *****************************************************************
// 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);
}
// *****************************************************************

malpaslan1979

Değerli dostlar gördüğünüz herhangi bir eksiklik yok mu?

ErsinErce

char *str="  \0";
void BintoStr(char data)


Kısmını

unsigned char str[2];
void BintoStr(unsigned char data)


olarak değiştirip bir deneyin

malpaslan1979

Alıntı yapılan: cynetron - 29 Aralık 2010, 01:06:07
char *str="  \0";
void BintoStr(char data)


Kısmını

unsigned char str[2];
void BintoStr(unsigned char data)


olarak değiştirip bir deneyin

Değerli cynetron bahsettiğiniz değişikliği yaptım fakat değişen birşey yok. Anlamadığım şey şu çalışmayan kodlar kitaplara nasıl konuyor! Kitabın amacı eğitim olmasa sorun değil...

FEHMİ_ASM

Arkadaşlar ben bu kitapta asm dilindeki hemen hemen tüm programlar için proje dosyası oluşturdum ancak modifiye etmeden neredeyse hiçbir program çalışmıyor yada eksik çalışıyor. Kitabın anlatımı çok güzel ama hedeflenen çalışmanın sadece temel parametreleri yazılmış, sonuçlanması için gereken ara programlar, bazı donanım komutları (vs.) yok. Bilginize..
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

malpaslan1979



// *****************************************************************
// 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);
}
// *****************************************************************

Alıntı yapılan: malpaslan1979 - 29 Aralık 2010, 07:12:42
Alıntı yapılan: cynetron - 29 Aralık 2010, 01:06:07
char *str="  \0";
void BintoStr(char data)


Kısmını

unsigned char str[2];
void BintoStr(unsigned char data)


olarak değiştirip bir deneyin

Değerli cynetron bahsettiğiniz değişikliği yaptım fakat değişen birşey yok. Anlamadığım şey şu çalışmayan kodlar kitaplara nasıl konuyor! Kitabın amacı eğitim olmasa sorun değil...

KONU GÜNCELDİR... SORUN NEREDE BEN BİR TÜRLÜ DERLEYEMEDİM BU KODLARI

ahmet2004


sigmoid

Ben kodları MikroC Pro V4.15 te derleyemedim. main fonksiyonu bulunamadı gibi bir hata veriyor. Zaten en son mikroC 8.1 deki buglardan gına gelmişti. float iki sayıyı çarpamıyor.

877A kitabı gayet güzel. Ama mikroc için aynı şeyleri söyleyemem. Yeni başlayan biri içindeki hazır kütüphaneler nedeniyle çok hızlı yol alır. Ama öyle bir noktada salakca bir hata verirki resmen düz duvara toslarsınız.

MikroC nin avantajları
+ Geniş kod örneği
+ Yardım dosyasında örnek devre şemaları olması
+ Geniş kütüphane desteği
+ yeni başlayan biri çok çabuk ilerleyebilir.

Dezavandajları
- Hiç AnsiiC standartına uygun değil, kodunuzu başka bir c derleyicisine taşıyamıyorsunuz. veya başka bir derleyiciden mikroc ye taşınmıyor.
- Kütüphanelerinin kapalı olması
- Bir noktadan sonra insanı yolda bırakıyor.
- Çok buglı, float sayıları çarpabildiğini görmedim.
- Çok fazla kod üretiyor.
- Size esneklik sağlamıyor.

kısacası amatörler ve öğrenciler için iyidir, kısa sürede proje yapabilirsiniz. Ama profesyonel düşünüyorsanız hiç mikroc  ye yaklaşmayın derim. HitechC kullanmanızı öneririm. Hitechc için fxdev'in kitabını tavsiye ederim.

malpaslan1979

Alıntı yapılan: abdullaho - 29 Aralık 2010, 14:24:45
Ben kodları MikroC Pro V4.15 te derleyemedim. main fonksiyonu bulunamadı gibi bir hata veriyor. Zaten en son mikroC 8.1 deki buglardan gına gelmişti. float iki sayıyı çarpamıyor.

877A kitabı gayet güzel. Ama mikroc için aynı şeyleri söyleyemem. Yeni başlayan biri içindeki hazır kütüphaneler nedeniyle çok hızlı yol alır. Ama öyle bir noktada salakca bir hata verirki resmen düz duvara toslarsınız.

MikroC nin avantajları
+ Geniş kod örneği
+ Yardım dosyasında örnek devre şemaları olması
+ Geniş kütüphane desteği
+ yeni başlayan biri çok çabuk ilerleyebilir.

Dezavandajları
- Hiç AnsiiC standartına uygun değil, kodunuzu başka bir c derleyicisine taşıyamıyorsunuz. veya başka bir derleyiciden mikroc ye taşınmıyor.
- Kütüphanelerinin kapalı olması
- Bir noktadan sonra insanı yolda bırakıyor.
- Çok buglı, float sayıları çarpabildiğini görmedim.
- Çok fazla kod üretiyor.
- Size esneklik sağlamıyor.

kısacası amatörler ve öğrenciler için iyidir, kısa sürede proje yapabilirsiniz. Ama profesyonel düşünüyorsanız hiç mikroc  ye yaklaşmayın derim. HitechC kullanmanızı öneririm. Hitechc için fxdev'in kitabını tavsiye ederim.

Yukarıda yazdıklarının hepsini biliyorum değerli dostum bende proje bazlı düşünmüştüm yani hazır kodlar zaten var maksat programı yükleyelim çalıştıralım kısa yoldan hedefe ulaşalım neyse hayırlısı artık ne diyelim....

sigmoid

Şimdi aklıma geldi de, MikroC'nin son versiyonunun library fonksiyonlarında bazı değişiklikler yapmışlardı. Örneğin lcd pin tanımlamalarını artık programın yukarısında yapmak gerekiyor. MicroC nin helpine göre lcd ve i2c fonksiyonları yeniden yazmak gerekli, ancak o zaman kitaptaki kodlar çalışır. MikroC yi pek tercih etmesemde arkadaşların basit ihtiyacları için helpten copy+paste şeklinde kullanıyorum.

mikroe sitesinde RTC boardu da satıyor, Examplelar herkese açık :D Ençok mikroe nin örneklerinin herkese açık olmasını seviyorum.

microsi

ben de ds1307 kullanarak aldığım kodu microc kullanarak proteusda simüle ettim fakat saat yavaş ilerliyo acaba nedeni nedir. yardımcı olursanız sevinirim teşekkürler. kod şöyle.. yardımalarınız için teşekkürler..


unsigned short hh;
unsigned short mm;
unsigned short ss;




void write_DS1307(unsigned short address, unsigned short data)
{
   unsigned short status;
   I2C_Start();
   I2C_Wr(0xd0);
   I2C_Wr(address);
   I2C_Wr(data);
   I2C_Stop();
}

unsigned short read_DS1307(unsigned short address)
{
   unsigned short data;
   I2C_Start();
   I2C_Wr(0xd0);
   I2C_Wr(address);
   I2C_Repeated_Start();
   I2C_Wr(0xd1);
   data=I2C_Rd(0);
   while (!I2C_Is_Idle()) asm nop;
   I2C_Stop();
   return(data);
}


void main(){
  PORTB = 0;
  TRISB = 0;
  TRISC.F3=1;
  TRISC.F4=1;
  PORTD=0;
  TRISD=0X0F;
  hh = 0;
  mm = 0;
  ss = 0;
   




  Lcd_Init(&PORTB);
  Lcd_Out(1,1,"saat:");
  Lcd_Cmd(LCD_CURSOR_OFF);
  I2C_Init(100000); //DS1307 operates at 100Khz only


 
  ss=read_ds1307(0);
  write_ds1307(0, ss & 0x7F); // enable oscillator(bit 7 =0)

  ss=read_ds1307(2);
  write_ds1307(2, ss & 0b10111111); // set 24H mode

 



   while(1)
   {
     ss=read_ds1307(0);   // read second
     mm=read_ds1307(1);   // read minute
     hh=read_ds1307(2);  // read hour
     /*
     day=read_ds1307(3);   // read day
     date=read_ds1307(4);  // read date
     month=read_ds1307(5); // read month
     year=read_ds1307(6);  // read year
     */

     Lcd_Chr(1,6, 48+ ((hh & 0b00110000) >> 4));
     Lcd_Chr(1,7, 48+ (hh & 0b00001111) );

     Lcd_Chr(1,8, ':');

     Lcd_Chr(1,9, 48+ ((mm & 0b01110000) >> 4));
     Lcd_Chr(1,10, 48+ (mm & 0b00001111) );

     Lcd_Chr(1,11, ':');

     Lcd_Chr(1,12, 48+ ((ss & 0b01110000) >> 4));
     Lcd_Chr(1,13, 48+ (ss & 0b00001111) );

 
  delay_ms(1000);
  }
}

bahri_enis

Çok geç kaldım ama yine de hatayı söleyim...
data yazan yerleri dataa diye yazarsan sorunun çözülür ;)
İyi çalışmalar...

muratyamak10

arkadaşım bende o programları yazıyorum asm dilindekiler bir kaçı hariç çalışıyor c dilindekiler de bir kaçı hariç anormal çalışıyor
bende eski bir micro c derleyicisi var 8.1 istersen sana verebilirim.bendeki abuk subuk çalıştı istersen hataları birlikte bulalım:)))