diff options
Diffstat (limited to 'Projects/TempDataLogger/Lib')
-rw-r--r-- | Projects/TempDataLogger/Lib/DS1307.c | 107 | ||||
-rw-r--r-- | Projects/TempDataLogger/Lib/DS1307.h | 12 | ||||
-rw-r--r-- | Projects/TempDataLogger/Lib/FATFs/diskio.c | 2 |
3 files changed, 101 insertions, 20 deletions
diff --git a/Projects/TempDataLogger/Lib/DS1307.c b/Projects/TempDataLogger/Lib/DS1307.c index 0a702a333..d3ee95a77 100644 --- a/Projects/TempDataLogger/Lib/DS1307.c +++ b/Projects/TempDataLogger/Lib/DS1307.c @@ -7,9 +7,98 @@ #include "DS1307.h" -bool DS1307_SetTimeDate(const TimeDate_t* NewTimeDate) +#if defined(DUMMY_RTC) + +/** Current dummy RTC time and date */ +static volatile TimeDate_t DummyRTC_Count; + +void RTC_Init(void) +{ + DummyRTC_Count.Hour = 0; + DummyRTC_Count.Minute = 0; + DummyRTC_Count.Second = 0; + DummyRTC_Count.Day = 1; + DummyRTC_Count.Month = 1; + DummyRTC_Count.Year = 00; +} + +void RTC_Tick500ms(void) +{ + static bool HalfSecondElapsed = false; + + HalfSecondElapsed = !HalfSecondElapsed; + if (HalfSecondElapsed == false) + return; + + if (++DummyRTC_Count.Second < 60) + return; + + DummyRTC_Count.Second = 0; + + if (++DummyRTC_Count.Minute < 60) + return; + + DummyRTC_Count.Minute = 0; + + if (++DummyRTC_Count.Hour < 24) + return; + + DummyRTC_Count.Hour = 0; + + static const char MonthLength[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + uint8_t DaysInMonth = MonthLength[DummyRTC_Count.Month - 1]; + + /* Check if we need to account for a leap year */ + if ((DummyRTC_Count.Month == 2) && + ((!(DummyRTC_Count.Year % 400)) || ((DummyRTC_Count.Year % 100) && !(DummyRTC_Count.Year % 4)))) + { + DaysInMonth++; + } + + if (++DummyRTC_Count.Day <= DaysInMonth) + return; + + DummyRTC_Count.Day = 1; + + if (++DummyRTC_Count.Month <= 12) + return; + + DummyRTC_Count.Month = 1; + DummyRTC_Count.Year++; +} + +bool RTC_SetTimeDate(const TimeDate_t* NewTimeDate) +{ + GlobalInterruptDisable(); + DummyRTC_Count = *NewTimeDate; + GlobalInterruptEnable(); + + return true; +} + +bool RTC_GetTimeDate(TimeDate_t* const TimeDate) +{ + GlobalInterruptDisable(); + *TimeDate = DummyRTC_Count; + GlobalInterruptEnable(); + + return true; +} + +#else + +void RTC_Init(void) +{ + /* Unused for a real external DS1307 RTC device */ +} + +void RTC_Tick500ms(void) +{ + /* Unused for a real external DS1307 RTC device */ +} + +bool RTC_SetTimeDate(const TimeDate_t* NewTimeDate) { -#if !defined(DUMMY_RTC) DS1307_DateTimeRegs_t NewRegValues; const uint8_t WriteAddress = 0; @@ -38,22 +127,12 @@ bool DS1307_SetTimeDate(const TimeDate_t* NewTimeDate) { return false; } -#endif return true; } -bool DS1307_GetTimeDate(TimeDate_t* const TimeDate) +bool RTC_GetTimeDate(TimeDate_t* const TimeDate) { -#if defined(DUMMY_RTC) - TimeDate->Hour = 1; - TimeDate->Minute = 1; - TimeDate->Second = 1; - - TimeDate->Day = 1; - TimeDate->Month = 1; - TimeDate->Year = 1; -#else DS1307_DateTimeRegs_t CurrentRegValues; const uint8_t ReadAddress = 0; @@ -73,8 +152,8 @@ bool DS1307_GetTimeDate(TimeDate_t* const TimeDate) TimeDate->Day = (CurrentRegValues.Byte5.Fields.TenDay * 10) + CurrentRegValues.Byte5.Fields.Day; TimeDate->Month = (CurrentRegValues.Byte6.Fields.TenMonth * 10) + CurrentRegValues.Byte6.Fields.Month; TimeDate->Year = (CurrentRegValues.Byte7.Fields.TenYear * 10) + CurrentRegValues.Byte7.Fields.Year; -#endif return true; } +#endif diff --git a/Projects/TempDataLogger/Lib/DS1307.h b/Projects/TempDataLogger/Lib/DS1307.h index dee4cb84d..2e20dbf33 100644 --- a/Projects/TempDataLogger/Lib/DS1307.h +++ b/Projects/TempDataLogger/Lib/DS1307.h @@ -5,14 +5,14 @@ www.lufa-lib.org */ -#ifndef _DS1307_H_ -#define _DS1307_H_ +#ifndef _RTC_H_ +#define _RTC_H_ /* Includes: */ #include <avr/io.h> #include <LUFA/Drivers/Peripheral/TWI.h> - + #include "Config/AppConfig.h" /* Type Defines: */ @@ -117,8 +117,10 @@ #define DS1307_ADDRESS 0xD0 /* Function Prototypes: */ - bool DS1307_SetTimeDate(const TimeDate_t* NewTimeDate); - bool DS1307_GetTimeDate(TimeDate_t* const TimeDate); + void RTC_Init(void); + void RTC_Tick500ms(void); + bool RTC_SetTimeDate(const TimeDate_t* NewTimeDate); + bool RTC_GetTimeDate(TimeDate_t* const TimeDate); #endif diff --git a/Projects/TempDataLogger/Lib/FATFs/diskio.c b/Projects/TempDataLogger/Lib/FATFs/diskio.c index 085d5aec6..8cc8cd404 100644 --- a/Projects/TempDataLogger/Lib/FATFs/diskio.c +++ b/Projects/TempDataLogger/Lib/FATFs/diskio.c @@ -85,7 +85,7 @@ DWORD get_fattime (void) { TimeDate_t CurrTimeDate; - DS1307_GetTimeDate(&CurrTimeDate); + RTC_GetTimeDate(&CurrTimeDate); return ((DWORD)(20 + CurrTimeDate.Year) << 25) | |