Paul Staron / Mbed 2 deprecated KL25Z_DCF77_OLED160

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
star297
Date:
Fri Mar 08 21:11:11 2013 +0000
Parent:
0:e3f7b0fd072e
Commit message:
RTC function added + corrected Leap year code

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Mar 06 23:09:06 2013 +0000
+++ b/main.cpp	Fri Mar 08 21:11:11 2013 +0000
@@ -2,7 +2,7 @@
 #include "OLED160G1.h"
 
 OLED160G1 oled(PTD3,PTD2,PTD1);// Oled Display tx, rx, rs
-DigitalIn dcfSignalIn(PTD5);//conection to NON inverting output of dcf module
+DigitalIn dcfSignalIn(PTE20);//conection to NON inverting output of dcf module
 
 DigitalOut dcfLED (LED1);// dcf signal Pulse
 
@@ -21,12 +21,15 @@
   
 //makro,s
 void dcf_check();
-void oled_date_print();
+void showRtcDate();
 void oled_time_print();
 void bit_map_draw();
 void bit_print();
 void parity_calc();
 void drawgraph();
+void showRTC();
+void showRtcDate();
+void setRTC();
 
 Timer d;
 Ticker Ticker10ms;
@@ -84,7 +87,7 @@
 typedef unsigned char byte;
 void loop();
 void oled_time_print();
-void oled_date_print();
+void showRtcDate();
 void drawgraph();
 void bit_map_draw();
 void set_time();
@@ -133,8 +136,8 @@
        }
         if (dcf_sec==58) {status = 2;}
         if (dcf_sec==59) {dcf_check();} // check parity
-        if (status == 3 && dcf_sec == 1) {set_time();} // set clock if good data
-           
+        if (status == 3 && dcf_sec == 1) {set_time();} // set DCF clock if good data
+                 
     if (second >= 60) {
         ++minute;
         second -=60;
@@ -168,11 +171,12 @@
                break;}
             case 3: { // 150mS after start of second pulse (bit "1" dcf Data)
                 dcf_status.sample150 = (dcfSignalIn);                
-                 if (!dcf_status.sample150 && !dcf_status.sample50 && start_delay==0) {zero_bit=1;sync=0;insecond_counter=0;start=1;}
-                 else {zero_bit=0;}
+                if (!dcf_status.sample150 && !dcf_status.sample50 && start_delay==0) {zero_bit=1;sync=0;insecond_counter=0;start=1;}
+                else {zero_bit=0;}
                break;}
             case 6: { // 300mS after start of second (signal error if true)
-                 if (dcfSignalIn) {dcf_error = 1;}
+                if (status == 3 && dcf_sec == 1) {setRTC();} // set RTC clock if good data
+                if (dcfSignalIn) {dcf_error = 1;}
                break;}                
             case 10: { // 500mS after start of second (signal error if true)
                 if (dcfSignalIn) {dcf_error = 1;}
@@ -191,14 +195,14 @@
            }            
         if (interrupt_counter==3)
            {
-             oled.locate(18,5);oled.setFontColor(oled.toRGB(0,0,255));
+             oled.locate(18,4);oled.setFontColor(oled.toRGB(0,0,255));
              oled.printf("Bit %d",dcf_status.sample150); 
-             if (start==0) {oled.drawText(18,7,(OLED_FONT5X7),"No Sync ",oled.toRGB(255,0,0));}
+             if (start==0) {oled.drawText(18,13,(OLED_FONT5X7),"No Sync ",oled.toRGB(255,0,0));}
              
            if (start==1)
             {
                 dcf_array[dcf_sec]=dcf_status.sample150;
-                oled.drawText(18,7,(OLED_FONT5X7),"In Sync ",oled.toRGB(0,255,0));
+                oled.drawText(18,13,(OLED_FONT5X7),"In Sync ",oled.toRGB(0,255,0));
                     if (insecond_counter==1)
                     {
                         dcf_sec=0;x=0;y=5;dcf_array[58] = 0; bmd=0;        
@@ -224,13 +228,13 @@
     oled.drawText(1,1,(OLED_FONT8X12),"DCF77 Atomic Clock",oled.toRGB(255,0,0));
     oled.drawText(1,3,(OLED_FONT8X12)," Freescale KL25Z",oled.toRGB(0,255,0));
     oled.drawText(1,5,(OLED_FONT8X12),"   4D Systems",oled.toRGB(0,0,255));
-    oled.drawText(1,6,(OLED_FONT8X12)," Oled160 Display",oled.toRGB(255,255,0));
-    
-    wait (5);oled.eraseScreen();r = 1; 
-    oled.setFontSize(OLED_FONT5X7);            
-    bit_map_draw();dcf_sec=0;bmd=1;start=0;zero_bit=0;
+    oled.drawText(1,7,(OLED_FONT8X12)," Oled160 Display",oled.toRGB(255,255,0));    
+    wait(1);
+    oled.eraseScreen();bit_map_draw();
+    oled.drawText(17,6,(OLED_FONT5X7),"DCF Time",oled.toRGB(255,255,0));
+    dcf_sec=0;bmd=1;start=0;zero_bit=0;r = 1;
     status = 0; start_delay=1;
-    d.start();  
+    d.start();showRtcDate();  
     if (dcfSignalIn) {interrupt_counter =0 ;sync=1;}                    
     Ticker10ms.attach(& myISR, .05 ); //Setup Ticker to call myISR every 50 ms
             
@@ -255,22 +259,6 @@
             status = 3; // good parity
         }       
 }
-void showClock()
-{
-   oled.setFontSize(OLED_FONT8X12);
-   oled.locate(0,0);oled.setFontColor(oled.toRGB(255,255,255));
-   oled.printf("%02d:%02d:%02d", hour, minute, second);
-   oled.locate(0,1);
-   oled.printf("%s %02d %s'20%02d", weekDayName[dayofweek], dayofmonth, monthName[month-1], year);
-   oled.setFontSize(OLED_FONT5X7);
-   if (dcf_status.is_leap) {oled.drawText(15,0,(OLED_FONT5X7),"Summer Time",oled.toRGB(255,100,100));}               
-   else {oled.drawText(15,0,(OLED_FONT5X7),"Winter Time",oled.toRGB(0,255,255));}   
-   if (status==0) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(255,255,255));}
-   if (status==1) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(0,255,255));}
-   if (status==2) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(0,0,255));}
-   if (status==3) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(0,255,0));}
-   if (status==4) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(255,0,0));}
-}
 
 void bit_print()
 {
@@ -304,18 +292,67 @@
     oled.drawText(x,y+9,(OLED_FONT5X7)," P arity       ",oled.toRGB(255,255,0));   
     oled.drawLine(2,43,85,43, oled.toRGB(255, 0, 0));
     oled.drawLine(14,33,14,118, oled.toRGB(255, 0, 0)); 
-    oled.drawText(17,12,(OLED_FONT5X7),"DCF Sec's",oled.toRGB(255,255,255)); 
 }
-
+void showClock()
+{
+   oled.setFontSize(OLED_FONT5X7);
+   oled.locate(17,8);oled.setFontColor(oled.toRGB(255,255,255));
+   oled.printf("%02d:%02d:%02d", hour, minute, second);
+   oled.locate(17,9);
+   oled.printf("%02d/%02d/%02d",dayofmonth,month,year);
+   if (summertime) {oled.drawText(17,10,(OLED_FONT5X7),"Summer",oled.toRGB(255,100,100));}               
+   else {oled.drawText(17,10,(OLED_FONT5X7),"Winter",oled.toRGB(0,255,255));} 
+   oled.drawText(17,11,(OLED_FONT5X7),leapText[dcf_status.is_leap],oled.toRGB(0,255,160)); 
+   if (status==0) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(255,255,255));}
+   if (status==1) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(0,255,255));}
+   if (status==2) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(0,0,255));}
+   if (status==3) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(0,255,0));}
+   if (status==4) {oled.drawText(5,15,(OLED_FONT5X7),statusText[status],oled.toRGB(255,0,0));}
+} 
 void loop()
 {   
     if (interrupt_counter == 0) {  // refresh local time at the first 50mS of every second
-    showClock();  
-    oled.setFontSize(OLED_FONT8X12); 
-    oled.locate(15,14);oled.setFontColor(oled.toRGB(255,255,255));oled.printf("%02d",dcf_sec);
+    showClock(); 
+    showRTC(); 
+    oled.setFontSize(OLED_FONT5X7); 
+    oled.locate(9,12);oled.setFontColor(oled.toRGB(255,255,255));oled.printf("%02d",dcf_sec);
     oled.setFontSize(OLED_FONT5X7);
-    } 
-  }
+ } 
+}
+  
+void showRTC()
+{
+    time_t seconds = time(NULL);
+    char buffer[40];
+    strftime(buffer, 40, "%I:%M:%S %p", localtime(&seconds));
+    oled.drawText(1,0,(OLED_FONT8X12),buffer,oled.toRGB(255,255,255));
+}
+
+void showRtcDate()
+{
+    time_t seconds = time(NULL);    
+    char buffer[40];
+    strftime(buffer, 40, "%a %d %b %Y", localtime(&seconds));
+    oled.drawText(1,1,(OLED_FONT8X12),buffer,oled.toRGB(255,255,255)); 
+}
+
+void setRTC()
+{
+            //Mbed rtc clock set
+            struct tm t;
+            t.tm_sec = (second-1);        // 0-59
+            t.tm_min = (minute);     // 0-59
+            t.tm_hour = (hour);   // 0-23
+            t.tm_mday = (dayofmonth);    // 1-31
+            t.tm_mon = (month-1);     // 0-11 DCF "0" = Jan, -1 added for Mbed RCT clock format
+            t.tm_year = ((year)+100);  // year since 1900,  current DCF year + 100 + 1900 = correct year
+            set_time(mktime(&t)-3600);
+            time_t seconds = mktime(&t);               
+            showRtcDate(); // Print DATE once per minute
+            if (summertime==0) {oled.drawText(19,0,(OLED_FONT5X7),"Winter",oled.toRGB(0,255,255));}               
+            else {oled.drawText(19,0,(OLED_FONT5X7),"Summer",oled.toRGB(255,128,128));}
+   
+}
   
 void set_time()
 {