From 15828b1d5f754fb9b6f06565159973a059584795 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 20 Jul 2013 10:38:25 +0200 Subject: Rename DS1307 driver files to a more generic RTC, as different RTC drivers may be added in the future. --- Projects/TempDataLogger/Lib/DS1307.c | 159 ------------------------------- Projects/TempDataLogger/Lib/DS1307.h | 126 ------------------------ Projects/TempDataLogger/Lib/RTC.c | 159 +++++++++++++++++++++++++++++++ Projects/TempDataLogger/Lib/RTC.h | 126 ++++++++++++++++++++++++ Projects/TempDataLogger/TempDataLogger.h | 2 +- Projects/TempDataLogger/asf.xml | 7 +- Projects/TempDataLogger/makefile | 2 +- 7 files changed, 289 insertions(+), 292 deletions(-) delete mode 100644 Projects/TempDataLogger/Lib/DS1307.c delete mode 100644 Projects/TempDataLogger/Lib/DS1307.h create mode 100644 Projects/TempDataLogger/Lib/RTC.c create mode 100644 Projects/TempDataLogger/Lib/RTC.h diff --git a/Projects/TempDataLogger/Lib/DS1307.c b/Projects/TempDataLogger/Lib/DS1307.c deleted file mode 100644 index d3ee95a77..000000000 --- a/Projects/TempDataLogger/Lib/DS1307.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - Copyright (C) Dean Camera, 2013. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -#include "DS1307.h" - -#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) -{ - DS1307_DateTimeRegs_t NewRegValues; - const uint8_t WriteAddress = 0; - - // Convert new time data to the DS1307's time register layout - NewRegValues.Byte1.Fields.TenSec = (NewTimeDate->Second / 10); - NewRegValues.Byte1.Fields.Sec = (NewTimeDate->Second % 10); - NewRegValues.Byte1.Fields.CH = false; - NewRegValues.Byte2.Fields.TenMin = (NewTimeDate->Minute / 10); - NewRegValues.Byte2.Fields.Min = (NewTimeDate->Minute % 10); - NewRegValues.Byte3.Fields.TenHour = (NewTimeDate->Hour / 10); - NewRegValues.Byte3.Fields.Hour = (NewTimeDate->Hour % 10); - NewRegValues.Byte3.Fields.TwelveHourMode = false; - - // Convert new date data to the DS1307's date register layout - NewRegValues.Byte4.Fields.DayOfWeek = 0; - NewRegValues.Byte5.Fields.TenDay = (NewTimeDate->Day / 10); - NewRegValues.Byte5.Fields.Day = (NewTimeDate->Day % 10); - NewRegValues.Byte6.Fields.TenMonth = (NewTimeDate->Month / 10); - NewRegValues.Byte6.Fields.Month = (NewTimeDate->Month % 10); - NewRegValues.Byte7.Fields.TenYear = (NewTimeDate->Year / 10); - NewRegValues.Byte7.Fields.Year = (NewTimeDate->Year % 10); - - // Write the new Time and Date into the DS1307 - if (TWI_WritePacket(DS1307_ADDRESS, 10, &WriteAddress, sizeof(WriteAddress), - (uint8_t*)&NewRegValues, sizeof(DS1307_DateTimeRegs_t)) != TWI_ERROR_NoError) - { - return false; - } - - return true; -} - -bool RTC_GetTimeDate(TimeDate_t* const TimeDate) -{ - DS1307_DateTimeRegs_t CurrentRegValues; - const uint8_t ReadAddress = 0; - - // Read in the stored Time and Date from the DS1307 - if (TWI_ReadPacket(DS1307_ADDRESS, 10, &ReadAddress, sizeof(ReadAddress), - (uint8_t*)&CurrentRegValues, sizeof(DS1307_DateTimeRegs_t)) != TWI_ERROR_NoError) - { - return false; - } - - // Convert stored time value into decimal - TimeDate->Second = (CurrentRegValues.Byte1.Fields.TenSec * 10) + CurrentRegValues.Byte1.Fields.Sec; - TimeDate->Minute = (CurrentRegValues.Byte2.Fields.TenMin * 10) + CurrentRegValues.Byte2.Fields.Min; - TimeDate->Hour = (CurrentRegValues.Byte3.Fields.TenHour * 10) + CurrentRegValues.Byte3.Fields.Hour; - - // Convert stored date value into decimal - 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; - - return true; -} - -#endif diff --git a/Projects/TempDataLogger/Lib/DS1307.h b/Projects/TempDataLogger/Lib/DS1307.h deleted file mode 100644 index 2e20dbf33..000000000 --- a/Projects/TempDataLogger/Lib/DS1307.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - Copyright (C) Dean Camera, 2013. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -#ifndef _RTC_H_ -#define _RTC_H_ - - /* Includes: */ - #include - - #include - - #include "Config/AppConfig.h" - - /* Type Defines: */ - typedef struct - { - uint8_t Hour; - uint8_t Minute; - uint8_t Second; - uint8_t Day; - uint8_t Month; - uint8_t Year; - } TimeDate_t; - - typedef struct - { - union - { - struct - { - unsigned Sec : 4; - unsigned TenSec : 3; - unsigned CH : 1; - } Fields; - - uint8_t IntVal; - } Byte1; - - union - { - struct - { - unsigned Min : 4; - unsigned TenMin : 3; - unsigned Reserved : 1; - } Fields; - - uint8_t IntVal; - } Byte2; - - union - { - struct - { - unsigned Hour : 4; - unsigned TenHour : 2; - unsigned TwelveHourMode : 1; - unsigned Reserved : 1; - } Fields; - - uint8_t IntVal; - } Byte3; - - union - { - struct - { - unsigned DayOfWeek : 3; - unsigned Reserved : 5; - } Fields; - - uint8_t IntVal; - } Byte4; - - union - { - struct - { - unsigned Day : 4; - unsigned TenDay : 2; - unsigned Reserved : 2; - } Fields; - - uint8_t IntVal; - } Byte5; - - union - { - struct - { - unsigned Month : 4; - unsigned TenMonth : 1; - unsigned Reserved : 3; - } Fields; - - uint8_t IntVal; - } Byte6; - - union - { - struct - { - unsigned Year : 4; - unsigned TenYear : 4; - } Fields; - - uint8_t IntVal; - } Byte7; - } DS1307_DateTimeRegs_t; - - /* Macros: */ - /** TWI address of the DS1307 device on the bus. */ - #define DS1307_ADDRESS 0xD0 - - /* Function Prototypes: */ - 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/RTC.c b/Projects/TempDataLogger/Lib/RTC.c new file mode 100644 index 000000000..00c8baf9b --- /dev/null +++ b/Projects/TempDataLogger/Lib/RTC.c @@ -0,0 +1,159 @@ +/* + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +#include "RTC.h" + +#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) +{ + DS1307_DateTimeRegs_t NewRegValues; + const uint8_t WriteAddress = 0; + + // Convert new time data to the DS1307's time register layout + NewRegValues.Byte1.Fields.TenSec = (NewTimeDate->Second / 10); + NewRegValues.Byte1.Fields.Sec = (NewTimeDate->Second % 10); + NewRegValues.Byte1.Fields.CH = false; + NewRegValues.Byte2.Fields.TenMin = (NewTimeDate->Minute / 10); + NewRegValues.Byte2.Fields.Min = (NewTimeDate->Minute % 10); + NewRegValues.Byte3.Fields.TenHour = (NewTimeDate->Hour / 10); + NewRegValues.Byte3.Fields.Hour = (NewTimeDate->Hour % 10); + NewRegValues.Byte3.Fields.TwelveHourMode = false; + + // Convert new date data to the DS1307's date register layout + NewRegValues.Byte4.Fields.DayOfWeek = 0; + NewRegValues.Byte5.Fields.TenDay = (NewTimeDate->Day / 10); + NewRegValues.Byte5.Fields.Day = (NewTimeDate->Day % 10); + NewRegValues.Byte6.Fields.TenMonth = (NewTimeDate->Month / 10); + NewRegValues.Byte6.Fields.Month = (NewTimeDate->Month % 10); + NewRegValues.Byte7.Fields.TenYear = (NewTimeDate->Year / 10); + NewRegValues.Byte7.Fields.Year = (NewTimeDate->Year % 10); + + // Write the new Time and Date into the DS1307 + if (TWI_WritePacket(DS1307_ADDRESS, 10, &WriteAddress, sizeof(WriteAddress), + (uint8_t*)&NewRegValues, sizeof(DS1307_DateTimeRegs_t)) != TWI_ERROR_NoError) + { + return false; + } + + return true; +} + +bool RTC_GetTimeDate(TimeDate_t* const TimeDate) +{ + DS1307_DateTimeRegs_t CurrentRegValues; + const uint8_t ReadAddress = 0; + + // Read in the stored Time and Date from the DS1307 + if (TWI_ReadPacket(DS1307_ADDRESS, 10, &ReadAddress, sizeof(ReadAddress), + (uint8_t*)&CurrentRegValues, sizeof(DS1307_DateTimeRegs_t)) != TWI_ERROR_NoError) + { + return false; + } + + // Convert stored time value into decimal + TimeDate->Second = (CurrentRegValues.Byte1.Fields.TenSec * 10) + CurrentRegValues.Byte1.Fields.Sec; + TimeDate->Minute = (CurrentRegValues.Byte2.Fields.TenMin * 10) + CurrentRegValues.Byte2.Fields.Min; + TimeDate->Hour = (CurrentRegValues.Byte3.Fields.TenHour * 10) + CurrentRegValues.Byte3.Fields.Hour; + + // Convert stored date value into decimal + 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; + + return true; +} + +#endif diff --git a/Projects/TempDataLogger/Lib/RTC.h b/Projects/TempDataLogger/Lib/RTC.h new file mode 100644 index 000000000..2e20dbf33 --- /dev/null +++ b/Projects/TempDataLogger/Lib/RTC.h @@ -0,0 +1,126 @@ +/* + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +#ifndef _RTC_H_ +#define _RTC_H_ + + /* Includes: */ + #include + + #include + + #include "Config/AppConfig.h" + + /* Type Defines: */ + typedef struct + { + uint8_t Hour; + uint8_t Minute; + uint8_t Second; + uint8_t Day; + uint8_t Month; + uint8_t Year; + } TimeDate_t; + + typedef struct + { + union + { + struct + { + unsigned Sec : 4; + unsigned TenSec : 3; + unsigned CH : 1; + } Fields; + + uint8_t IntVal; + } Byte1; + + union + { + struct + { + unsigned Min : 4; + unsigned TenMin : 3; + unsigned Reserved : 1; + } Fields; + + uint8_t IntVal; + } Byte2; + + union + { + struct + { + unsigned Hour : 4; + unsigned TenHour : 2; + unsigned TwelveHourMode : 1; + unsigned Reserved : 1; + } Fields; + + uint8_t IntVal; + } Byte3; + + union + { + struct + { + unsigned DayOfWeek : 3; + unsigned Reserved : 5; + } Fields; + + uint8_t IntVal; + } Byte4; + + union + { + struct + { + unsigned Day : 4; + unsigned TenDay : 2; + unsigned Reserved : 2; + } Fields; + + uint8_t IntVal; + } Byte5; + + union + { + struct + { + unsigned Month : 4; + unsigned TenMonth : 1; + unsigned Reserved : 3; + } Fields; + + uint8_t IntVal; + } Byte6; + + union + { + struct + { + unsigned Year : 4; + unsigned TenYear : 4; + } Fields; + + uint8_t IntVal; + } Byte7; + } DS1307_DateTimeRegs_t; + + /* Macros: */ + /** TWI address of the DS1307 device on the bus. */ + #define DS1307_ADDRESS 0xD0 + + /* Function Prototypes: */ + 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/TempDataLogger.h b/Projects/TempDataLogger/TempDataLogger.h index 86364f4e3..4fcc1bc86 100644 --- a/Projects/TempDataLogger/TempDataLogger.h +++ b/Projects/TempDataLogger/TempDataLogger.h @@ -48,7 +48,7 @@ #include "Lib/SCSI.h" #include "Lib/DataflashManager.h" #include "Lib/FATFs/ff.h" - #include "Lib/DS1307.h" + #include "Lib/RTC.h" #include "Config/AppConfig.h" #include diff --git a/Projects/TempDataLogger/asf.xml b/Projects/TempDataLogger/asf.xml index 8efbbb5f0..93ae7cf14 100644 --- a/Projects/TempDataLogger/asf.xml +++ b/Projects/TempDataLogger/asf.xml @@ -38,14 +38,11 @@ - - + + - - - diff --git a/Projects/TempDataLogger/makefile b/Projects/TempDataLogger/makefile index 3b97ce226..216d1cdd5 100644 --- a/Projects/TempDataLogger/makefile +++ b/Projects/TempDataLogger/makefile @@ -18,7 +18,7 @@ F_CPU = 8000000 F_USB = $(F_CPU) OPTIMIZATION = s TARGET = TempDataLogger -SRC = $(TARGET).c Descriptors.c Lib/DataflashManager.c Lib/DS1307.c Lib/SCSI.c Lib/FATFs/diskio.c Lib/FATFs/ff.c \ +SRC = $(TARGET).c Descriptors.c Lib/DataflashManager.c Lib/RTC.c Lib/SCSI.c Lib/FATFs/diskio.c Lib/FATFs/ff.c \ $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) $(LUFA_SRC_SERIAL) $(LUFA_SRC_TWI) $(LUFA_SRC_TEMPERATURE) LUFA_PATH = ../../LUFA CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -- cgit v1.2.3