DS1302 RTC yerine modül onerisi

Başlatan cevat1, 09 Şubat 2018, 15:26:50

cevat1

Arkadaşlar merhaba,

Atölyede kullandığım dijital saatlerde DS1302 rtc var. Saatleri devamlı ileri-geri ayarlamak zorunda kalıyorum. Ayarlama ile  uğraşmak istemiyorum. DS 1302 nin yerine kullanabilecegim modül öneriniz var mı?
DS3231 kullanabilir miyim?

polleme

Sürekli ayar ile uğraşmak istemiyorsanız GPS clock kullanın, en garantilisi.

https://learn.adafruit.com/arduino-clock/overview

gokhangokcen

#2
DS3231  kullanıyorum tavsiye de ederim.1,5 yıldır bir saniye bile sapmadı.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

mehmet

DS3231 de RAM alanı yok, eger istenirse DS3232
kullanılabilir.

Hatta entegrenin(DS3231/3232) içinde sıcaklık
sensörü de mevcut.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mg1980

Hocam,
Aliexp.ten alınan hazır modüllerde ram(24C32N) var sanırım.

Ersin


cevat1

Alıntı yapılan: gokhangokcen - 09 Şubat 2018, 15:41:47
DS3231  kullanıyorum tavsiye de ederim.1,5 yıldır bir saniye bile sapmadı.


Bu modülü denemek isterim. Bağlantı şeklini nasıl yapılacak?

Maxim

#7
DS3231 çok düzgün çalışıyor

ben bundan kullandım
fakat o pile güvenmeyin birkaç ay sonra biter
https://www.robolinkmarket.com/raspberry-pi-uyumlu-mini-rtc-modul.html

gokhangokcen

https://www.robotistan.com/ds3231-hassas-rtc-ve-24c32-hafiza-karti?lang=tr&h=111bc069&gclid=CjwKCAiAqvXTBRBuEiwAE54dcHXxarCIwkdkC1vW1U3wvbazLfL4FTAKketxgTeAdg4RnriiBodSihoC4jAQAvD_BwE

ben bu modülü kullanmıştım üstad.Üzerinde eepromda var.Alarm ve farklı birkaç veri kaydetmiştim.Çok işimi gördü.

DS3231.c
#include "DS3231.h"                                                        
                                                                  
                                                          
unsigned char bcd_to_decimal(unsigned char d)                
{                                                                                          
         return ((d & 0x0F) + (((d & 0xF0) >> 4) * 10)); 
}                                
                                                              

unsigned char decimal_to_bcd(unsigned char d) 
{ 
         return (((d / 10) << 4) & 0xF0) | ((d % 10) & 0x0F); 
}                                                    
                                        
                  
unsigned char DS3231_Read(unsigned char address) 
{                                      
         unsigned char value = 0; 
         I2C_start();                                                      
         I2C_write(DS3231_Write_addr);      
         I2C_write(address);            
         I2C_start();                  
         I2C_write(DS3231_Read_addr);    
         value = I2C_read(0);                      
         I2C_stop();                  
         return value; 
}                      


void DS3231_Write(unsigned char address, unsigned char value)    
{  
         I2C_start();                  
         I2C_write(DS3231_Write_addr); 
         I2C_write(address); 
         I2C_write(value);    
         I2C_stop(); 
}  


void DS3231_init() 
{                                    
         DS3231_Write(controlREG, 0x00);  
         DS3231_Write(statusREG, 0x08); 
}                        


void getTime(unsigned char &p3, unsigned char &p2, unsigned char &p1, short &p0, short hour_format) 
{                        
         unsigned char tmp = 0; 
         p1 = DS3231_Read(secondREG); 
         p1 = bcd_to_decimal(p1); 
         p2 = DS3231_Read(minuteREG); 
         p2 = bcd_to_decimal(p2); 
         switch(hour_format) 
         {                                              
                  case 1:          
                  {          
                           tmp = DS3231_Read(hourREG); 
                           tmp &= 0x20; 
                           p0 = (short)(tmp >> 5);              
                           p3 = (0x1F & DS3231_Read(hourREG)); 
                           p3 = bcd_to_decimal(p3);                            
                           break;      
                  }    
                  default: 
                  { 
                           p3 = (0x3F & DS3231_Read(hourREG));            
                           p3 = bcd_to_decimal(p3);    
                           break;      
                  } 
         }  
}                                  
                                                      
                                
void getDate(unsigned char &p4, unsigned char &p3, unsigned char &p2, unsigned char &p1) 
{ 
         p1 = DS3231_Read(yearREG); 
         p1 = bcd_to_decimal(p1);                  
         p2 = (0x1F & DS3231_Read(monthREG)); 
         p2 = bcd_to_decimal(p2);                                
         p3 = (0x3F & DS3231_Read(dateREG)); 
         p3 = bcd_to_decimal(p3);    
         p4 = (0x07 & DS3231_Read(dayREG));    
         p4 = bcd_to_decimal(p4);                    
} 

                                                    
void setTime(unsigned char hSet, unsigned char mSet, unsigned char sSet, short am_pm_state, short hour_format)  
{                                                                                                              
         unsigned char tmp = 0; 
         DS3231_Write(secondREG, (decimal_to_bcd(sSet))); 
         DS3231_Write(minuteREG, (decimal_to_bcd(mSet)));        
         switch(hour_format) 
         { 
                  case 1: 
                  {        
                           switch(am_pm_state) 
                           { 
                                    case 1: 
                                    {            
                                             tmp = 0x60; 
                                             break; 
                                    } 
                                    default: 
                                    {    
                                             tmp = 0x40; 
                                             break; 
                                    } 
                           }                            
                           DS3231_Write(hourREG, ((tmp | (0x1F & (decimal_to_bcd(hSet))))));                    
                           break; 
                  }                                              
                  
                  default: 
                  { 
                           DS3231_Write(hourREG, (0x3F & (decimal_to_bcd(hSet)))); 
                           break; 
                  }  
         }    
}                                                  

                                    
void setDate(unsigned char daySet, unsigned char dateSet, unsigned char monthSet, unsigned char yearSet) 
{          
         DS3231_Write(dayREG, (decimal_to_bcd(daySet)));            
         DS3231_Write(dateREG, (decimal_to_bcd(dateSet)));  
         DS3231_Write(monthREG, (decimal_to_bcd(monthSet))); 
         DS3231_Write(yearREG, (decimal_to_bcd(yearSet)));    
} 

                                
float getTemp()                                                  
{ 
         register float t = 0.0; 
         unsigned char lowByte = 0; 
         signed char highByte = 0; 
         lowByte = DS3231_Read(tempLSBREG); 
         highByte = DS3231_Read(tempMSBREG);  
         lowByte >>= 6;                  
         lowByte &= 0x03;      
         t = ((float)lowByte);  
         t *= 0.25;      
         t += highByte;          
         return t; 
                                      
}


DS3231.h

#define DS3231_Address              0x68            
                                                  
#define DS3231_Read_addr            ((DS3231_Address << 1) | 0x01) 
#define DS3231_Write_addr           ((DS3231_Address << 1) & 0xFE) 
                                            
#define secondREG                   0x00 
#define minuteREG                   0x01 
#define hourREG                     0x02 
#define dayREG                      0x03 
#define dateREG                     0x04                              
#define monthREG                    0x05                            
#define yearREG                     0x06                    
#define alarm1secREG                0x07        
#define alarm1minREG                0x08 
#define alarm1hrREG                 0x09            
#define alarm1dateREG               0x0A  
#define alarm2minREG                0x0B    
#define alarm2hrREG                 0x0C 
#define alarm2dateREG               0x0D 
#define controlREG                  0x0E 
#define statusREG                   0x0F 
#define ageoffsetREG                0x10 
#define tempMSBREG                  0x11 
#define tempLSBREG                  0x12 
                                  
#define _24_hour_format             0 
#define _12_hour_format             1 
#define am                          0 
#define pm                          1 

                                                                
unsigned char bcd_to_decimal(unsigned char d); 
unsigned char decimal_to_bcd(unsigned char d);                      
unsigned char DS3231_Read(unsigned char address); 
void DS3231_Write(unsigned char address, unsigned char value); 
void DS3231_init();  
void getTime(unsigned char &p3, unsigned char &p2, unsigned char &p1, short &p0, short hour_format);  
void getDate(unsigned char &p4, unsigned char &p3, unsigned char &p2, unsigned char &p1);    
void setTime(unsigned char hSet, unsigned char mSet, unsigned char sSet, short am_pm_state, short hour_format); 
void setDate(unsigned char daySet, unsigned char dateSet, unsigned char monthSet, unsigned char yearSet);    
float getTemp();


mainde kullanacağın veriler(kendine göre düzenlersin),
/**********************************DS3231 Tanımlamaları*********************************/
unsigned int set;
unsigned char s = 00;
unsigned char min = 54;
unsigned char hr = 11;
unsigned char dy = 4;      //1 pazar 2 pazartesi 3 salı 4 çrşmba 5 perşmbe 6 cuma 7 cumartesi
unsigned char dt = 15;      // gün
unsigned char mt = 02;     //Ay
unsigned char yr = 17;     //yıl
short hr_format = _24_hour_format;
short am_pm = 0;

   set=DS3231_read(controlREG);     //saat frekansı başlatılmadı ise init yapıyordum.
   if(bit_test(set,7)){DS3231_init();}

getDate(dy, dt, mt, yr);    //Yıl ay gün ve haftanın gününü okumak için

getTime(hr, min, s, am_pm, hr_format);    //Saat, dakika, saniye gibi bilgileri okumak için,

         //setTime(hr, min, s, am_pm, hr_format);//saat dakika gibi verileri ds3231'e yazmak için.
         //setDate(dy, dt, mt, yr);//yıl ve gün gibi bilgileri ds3231'e yazmak için.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

OG

Alıntı yapılan: gokhangokcen - 09 Şubat 2018, 18:05:08
https://www.robotistan.com/ds3231-hassas-rtc-ve-24c32-hafiza-karti?lang=tr&h=111bc069&gclid=CjwKCAiAqvXTBRBuEiwAE54dcHXxarCIwkdkC1vW1U3wvbazLfL4FTAKketxgTeAdg4RnriiBodSihoC4jAQAvD_BwE

ben bu modülü kullanmıştım üstad.Üzerinde eepromda var.Alarm ve farklı birkaç veri kaydetmiştim.Çok işimi gördü.
Altınkaya'nın yuvasında, pil içinde tıkır tıkır oynuyor, sıkıntı çektim.
Bu ürün ithal bir şey mi? Pil yuvası sağlam mı?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

gokhangokcen

Gayet sağlam ve güzel hocam ben çok memnun kaldım.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

cevat1

Alıntı yapılan: Ersin - 09 Şubat 2018, 16:53:45
Kristal i değiştir.


Kristal çabuk etkilenen bir komponent, sıcak-soğuk, kalitesiz 32.768 khz (piyasa da bol miktarda var), şaselenmemiş kristal vs. vs.. bir sürü etken kristalin çalışmasını etkiliyor.
Kristale trimmer takıp skop ta 32.768 khz ayar yaptığım halde saatin ileri-geri kalmasını  ayarlamaktan yoruldum.
Ds3231 iyi bir seçim olur inşaallah...


Yanıt veren tüm arkadaşlara, teşekkür ederim.


İyi çalışmalar, kolay gelsin...

ilyas KAYA

Esp ile internetten çekin sapma yapmaz :)

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

cevat1

#14
https://www.robotistan.com/ds3231-hassas-rtc-ve-24c32-hafiza-karti?lang=tr&h=111bc069&gclid=CjwKCAiAqvXTBRBuEiwAE54dcHXxarCIwkdkC1vW1U3wvbazLfL4FTAKketxgTeAdg4RnriiBodSihoC4jAQAvD_BwE


Eeprom hafızalı modül kullandım.
Bağlantısında sorun yaşadım. Modül çalışıyor. Ancak saat algılamıyor.
Saatin üzerindeki DS1302 rtc yi çıkarttım. DS3231 in SCL(CLOCK) ve SDA(DATA) bağlantılarını rtc nin pinlerine bağladım. Ds3231 e de 3.5 vdc besleme gönderdim. Modül çalışıyor, ancak
Saat modülü algılamadı.
Eksik bağlantı mı var acaba?
DS3231 modülü kullanan arkadaşların önerisi olur mu?