Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 1:4f254cca2bac, committed 2013-03-08
- 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()
{