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);
}
// *****************************************************************
Değerli dostlar gördüğünüz herhangi bir eksiklik yok mu?
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
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...
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..
// *****************************************************************
// 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
MikroC v8.2.0.0 da derleyebilirsin.
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.
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....
Ş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.
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);
}
}
Çok geç kaldım ama yine de hatayı söleyim...
data yazan yerleri dataa diye yazarsan sorunun çözülür ;)
İyi çalışmalar...
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:)))