Commit 7776aa4e authored by Dean Camera's avatar Dean Camera
Browse files

Changed TempDataLogger project's DS1307 driver to simplify the function...

Changed TempDataLogger project's DS1307 driver to simplify the function interface and prevent a possible race condition.
parent 187ccb2e
......@@ -37,6 +37,7 @@
* - Combined page and word ISP programming mode code in the AVRISP-MKII clone project to reduce compiled size and
* increase maintainability of the code
* - Changed over library projects to use the new general ring buffer library driver module
* - Changed TempDataLogger project's DS1307 driver to simplify the function interface and prevent a possible race condition
*
* <b>Fixed:</b>
* - Core:
......
......@@ -7,127 +7,99 @@
#include "DS1307.h"
void DS1307_SetDate(const uint8_t Day,
const uint8_t Month,
const uint8_t Year)
void DS1307_SetTimeDate(const TimeDate_t* NewTimeDate)
{
#if defined(DUMMY_RTC)
return;
#endif
DS1307_TimeRegs_t CurrentRTCTime;
DS1307_DateRegs_t CurrentRTCDate;
CurrentRTCDate.Byte1.Fields.TenDay = (Day / 10);
CurrentRTCDate.Byte1.Fields.Day = (Day % 10);
CurrentRTCDate.Byte2.Fields.TenMonth = (Month / 10);
CurrentRTCDate.Byte2.Fields.Month = (Month % 10);
CurrentRTCDate.Byte3.Fields.TenYear = (Year / 10);
CurrentRTCDate.Byte3.Fields.Year = (Year % 10);
if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10))
{
TWI_SendByte(DS1307_DATEREG_START);
TWI_SendByte(CurrentRTCDate.Byte1.IntVal);
TWI_SendByte(CurrentRTCDate.Byte2.IntVal);
TWI_SendByte(CurrentRTCDate.Byte3.IntVal);
TWI_StopTransmission();
}
}
void DS1307_SetTime(const uint8_t Hour,
const uint8_t Minute,
const uint8_t Second)
{
#if defined(DUMMY_RTC)
return;
#endif
DS1307_TimeRegs_t CurrentRTCTime;
CurrentRTCTime.Byte1.Fields.TenSec = (Second / 10);
CurrentRTCTime.Byte1.Fields.Sec = (Second % 10);
// Convert new time data to the DS1307's time register layout
CurrentRTCTime.Byte1.Fields.TenSec = (NewTimeDate->Second / 10);
CurrentRTCTime.Byte1.Fields.Sec = (NewTimeDate->Second % 10);
CurrentRTCTime.Byte1.Fields.CH = false;
CurrentRTCTime.Byte2.Fields.TenMin = (Minute / 10);
CurrentRTCTime.Byte2.Fields.Min = (Minute % 10);
CurrentRTCTime.Byte3.Fields.TenHour = (Hour / 10);
CurrentRTCTime.Byte3.Fields.Hour = (Hour % 10);
CurrentRTCTime.Byte2.Fields.TenMin = (NewTimeDate->Minute / 10);
CurrentRTCTime.Byte2.Fields.Min = (NewTimeDate->Minute % 10);
CurrentRTCTime.Byte3.Fields.TenHour = (NewTimeDate->Hour / 10);
CurrentRTCTime.Byte3.Fields.Hour = (NewTimeDate->Hour % 10);
CurrentRTCTime.Byte3.Fields.TwelveHourMode = false;
// Convert new date data to the DS1307's date register layout
CurrentRTCDate.Byte1.Fields.TenDay = (NewTimeDate->Day / 10);
CurrentRTCDate.Byte1.Fields.Day = (NewTimeDate->Day % 10);
CurrentRTCDate.Byte2.Fields.TenMonth = (NewTimeDate->Month / 10);
CurrentRTCDate.Byte2.Fields.Month = (NewTimeDate->Month % 10);
CurrentRTCDate.Byte3.Fields.TenYear = (NewTimeDate->Year / 10);
CurrentRTCDate.Byte3.Fields.Year = (NewTimeDate->Year % 10);
if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10))
{
TWI_SendByte(DS1307_TIMEREG_START);
// Must start writing to the first address within the device
TWI_SendByte(0);
// Write time data to the first set of device registers
TWI_SendByte(CurrentRTCTime.Byte1.IntVal);
TWI_SendByte(CurrentRTCTime.Byte2.IntVal);
TWI_SendByte(CurrentRTCTime.Byte3.IntVal);
// Write date data to the second set of device registers
TWI_SendByte(CurrentRTCDate.Byte1.IntVal);
TWI_SendByte(CurrentRTCDate.Byte2.IntVal);
TWI_SendByte(CurrentRTCDate.Byte3.IntVal);
TWI_StopTransmission();
}
}
void DS1307_GetDate(uint8_t* const Day,
uint8_t* const Month,
uint8_t* const Year)
void DS1307_GetTimeDate(TimeDate_t* const TimeDate)
{
#if defined(DUMMY_RTC)
*Day = 1;
*Month = 1;
*Year = 1;
TimeDate->Hour = 1;
TimeDate->Minute = 1;
TimeDate->Second = 1;
TimeDate->Day = 1;
TimeDate->Month = 1;
TimeDate->Year = 1;
return;
#endif
if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10))
{
TWI_SendByte(DS1307_DATEREG_START);
// Must start reading from the first address within the device
TWI_SendByte(0);
TWI_StopTransmission();
}
DS1307_TimeRegs_t CurrentRTCTime;
DS1307_DateRegs_t CurrentRTCDate;
if (TWI_StartTransmission(DS1307_ADDRESS_READ, 10))
{
// First set of registers store the current time
TWI_ReceiveByte(&CurrentRTCTime.Byte1.IntVal, false);
TWI_ReceiveByte(&CurrentRTCTime.Byte2.IntVal, false);
TWI_ReceiveByte(&CurrentRTCTime.Byte3.IntVal, false);
// Second set of registers store the current date
TWI_ReceiveByte(&CurrentRTCDate.Byte1.IntVal, false);
TWI_ReceiveByte(&CurrentRTCDate.Byte2.IntVal, false);
TWI_ReceiveByte(&CurrentRTCDate.Byte3.IntVal, true);
TWI_StopTransmission();
}
*Day = (CurrentRTCDate.Byte1.Fields.TenDay * 10) + CurrentRTCDate.Byte1.Fields.Day;
*Month = (CurrentRTCDate.Byte2.Fields.TenMonth * 10) + CurrentRTCDate.Byte2.Fields.Month;
*Year = (CurrentRTCDate.Byte3.Fields.TenYear * 10) + CurrentRTCDate.Byte3.Fields.Year;
}
void DS1307_GetTime(uint8_t* const Hour,
uint8_t* const Minute,
uint8_t* const Second)
{
#if defined(DUMMY_RTC)
*Hour = 1;
*Minute = 1;
*Second = 1;
return;
#endif
if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10))
{
TWI_SendByte(DS1307_TIMEREG_START);
TWI_StopTransmission();
}
DS1307_TimeRegs_t CurrentRTCTime;
if (TWI_StartTransmission(DS1307_ADDRESS_READ, 10))
{
TWI_ReceiveByte(&CurrentRTCTime.Byte1.IntVal, false);
TWI_ReceiveByte(&CurrentRTCTime.Byte2.IntVal, false);
TWI_ReceiveByte(&CurrentRTCTime.Byte3.IntVal, true);
TWI_StopTransmission();
}
// Convert stored time value into decimal
TimeDate->Second = (CurrentRTCTime.Byte1.Fields.TenSec * 10) + CurrentRTCTime.Byte1.Fields.Sec;
TimeDate->Minute = (CurrentRTCTime.Byte2.Fields.TenMin * 10) + CurrentRTCTime.Byte2.Fields.Min;
TimeDate->Hour = (CurrentRTCTime.Byte3.Fields.TenHour * 10) + CurrentRTCTime.Byte3.Fields.Hour;
*Second = (CurrentRTCTime.Byte1.Fields.TenSec * 10) + CurrentRTCTime.Byte1.Fields.Sec;
*Minute = (CurrentRTCTime.Byte2.Fields.TenMin * 10) + CurrentRTCTime.Byte2.Fields.Min;
*Hour = (CurrentRTCTime.Byte3.Fields.TenHour * 10) + CurrentRTCTime.Byte3.Fields.Hour;
// Convert stored date value into decimal
TimeDate->Day = (CurrentRTCDate.Byte1.Fields.TenDay * 10) + CurrentRTCDate.Byte1.Fields.Day;
TimeDate->Month = (CurrentRTCDate.Byte2.Fields.TenMonth * 10) + CurrentRTCDate.Byte2.Fields.Month;
TimeDate->Year = (CurrentRTCDate.Byte3.Fields.TenYear * 10) + CurrentRTCDate.Byte3.Fields.Year;
}
......@@ -14,6 +14,16 @@
#include <LUFA/Drivers/Peripheral/TWI.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
......@@ -93,25 +103,12 @@
} DS1307_DateRegs_t;
/* Macros: */
#define DS1307_TIMEREG_START 0x00
#define DS1307_DATEREG_START 0x04
#define DS1307_ADDRESS_READ (0xD0 | TWI_ADDRESS_READ)
#define DS1307_ADDRESS_WRITE (0xD0 | TWI_ADDRESS_WRITE)
/* Function Prototypes: */
void DS1307_SetDate(const uint8_t Day,
const uint8_t Month,
const uint8_t Year);
void DS1307_SetTime(const uint8_t Hour,
const uint8_t Minute,
const uint8_t Second);
void DS1307_GetDate(uint8_t* const Day,
uint8_t* const Month,
uint8_t* const Year);
void DS1307_GetTime(uint8_t* const Hour,
uint8_t* const Minute,
uint8_t* const Second);
void DS1307_SetTimeDate(const TimeDate_t* NewTimeDate);
void DS1307_GetTimeDate(TimeDate_t* const TimeDate);
#endif
......@@ -83,18 +83,16 @@ DRESULT disk_ioctl (
DWORD get_fattime (void)
{
uint8_t Day, Month, Year;
uint8_t Hour, Minute, Second;
TimeDate_t CurrTimeDate;
DS1307_GetDate(&Day, &Month, &Year);
DS1307_GetTime(&Hour, &Minute, &Second);
DS1307_GetTimeDate(&CurrTimeDate);
return ((DWORD)(20 + Year) << 25) |
((DWORD)Month << 21) |
((DWORD)Day << 16) |
((DWORD)Hour << 11) |
((DWORD)Minute << 5) |
(((DWORD)Second >> 1) << 0);
return ((DWORD)(20 + CurrTimeDate.Year) << 25) |
((DWORD)CurrTimeDate.Month << 21) |
((DWORD)CurrTimeDate.Day << 16) |
((DWORD)CurrTimeDate.Hour << 11) |
((DWORD)CurrTimeDate.Minute << 5) |
(((DWORD)CurrTimeDate.Second >> 1) << 0);
}
......@@ -113,17 +113,16 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
/* Only log when not connected to a USB host */
if (USB_DeviceState == DEVICE_STATE_Unattached)
{
uint8_t Day, Month, Year;
uint8_t Hour, Minute, Second;
DS1307_GetDate(&Day, &Month, &Year);
DS1307_GetTime(&Hour, &Minute, &Second);
TimeDate_t CurrentTimeDate;
DS1307_GetTimeDate(&CurrentTimeDate);
char LineBuffer[100];
uint16_t BytesWritten;
BytesWritten = sprintf(LineBuffer, "%02d/%02d/20%02d, %02d:%02d:%02d, %d Degrees\r\n",
Day, Month, Year, Hour, Minute, Second, Temperature_GetTemperature());
CurrentTimeDate.Day, CurrentTimeDate.Month, CurrentTimeDate.Year,
CurrentTimeDate.Hour, CurrentTimeDate.Minute, CurrentTimeDate.Second,
Temperature_GetTemperature());
f_write(&TempLogFile, LineBuffer, BytesWritten, &BytesWritten);
f_sync(&TempLogFile);
......@@ -170,9 +169,9 @@ void OpenLogFile(void)
char LogFileName[12];
/* Get the current date for the filename as "DDMMYY.csv" */
uint8_t Day, Month, Year;
DS1307_GetDate(&Day, &Month, &Year);
sprintf(LogFileName, "%02d%02d%02d.csv", Day, Month, Year);
TimeDate_t CurrentTimeDate;
DS1307_GetTimeDate(&CurrentTimeDate);
sprintf(LogFileName, "%02d%02d%02d.csv", CurrentTimeDate.Day, CurrentTimeDate.Month, CurrentTimeDate.Year);
/* Mount the storage device, open the file */
f_mount(0, &DiskFATState);
......@@ -286,8 +285,7 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
{
Device_Report_t* ReportParams = (Device_Report_t*)ReportData;
DS1307_GetDate(&ReportParams->Day, &ReportParams->Month, &ReportParams->Year);
DS1307_GetTime(&ReportParams->Hour, &ReportParams->Minute, &ReportParams->Second);
DS1307_GetTimeDate(&ReportParams->TimeDate);
ReportParams->LogInterval500MS = LoggingInterval500MS_SRAM;
......@@ -310,9 +308,8 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI
const uint16_t ReportSize)
{
Device_Report_t* ReportParams = (Device_Report_t*)ReportData;
DS1307_SetDate(ReportParams->Day, ReportParams->Month, ReportParams->Year);
DS1307_SetTime(ReportParams->Hour, ReportParams->Minute, ReportParams->Second);
DS1307_SetTimeDate(&ReportParams->TimeDate);
/* If the logging interval has changed from its current value, write it to EEPROM */
if (LoggingInterval500MS_SRAM != ReportParams->LogInterval500MS)
......
......@@ -84,15 +84,8 @@
/* Type Defines: */
typedef struct
{
uint8_t Day;
uint8_t Month;
uint8_t Year;
uint8_t Hour;
uint8_t Minute;
uint8_t Second;
uint8_t LogInterval500MS;
TimeDate_t TimeDate;
uint8_t LogInterval500MS;
} Device_Report_t;
/* Function Prototypes: */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment