Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

ds1302 hatası

Başlatan mcan, 14 Ocak 2006, 02:23:57

mcan

#include <16f84a.h>
#fuses Hs,NOWDT,NOPROTECT
#use delay(clock=4000000)
#byte PORTA = 5
#define use_portb_lcd
#include <lcd2.c>
#include <ds1302a.c>
int rtc_hour, rtc_min, rtc_sec,x,day,mth,year;




void main()
{

rtc_init();
lcd_init();

rtc_set_datetime(12,12,6,2,12,12);

yazdir:{
rtc_get_date(day,mth,year,x);

lcd_gotoxy(1,1);
printf(lcd_putc,"Tarih %2U %2U %2U",day,mth,year);
for(;;)
      {lcd_gotoxy(1,2);
       rtc_get_time(rtc_hour, rtc_min, rtc_sec);
       printf(lcd_putc,"%2u:%2u %2u",rtc_hour, rtc_min, rtc_sec);
       delay_ms(150);
      }}
}


kod bu saati lcd ye yazdırıyor , hata ise  gerek simüle ederken olun gerek gerçek uygulamada lcd de saniye 57 den onra 66 ya fırlıyor ve 100 kadar sayıyor dakikada aynen garip hareketler yapıyor bu ds1302 denmi kaynaklanıyor ccs den mi benden mi? kodda birşey olduğunu sanmıyorum  çünki tek yaptığı şey alıp ekrana aktarmak acaba ccs nin bi yamuğumu var  :D

mcan

ccs de ds1302 ile lcd ye saati yazırabilen vede normal olarak çalıştırabilen varmı,ya sabaha karşı 4 olmasından yada ccs nin hatalı kodundan ben bunu yapamadım yapamıyorum saniye isisde vede gerçekde 57 den 66 ya atlıyor aralarında dönüşüm yaptım hiç bir mantıkda kuramadım deliricem yardım edin lütfen

aYe

Merhaba,

Görünen kod hiç hoş değil, ansi değil..
#include <16f84a.h> 
#fuses Hs,NOWDT,NOPROTECT 
#use delay(clock=4000000) 
#byte PORTA = 5 
#define use_portb_lcd 
#include <lcd2.c> 
#include <ds1302a.c> 
int rtc_hour, rtc_min, rtc_sec,x,day,mth,year; 

void main(void)
{
	rtc_init(); 
	lcd_init();
	rtc_set_datetime(12,12,6,2,12,12); 
	for(;;)
           {
	rtc_get_date(day,mth,year,x);
	lcd_gotoxy(1,1); 
	printf(lcd_putc,"Tarih %2U %2U %2U",day,mth,year);
	rtc_get_time(rtc_hour, rtc_min, rtc_sec);
	lcd_gotoxy(1,2);
	printf(lcd_putc,"%2u:%2u %2u",rtc_hour, rtc_min, rtc_sec);  
           delay_ms(150);
           } 
}

Şeklinde daha temiz gözüküyor ama CCS'in tanımladığı fonksiyonların nasıl çalıştığını bilmediğim için şu yanlış bu doğru diyemiyorum.
DS1320 ile ilgili header'i tekrar oku birşeyi gözden kaçırıyor olabilirsin. Hata derleyicide de olabilir. Benim derleyici seçimiyle ilgili fikrimi zaten biliyorsun. Gerçi başka derleyicide ds1320 yi kullanmak bu kadar basit olmazdı, ds1320nin datasheet'i elinde 10 saat bakar driver yazardin. Gerçi onlari'da bi kere yazinca hep kullaniyorsun. Ben daha önce sadece DS1615'i ve akbil diye bilinen neletleri kullandım. DS1615 Time/Temperature/Event Recorder şeklinde içinde rtc'de var ve ordan referansla diyebilirim ki saniyenin 57 den sonra uçması felan imkansız. Kolay gelsin...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

mcan

ozaman bu ccs de bişey var,zaten kendim hiç kod yazmadım diyebilirim ordaki fonksiyonları alıp bir araya getirdim,oda olmadıysa sanıyorum ccs de bir hata var

buda ds1302 dosyası
//////////////////////////////////////////////////////////////////////////
////                               DS1302.C                           ////
////                     Driver for Real Time Clock                   ////
////                                                                  ////
////  rtc_init()                                   Call after power up////
////                                                                  ////
////  rtc_set_datetime(day,mth,year,dow,hour,min)  Set the date/time  ////
////                                                                  ////
////  rtc_get_date(day,mth,year,dow)               Get the date       ////
////                                                                  ////
////  rtc_get_time(hr,min,sec)                     Get the time       ////
////                                                                  ////
////  rtc_write_nvr(address,data)                  Write to NVR       ////
////                                                                  ////
////  data = rtc_read_nvr(address)                 Read from NVR      ////
////                                                                  ////
//////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services          ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler.  This source code may only be distributed to other     ////
//// licensed users of the CCS C compiler.  No other use, reproduction////
//// or distribution is permitted without written permission.         ////
//// Derivative programs created using this software in object code   ////
//// form are not restricted in any way.                              ////
//////////////////////////////////////////////////////////////////////////

#ifndef RTC_SCLK

#define RTC_SCLK PIN_B1
#define RTC_IO   PIN_B3
#define RTC_RST  PIN_B2

#endif


void write_ds1302_byte(BYTE cmd) {
   BYTE i;

   for(i=0;i<=7;++i) {
      output_bit(RTC_IO, shift_right(&cmd,1,0) );
      output_high(RTC_SCLK);
      output_low(RTC_SCLK);
   }
}

void write_ds1302(BYTE cmd, BYTE data) {

   output_high(RTC_RST);
   write_ds1302_byte(cmd);
   write_ds1302_byte(data);
   output_low(RTC_RST);
}

BYTE read_ds1302(BYTE cmd) {
   BYTE i,data;

   output_high(RTC_RST);
   write_ds1302_byte(cmd);

   for(i=0;i<=7;++i) {
      shift_right(&data,1,input(RTC_IO));
      output_high(RTC_SCLK);
      delay_us(2);
      output_low(RTC_SCLK);
      delay_us(2);
   }
   output_low(RTC_RST);
   return(data);
}

void rtc_init() {
   BYTE x;
   output_low(RTC_RST);
   delay_us(2);
   output_low(RTC_SCLK);
   write_ds1302(0x8e,0);
   write_ds1302(0x90,0xa6);
   x=read_ds1302(0x81);
   if((x & 0x80)!=0)
     write_ds1302(0x80,0);
}

void rtc_set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {
   write_ds1302(0x86,day);
   write_ds1302(0x88,mth);
   write_ds1302(0x8c,year);
   write_ds1302(0x8a,dow);
   write_ds1302(0x84,hr);
   write_ds1302(0x82,min);
   write_ds1302(0x80,0);
}

void rtc_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) {
   day = read_ds1302(0x87);
   mth = read_ds1302(0x89);
   year = read_ds1302(0x8d);
   dow = read_ds1302(0x8b);
}


void rtc_get_time(BYTE& hr, BYTE& min, BYTE& sec) {
   hr = read_ds1302(0x85);
   min = read_ds1302(0x83);
   sec = read_ds1302(0x81);
}

void rtc_write_nvr(BYTE address, BYTE data) {
   write_ds1302(address|0xc0,data);
}

BYTE rtc_read_nvr(BYTE address) {
    return(read_ds1302(address|0xc1));
}


isis simulasyonu


cof dosyası


ds1302 driver dosyası

deneyen olursa sevinicem

Erol YILMAZ

Alıntı yapılan: "encryptedcode"
kod bu saati lcd ye yazdırıyor , hata ise  gerek simüle ederken olun gerek gerçek uygulamada lcd de saniye 57 den onra 66 ya fırlıyor ve 100 kadar sayıyor dakikada aynen garip hareketler yapıyor bu ds1302 denmi kaynaklanıyor ccs den mi benden mi? kodda birşey olduğunu sanmıyorum  çünki tek yaptığı şey alıp ekrana aktarmak acaba ccs nin bi yamuğumu var  :D

DS1302 deki saniye okuma registeri bilgiyi hangi sekli ile barindiriyor? ve CCS nasil okumus ona bakmak lazim. Problemin orada...

mcan

baktımki ds1302 bcd kodu ile saklıyor saati tarihi,demekki ccs nin okuma yazma fonksiyonu tarihi saati bcd den ondalık sayıya çevirmiyor ozamn bunu ben yapmama gerekir ayrı bir yerde, :idea: birde böyle deneyeceğim  teşekkürler erol hocam

mcan

void write_ds1302(BYTE cmd, BYTE data) { 

   output_high(RTC_RST); 
   write_ds1302_byte(cmd); 
   write_ds1302_byte(data); 
   output_low(RTC_RST); 
}


şimdi  bu ve bunun gibi yerlerde  BYTE cmd, BYTE data gibi ifadeler geçiyor ccs nin data definition yerine baktım ama böle bir tipden bahsetmemeiş ama geçen kütüphaneden aldığım kitapda sanırım okumuşdum bu tip değişken var,şimdi byte bir değişken tipiyse neden ds1302 programında kullanılan tüm byte tiplerini başda belirtmemişde habire programın içindeki farklı fonksiyonlarda defalarca belirtmiş örnek;
void write_ds1302_byte(BYTE cmd) { 
   BYTE i; 

   for(i=0;i<=7;++i) { 
      output_bit(RTC_IO, shift_right(&cmd,1,0) ); 
      output_high(RTC_SCLK); 
      output_low(RTC_SCLK); 
   } 
}
burada sanırım cmd yi byte olarak iki parantez araında belirtmiş,onra pointer kullanmış sonra hemen alktındaki fonksiyonda bir daha belirtmiş
void write_ds1302(BYTE cmd, BYTE data) { 

   output_high(RTC_RST); 
   write_ds1302_byte(cmd); 
   write_ds1302_byte(data); 
   output_low(RTC_RST); 
}

şimdi tamam ilk fonksiyondan sonra diğerinin çağırılacağı kesin değil onun için herbirinde ayrı ayrı belirmiş gibi düşünsem,peki  neden hepsini en başta #define sclk  gibi tanımlardan sonra tanımlamamış,yani demek itediğim programın böyle yazılmasının mutlaka faydalı bir yanı olması lazımki adamlar böyle yazmış acaba hafızada dahamı az yer tutuyor

mcan

tatlisukurnazı hocam gözümden kaçan bir şey varmış dediğin doğru çıktı ,aslında aklımın ucundan bile geçmemişti,nede olsa hazır fonksiyon dedim  :roll:

erol hocam iyi bir ip ucu verdin,bir kısmını bana çözdürdün bu güzel birşey

evet arkadaşlar kah güldük kah eylendik bir sorunu daha geride bıraktık, :D

bcd yi sayısal değere dönüştürmek için kod  yazdım(sc dönüştürmek istediğimiz şey)
x=sc&0b11110000;
x=x/16;
x=x*10;
sc=sc&0b00001111;
sc=x+sc;


kötü bir programcıyım belki daha kısa az işlem gerektiren bir yolu vardır

Petek

Alıntı yapılan: "encryptedcode"şimdi  bu ve bunun gibi yerlerde  BYTE cmd, BYTE data gibi ifadeler geçiyor ccs nin data definition yerine baktım ama böle bir tipden bahsetmemeiş ama geçen kütüphaneden aldığım kitapda sanırım okumuşdum bu tip değişken var,şimdi byte bir değişken tipiyse neden ds1302 programında kullanılan tüm byte tiplerini başda belirtmemişde habire programın içindeki farklı fonksiyonlarda defalarca belirtmiş
Onlar local değişkenler. Sadece o alt programda geçerlidir. Derleyici altprogramda bu değişkenler için kullandığı adresleri, bu alt program tarafından çağırıl MA yan diğer alt programlardaki diğer değişkenler için de kullanır. Bayt şeklinde tip tanımlaması var. Özellikle Özel amaçlı yazmaçlar adresleri ile tanımlanabilir. Örneğin #Byte trisb=0x86; gibi. Boolean tanımının yanında bit tanımı da vardır. Ama genelde #bit ve #byte sizin belirli adresleri veya o adreslerdeki bitleri tanımlamanız için kullanmanız daha doğru olur.
Alıntı Yap
burada sanırım cmd yi byte olarak iki parantez araında belirtmiş,onra pointer kullanmış sonra hemen alktındaki fonksiyonda bir daha belirtmiş
cmd pointer değil. Sadece bir baytlık bir değişken. Bahsettiğiniz şu ise &cmd, bu pointer demek değildir, pointer *cmd şeklinde kullanılır (structure değilse).
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

Merhabalar,

Benimde kafam şimdi çark etti, yaşlanıyormuyum ne :D evet dallas rtc'ler genelde saat tarih gibi dataları bcd formatta veriyorlar. Bcd'yi lcd ye göndermek içinse;

unsigned char x=0x99;// 0x99hex o da esittir 99 bcd
send_lcd_1_char(((x>>4)|0x30));//10'lar hanesi icin 4 sola kaydir, 0x30hex ile or'la ascii'ye dönüştür
send_lcd_1_char(((x&0x0F)|0x30));//1'ler hanesi icin 0xF0hex ile and'le onlar hanesini sil, 0x30hex ile or'la ascii'ye dönüştür

(send_lcd_1_char(unsigned char); ve unsigned char x anlatım rahatlığı için uydurulmuş fonksiyon ve değişkenlerdir çalışan kod'ile alakaları yoktur, kaale almayınız...)
Şeklinde birşey ilk aklıma gelen oldu. İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

zafzaf82

bende ds 1302 kullandım sorunsuz çalışıyor.

Alıntı Yap
unsigned char x=0x99;// 0x99hex o da esittir 99 bcd
send_lcd_1_char(((x>>4)|0x30));//10'lar hanesi icin 4 sola kaydir, 0x30hex ile or'la ascii'ye dönüştür
send_lcd_1_char(((x&0x0F)|0x30));//1'ler hanesi icin 0xF0hex ile and'le onlar hanesini sil, 0x30hex ile or'la ascii'ye dönüştür

gibi ayrıca hesaplamalar yaptırmaya gerek yok.

rtc_init()  
                                                             
rtc_set_datetime(day,mth,year,dow,hour,min)  
                                                         
rtc_get_date(day,mth,year,dow)   
                                         
rtc_get_time(hr,min,sec)
                                                            
rtc_write_nvr(address,data)


bu kodlarla sorunsuz çalışma sağlanabiliyor.
Mikroişlemci bi araçtır, amaç değil.....

mcan

Alıntı yapılan: "zafzaf82"bende ds 1302 kullandım sorunsuz çalışıyor.

Alıntı Yap
unsigned char x=0x99;// 0x99hex o da esittir 99 bcd
send_lcd_1_char(((x>>4)|0x30));//10'lar hanesi icin 4 sola kaydir, 0x30hex ile or'la ascii'ye dönüştür
send_lcd_1_char(((x&0x0F)|0x30));//1'ler hanesi icin 0xF0hex ile and'le onlar hanesini sil, 0x30hex ile or'la ascii'ye dönüştür

gibi ayrıca hesaplamalar yaptırmaya gerek yok.

rtc_init()  
                                                             
rtc_set_datetime(day,mth,year,dow,hour,min)  
                                                         
rtc_get_date(day,mth,year,dow)   
                                         
rtc_get_time(hr,min,sec)
                                                            
rtc_write_nvr(address,data)


bu kodlarla sorunsuz çalışma sağlanabiliyor.

Dönüşüm olmadan yanlış gösteriyor lcd de