Working Version of the Real Time Clock module DS1307.

Dependents:   Rtc_Ds1307_Sample TAREA_5_PROCESADORES Rtc_Ds1307_lcd_alarma Rtc_Ds1307_Reloj_con_alarma_aplazable ... more

This is my implementation of the DS1307.

I plan to add functionality which will make use of the OSC Input and which will increment the time continuously. A query to the module will then only have to be made when the MBED has been powered down.

Files at this revision

API Documentation at this revision

Comitter:
leihen
Date:
Sun Jun 23 16:29:35 2013 +0000
Parent:
3:e89d63f3342e
Child:
5:30531f2121a2
Commit message:
Added a RTC wrapper class.

Changed in this revision

RtcCls.c Show annotated file Show diff for this revision Revisions of this file
RtcCls.h Show annotated file Show diff for this revision Revisions of this file
Rtc_Ds1307.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RtcCls.c	Sun Jun 23 16:29:35 2013 +0000
@@ -0,0 +1,68 @@
+#include "RtcCls.h"
+#define DEBUG
+#include "debug.h"
+
+
+
+
+RtcCls::RtcCls(PinName sda, PinName scl, PinName sqw, bool bUseSqw)
+    : Rtc_Ds1307(sda, scl), m_sqw(sqw), m_bUseSqw(bUseSqw), m_bAlarmEnabled(false), m_alarmfunc(NULL)
+{
+    //  Only register the callback and start the SQW if requested to do so. Otherwise the system 
+    //  will use the MBED built-in RTC.
+    if (m_bUseSqw) {
+        Time t;
+        //  start the wave
+        setSquareWaveOutput(true, RS_1Hz);
+        //  query time
+        getTime(t);
+        struct tm now = {t.sec, t.min, t.hour, t.date, t.mon, t.year};
+        m_time = mktime(&tm);
+        //  register callback from now on the time will be maintained by the square wave input
+        m_sqw.rise(_callback);
+    }
+}
+
+void RtcCls::_callback(void)
+{
+    //  Simply increase the number of seconds
+    m_time++;
+    if (m_bAlarmEnabled && (m_time == m_alarmTime)) {
+        if (m_alarmfunc != NULL)
+            m_alarmfunc();
+        m_bAlarmEnabled = false;
+    }
+}
+
+time_t RtcCls::getTime()
+{
+    //  when not using the HW support, we have to query the RTC chip. Other wise we can just return out stored value
+    if (!m_bUseSqw) {
+        Time t;
+        getTime(t);
+        struct tm now = {t.sec, t.min, t.hour, t.date, t.mon, t.year};
+        m_time = mktime(&tm); 
+    }
+    return m_time;
+}
+
+void RtcCls::setTime(time_t t)
+{
+    Time tim;
+    struct tm *now;
+    now = localtime(&t);
+    
+    tim.sec = now->tm_sec;
+    tim.min = now->tm_min;
+    tim.hour = now->tm_hour;
+    tim.date = now->tm_mday;
+    tim.mon = now->tm_mon;
+    tim.year = now->tm_year + 1900;
+    tim.wday = now->tm_wday +1;
+    
+    setTime( tim, true, true);
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RtcCls.h	Sun Jun 23 16:29:35 2013 +0000
@@ -0,0 +1,38 @@
+#ifndef __RTC_H__
+#define __RTC_H__
+
+#include "Rtc_Ds1307.h"
+#include "mbed.h"
+
+typedef void (*callback_t)(void);
+
+class RtcCls   :   public Rtc_Ds1307
+{
+    protected:
+        InterruptIn         m_sqw;
+        bool                m_bUseSqw;
+        time_t              m_time;             //  Only used in case of SQW use
+        
+        bool                m_bAlarmEnabled;
+        callback_t          m_alarmfunc;
+        time_t              m_alarmTime;
+        
+    public:
+        RtcCls(PinName sda, PinName scl, PinName sqw, bool bUseSqw);
+
+    protected:        
+        static void _callback(void);
+        
+    public:
+        time_t              getTime();
+        void                setTime(time_t t);
+    public: 
+        void                setAlarm(int nSeconds, callback_t alarmfunc)
+        {
+            m_alarmfunc = alarmfunc;
+            m_alarmTime = m_time + nSeconds;
+            m_bAlarmEnabled = (alarmfunc == NULL) ? false : true;
+        }
+};
+
+#endif //   __RTC_H__
\ No newline at end of file
--- a/Rtc_Ds1307.cpp	Sun Jun 23 11:26:26 2013 +0000
+++ b/Rtc_Ds1307.cpp	Sun Jun 23 16:29:35 2013 +0000
@@ -1,7 +1,8 @@
 /* Rtc_Ds1307.cpp */
 
 #include "Rtc_Ds1307.h"
-#define DEBUG
+//#define DEBUG
+#undef DEBUG
 #include "debug.h"
 
 const char *Rtc_Ds1307::m_weekDays[] = { "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };