O

ds1302

Başlatan ozusar, 05 Ekim 2012, 22:47:39

ozusar

16f877 ve ds1302 kullanarak lcd de gerçek zamanı görmek istedim fakat yüklemiş olduğum resimde de görüldüğü gibi lcd başlangıç ayarlarında kalıyor yazmış olduğum kodda yanlışım nerde yardımcı olursanız çok sevinirim ayrıca resimdeki 2 hata nın da ne anlama geldiğini çözemedm. yardımlarınızı bekliyorum.




#include <16f877.h>     // Kullanılacak denetleyicinin başlık                 // dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>     // LCD.c dosyası programa ekleniyor
#include <DS1302.c>  // DS1302.c dosyası programa ekleniyor

byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu; // byte türünde değişkenler tanımlanıyor

//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   lcd_init();  // LCD başlangıç ayarları yapılıyor
   rtc_init();  // DS1302 başlangıç ayarları yapılıyor

   rtc_set_datetime(05,10,12,6,22,46); // Tarih ve Saat ayarları yapılıyor

   while(1)
   {
      rtc_get_time(saat,dakika,saniye);       // DS1302'den saat,dakika,saniye bilgileri alınıyor
      rtc_get_date(gun,ay,yil,haftanin_gunu); // DS1302'den gün,ay,yil ve günün isim bilgisi alınıyor
      printf(lcd_putc,"\fT:%02d/%02d/20%02d ",gun,ay,yil); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor

      switch(haftanin_gunu)  // DS1302'den sayısal olarak alınan haftanın günü bilgisine
      {                      // metin olarak karşılık atanıyor
         case 1: printf(lcd_putc,"PAZ"); break; // Eğer "1" ise LCD'ye PAZ yaz
         case 2: printf(lcd_putc,"PZT"); break; // Eğer "2" ise LCD'ye PZT yaz
         case 3: printf(lcd_putc,"SAL"); break; // Eğer "3" ise LCD'ye SAL yaz
         case 4: printf(lcd_putc,"CRS"); break; // Eğer "4" ise LCD'ye CRS yaz
         case 5: printf(lcd_putc,"PER"); break; // Eğer "5" ise LCD'ye PER yaz
         case 6: printf(lcd_putc,"CUM"); break; // Eğer "6" ise LCD'ye CUM yaz
         case 7: printf(lcd_putc,"CTS"); break; // Eğer "7" ise LCD'ye CTS yaz
      }
      printf(lcd_putc,"\nSaat:%02d:%02d:%02d",saat,dakika,saniye); // LCD'ye saat,dakika ve saniye değerlerini yaz
      delay_ms(1000); // 1 sn gecikme veriliyor
   }


pwm.c

#1
Arkadaşım, bu forum pic basic üzerine kurulmuş. senin yazılımın ise CCS olarak hazırlanmış.
elimde DS1302 CCS örneği mevcut. buradan indir:
https://yadi.sk/d/Xx_9pAmq34tnyg
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

ete

Bu yüzden ds1302 yerine DS1307 kullanın diyorum.
DS1302 de saniye registerinin 7. Biti saat durdurma bitidir. Bu bit ilk çalıştırmada high olarak start alır. Yani saat ayarı yapılmamış iken bu bit 1dir. Bir olduğu müddetçe de saat yürümez.
Saatin çalışmasını istiyorsanız en azından sn=0 deyip bu değeri sn registerine yazmanız gerekir.

Gelelim senin programa başlangıçta rtc_set_datetime fonksiyonu ile saati ayarladığını sanıyorsun ama bana kalırsa bu fonksiyon saati değil tarih bilgilerini yeniliyor. Saatin, sn , dak ve saat kısmını ayarlayan bir başka fonksiyon olması gerekir diye düşünüyorum. Zira programada bakarsan saat bilgilerini ayrı , tarih bilgilerini ayrı okuyorsun. Eksikliğin burada olsa gerek. Saat bilgilerini değiştirmediğin için saatin stop konumunda bekliyor. Fonksiyon kütüphanesini araştır ve ilgili fonksiyonu bularak programa dahil etmen gerekiyor.

Ete

ozusar

öncelikle kusura bakmayın sadece pic basic olduğunu düşünmemiştim. ama verdiğiniz bilgiler için teşekkür ederim. ama bi sorum var göndermiş olduğunuz ds1302 örneği çalışıyor sıkıntı yok ama pic te osilatör ve ds1302 de kristal olmamasına rağmen çalışıyor simulasyonda bunların önemi yok mu ?

pwm.c

proteusta besleme ve bazı malzemelerin önemi yoktur ama gerçekte mutlaka gereklidir.
senin yazılımdaki sorun ise rtc pin tanımlamalarını yapmamış olabilirsin
#define RTC_SCLK PIN_B1
#define RTC_IO   PIN_B3
#define RTC_RST  PIN_B2
burada görüldüğü gibi default olarak portb 1.,2. ve 3. pinlerini kullanıyor. sen ise rtc yi portc ye bağlamışın. ilgili tanımlamaları en başta yapman lazım.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Powered by EzPortal