ADDED - clockChecks() which performs various tests (alarm, osc flag) for callback functions
	ADDED - Alarm call back functions: alarmChecks alarmUnsetCallback alarmSetCallback
	ADDED - Alarm interrupt handling functions: alarmDisableInterrupts alarmSetInterrupt
	ADDED - Square Wave Ouput handling functions: sqwEnable sqwSetRate sqwDisable 
	ADDED - Osc. Check handling and callback functions: clockIntegrityCallback 
	ADDED - New config defines:
			DS1337_USE_ALARM_INTERRUPTS
			DS1337_USE_ALARMS_CALLBACK
			DS1337_USE_OSC_INTEGRITY
			DS1337_USE_SQW_OUTPUT
	REMOV - alarmCheck(bool) functions, to check both at the same time use the callbacks
	MODIF - crystal startup delay moved inside the macro
	MODIF - checkClock renamed to clockCheck and made private!
twiLCD:
	FIXED - callback function now re-enabled use setClrscreenCallback() to set the callback func.
global:
	MODIF - Now including wiring_private.h for all files

git-svn-id: svn+ssh://oldsvn/home/mlalondesvn/svn/cral@3 3ee9b42a-b53c-0410-a25e-f0b6218d5d5b
master
mlalondesvn 17 years ago
parent 39fb915f5d
commit e49320ca37

@ -53,6 +53,6 @@
#define LCD_ENTRY_MODE LCD_ENTRY_AUTOINC #define LCD_ENTRY_MODE LCD_ENTRY_AUTOINC
// Uncomment this if you want clearScreen to call back a function named onClearScreen // Uncomment this if you want clearScreen to call back a function named onClearScreen
//#define LCD_USE_CLRSCREEN_CALLBACK #define LCD_USE_CLRSCREEN_CALLBACK
#endif #endif

@ -37,9 +37,6 @@ DS1337 RTC = DS1337();
#ifdef WIRE_LIB_SCAN_MOD #ifdef WIRE_LIB_SCAN_MOD
int8_t DS1337::Init(void) int8_t DS1337::Init(void)
{ {
// Account for the crystal power up!
delay(250);
// Check address and returns false is there is an error // Check address and returns false is there is an error
if (Wire.checkAddress(DS1337_WADDR)) { if (Wire.checkAddress(DS1337_WADDR)) {
// Possibly set the default registers here // Possibly set the default registers here
@ -53,6 +50,9 @@ int8_t DS1337::Init(void)
{ {
unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF); unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF);
} }
#if defined(DS1337_USE_ALARM_INTERRUPTS) && !defined(DS1337_USE_SQW_OUTPUT)
setRegister(DS1337_SP, DS1337_SQW_INTCN);
#endif
clockStart(); clockStart();
} }
@ -87,16 +87,6 @@ int8_t DS1337::Init(void)
} }
#endif #endif
boolean DS1337::checkClock()
{
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF))
{
return false;
}
return true;
}
void DS1337::setRegister(uint8_t registerNumber, uint8_t registerMask) void DS1337::setRegister(uint8_t registerNumber, uint8_t registerMask)
{ {
writeRegister(registerNumber, SI(getRegister(registerNumber), registerMask)); writeRegister(registerNumber, SI(getRegister(registerNumber), registerMask));
@ -488,13 +478,41 @@ uint8_t DS1337::binToBcd(uint8_t val)
* Alarm support functions * Alarm support functions
**/ **/
#ifdef DS1337_USE_ALARMS #ifdef DS1337_USE_ALARMS
void DS1337::alarmSelect(boolean alarm) void DS1337::alarmSelect(boolean alarm)
{ {
alarmId = alarm; alarmId = alarm;
return; return;
} }
#ifdef DS1337_USE_ALARMS_CALLBACK
void DS1337::alarmSetCallback(void (*userFunc)(void))
{
DS1337callbackFunc[(alarmId ? 1 : 0)] = userFunc;
}
void DS1337::alarmUnsetCallback(void)
{
DS1337callbackFunc[(alarmId ? 1 : 0)] = 0;
}
void DS1337::alarmChecks(void)
{
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A1F))
{
unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F); delay(10);
if (DS1337callbackFunc) DS1337callbackFunc[0]();
}
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A2F))
{
unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F); delay(10);
if (DS1337callbackFunc) DS1337callbackFunc[1]();
}
return;
}
#endif
void DS1337::alarmSet(uint8_t timeSection, uint8_t timeValue) void DS1337::alarmSet(uint8_t timeSection, uint8_t timeValue)
{ {
if (timeSection > DS1337_ALARM_DT) return; if (timeSection > DS1337_ALARM_DT) return;
@ -560,26 +578,6 @@ void DS1337::alarmSet(uint8_t timeSection, uint8_t timeValue)
alarmSave(); alarmSave();
} }
boolean DS1337::alarmCheck(boolean both)
{
if (!both) return alarmCheck();
bool res;
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A2F))
{
res = true;
}
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A1F))
{
unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F);
unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F);
res = true;
} else if (res) res = false;
return res;
}
boolean DS1337::alarmCheck(void) boolean DS1337::alarmCheck(void)
{ {
if (getRegisterBit(DS1337_STATUS, (alarmId == false ? DS1337_STATUS_A1F : DS1337_STATUS_A2F))) if (getRegisterBit(DS1337_STATUS, (alarmId == false ? DS1337_STATUS_A1F : DS1337_STATUS_A2F)))
@ -607,8 +605,86 @@ void DS1337::alarmSave(void)
delay(5); delay(5);
} }
#ifdef DS1337_USE_ALARM_INTERRUPTS
void DS1337::alarmDisableInterrupts(void)
{
unsetRegister(DS1337_SP, DS1337_ALARM_INT1);
unsetRegister(DS1337_SP, DS1337_ALARM_INT2);
return;
}
void DS1337::alarmSetInterrupt(void)
{
#ifndef DS1337_USE_SQW_OUTPUT
if (alarmId) setRegister(DS1337_SP, DS1337_SQW_INTCN);
#endif
setRegister(DS1337_SP, (alarmId == false ? DS1337_ALARM_INT1 : DS1337_ALARM_INT2));
return;
}
void DS1337::alarmUnsetInterrupt(void)
{
unsetRegister(DS1337_SP, (alarmId == false ? DS1337_ALARM_INT1 : DS1337_ALARM_INT2));
return;
}
#endif
#endif
#ifdef DS1337_USE_SQW_OUTPUT
void DS1337::sqwEnable(void)
{
unsetRegister(DS1337_SP, DS1337_SQW_INTCN);
return;
}
void DS1337::sqwDisable(void)
{
setRegister(DS1337_SP, DS1337_SQW_INTCN);
return;
}
void DS1337::sqwSetRate(uint8_t sqwRate)
{
writeRegister(DS1337_SP, (getRegisterSP() & ~DS1337_SQW_RS | sqwRate));
return;
}
#endif
#ifdef DS1337_USE_OSC_INTEGRITY
void DS1337::clockIntegrityCallback(void (*userFunc)(void))
{
DS1337callbackFunc[2] = userFunc;
}
#endif
#if defined(DS1337_USE_ALARMS_CALLBACK) || defined(DS1337_USE_OSC_INTEGRITY)
void DS1337::clockChecks(void)
{
#ifdef DS1337_USE_OSC_INTEGRITY
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF))
{
clockStop();
unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF);
unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F);
unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F);
if (DS1337callbackFunc[2]) DS1337callbackFunc[2]();
return;
}
#endif
#ifdef DS1337_USE_ALARMS_CALLBACK
alarmChecks();
#endif
}
#endif #endif
#ifdef DS1337_DEBUG
void DS1337::printRegisters(void) void DS1337::printRegisters(void)
{ {
for(int ii=0;ii<0x10;ii++) for(int ii=0;ii<0x10;ii++)
@ -621,3 +697,4 @@ void DS1337::printRegisters(void)
delay(200); delay(200);
} }
#endif

@ -4,10 +4,10 @@
#ifndef DS1337_h #ifndef DS1337_h
#define DS1337_h #define DS1337_h
#define DS1337_DEBUG
// include types & constants of Wiring core API // include types & constants of Wiring core API
#include <WConstants.h> #include "../global.h"
#include <inttypes.h>
// include types & constants of Wire ic2 lib // include types & constants of Wire ic2 lib
#include <Wire/Wire.h> #include <Wire/Wire.h>
@ -28,6 +28,21 @@
// Uncomment this to support alarms // Uncomment this to support alarms
#define DS1337_USE_ALARMS #define DS1337_USE_ALARMS
#ifdef DS1337_USE_ALARMS
// Uncomment this to allow use external alarm interrupts
#define DS1337_USE_ALARM_INTERRUPTS
// Uncomment this to allow alarm functions callback
#define DS1337_USE_ALARMS_CALLBACK
#endif
// Uncomment this to use integrity check functions
//#define DS1337_USE_OSC_INTEGRITY
// Uncomment this to support square wave output
// If this is enabled, alarm 2 will output it's interrupt on INTA
#define DS1337_USE_SQW_OUTPUT
/** /**
* Define the position of the RTC buffer values * Define the position of the RTC buffer values
**/ **/
@ -118,14 +133,31 @@
#define DS1337_ALARM_M3 B00000100 #define DS1337_ALARM_M3 B00000100
#define DS1337_ALARM_M4 B00001000 #define DS1337_ALARM_M4 B00001000
// Alarm interrupt bitmask
#define DS1337_ALARM_INT1 B00000001
#define DS1337_ALARM_INT2 B00000010
// Square Wave output masks
#define DS1337_SQW_INTCN B00000100
#define DS1337_SQW_RS1 B00001000
#define DS1337_SQW_RS2 B00010000
// Square Wave output modes
#define DS1337_SQW_RS B00011000
#define DS1337_SQW_1HZ B00000000
#define DS1337_SQW_4096KHZ DS1337_SQW_RS1
#define DS1337_SQW_8192KHZ DS1337_SQW_RS2
#define DS1337_SQW_OSC DS1337_SQW_RS1 | DS1337_SQW_RS2
/** /**
* Macros * Macros
**/ **/
#define clockStart() unsetRegister(DS1337_SP, DS1337_SP_EOSC) // Starts the oscillator and delay a little to account for long oscillator startup times
#define clockStart() unsetRegister(DS1337_SP, DS1337_SP_EOSC); delay(500);
#define clockStop() setRegister(DS1337_SP, DS1337_SP_EOSC) #define clockStop() setRegister(DS1337_SP, DS1337_SP_EOSC)
#define getRegisterSP() getRegisterSP(DS1337_SP) #define getRegisterSP() getRegister(DS1337_SP)
#define getRegisterStatus() getRegisterStatus(DS1337_STATUS) #define getRegisterStatus() getRegister(DS1337_STATUS)
#define getRegisterBit(reg, bitMask) (getRegister(reg) & bitMask) && bitMask #define getRegisterBit(reg, bitMask) (getRegister(reg) & bitMask) && bitMask
@ -182,6 +214,13 @@
#define clockGetRDow() clockGet(DS1337_DOW, true) #define clockGetRDow() clockGet(DS1337_DOW, true)
#if defined(DS1337_USE_ALARMS_CALLBACK) || defined(DS1337_USE_OSC_INTEGRITY)
/**
* Holds the pointer to callback functions
**/
volatile static voidFuncPtr DS1337callbackFunc[3];
#endif
// library interface description // library interface description
class DS1337 class DS1337
{ {
@ -202,13 +241,20 @@ class DS1337
* If the I2C scan mod is available, it'll verify the RTC is reachable * If the I2C scan mod is available, it'll verify the RTC is reachable
**/ **/
int8_t Init(void); int8_t Init(void);
#ifdef DS1337_USE_OSC_INTEGRITY
/** /**
* checkClock: verifies the clock integrity * chockSetIntegrityCallback: allow setting the callback function
* Returns false when the integrity check fails * for the oscillator fault check.
**/ **/
boolean checkClock(); void clockIntegrityCallback(void (*)(void));
#endif
#if defined(DS1337_USE_ALARMS_CALLBACK) || defined(DS1337_USE_OSC_INTEGRITY)
/**
* clockChecks: performs various clock checks such as integrity and alarms
* Will trigger the
**/
void clockChecks(void);
#endif
/** /**
* setRegister: sets a register bit fromt he register number and bitmask * setRegister: sets a register bit fromt he register number and bitmask
**/ **/
@ -260,12 +306,12 @@ class DS1337
* Use the clockSet macro to access this function! * Use the clockSet macro to access this function!
**/ **/
void clockSetWithUTS(uint32_t, boolean); void clockSetWithUTS(uint32_t, boolean);
#ifdef DS1337_DEBUG
/** /**
* Prints all of the DS1337 registers * Prints all of the DS1337 registers
**/ **/
void printRegisters(void); void printRegisters(void);
#endif
#ifdef DS1337_USE_ALARMS #ifdef DS1337_USE_ALARMS
/** /**
* alarmSelect: allows selection of the DS1337 alarm 1 or 2 * alarmSelect: allows selection of the DS1337 alarm 1 or 2
@ -284,6 +330,62 @@ class DS1337
**/ **/
boolean alarmCheck(boolean); boolean alarmCheck(boolean);
boolean alarmCheck(void); // Same as above using false boolean alarmCheck(void); // Same as above using false
#ifdef DS1337_USE_ALARMS_CALLBACK
/**
* alarmSetCallback: allows setting of a callback function associated with alarm
* The function will be passed a boolean indicating which of alarm1 (false) or alarm2 (true)
* triggered the callback
**/
void alarmSetCallback(void (*)(void));
/**
* alarmUnsetCallback: removes the callback function attached to the current alarm
**/
void alarmUnsetCallback(void);
/**
* alarmChecks: will trigger the callback function if an alarm is high
* This function need to be placed somewhere in the main loop
**/
void alarmChecks(void);
#endif
#ifdef DS1337_USE_ALARM_INTERRUPTS
/**
* alarmDisableInterrupts: disables all alarm interrupts
**/
void alarmDisableInterrupts(void);
/**
* alarmSetInterrupt: sets the alarm interrupt for the selected alarm
**/
void alarmSetInterrupt(void);
/**
* alarmUnsetInterrupt: disable interrupt for the select alarm
**/
void alarmUnsetInterrupt(void);
#endif
#endif
#ifdef DS1337_USE_SQW_OUTPUT
/**
* sqwEnable: Enable the square wave output on SQW/INTB
* If this is enabled and an interrupt is set for alarm 2
* the interrupt will INTA instead of SQW/INTB
**/
void sqwEnable(void);
/**
* sqwDisable: Disables the square wave output on SQW/INTB
**/
void sqwDisable(void);
/**
* sqwSetRate: Sets the square wave rate
**/
void sqwSetRate(uint8_t sqwRate);
#endif #endif
private: private:
/** /**
@ -328,7 +430,6 @@ class DS1337
* Hold the buffer for alarm manipulation * Hold the buffer for alarm manipulation
**/ **/
uint8_t rtc_alarm[4]; uint8_t rtc_alarm[4];
/** /**
* alarmId: keeps track of which alarm we are working with * alarmId: keeps track of which alarm we are working with
**/ **/

@ -8,6 +8,7 @@ extern "C" {
#include <inttypes.h> #include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include "wiring_private.h"
#include "wiring.h" #include "wiring.h"
#include "WConstants.h" #include "WConstants.h"

@ -193,7 +193,7 @@ void twiLCD::clearScreen(void)
#endif #endif
#ifdef LCD_USE_CLRSCREEN_CALLBACK #ifdef LCD_USE_CLRSCREEN_CALLBACK
onClearScreen(); if (twiLCDcallbackFunc[0]) twiLCDcallbackFunc[0]();
#endif #endif
} }
@ -210,7 +210,7 @@ void twiLCD::printString_P(const char *data)
#if defined(__AVR_ATmega168__) && !defined(TWI_LCD_SMALL) #if defined(__AVR_ATmega168__) && !defined(TWI_LCD_SMALL)
#ifdef TWI_LCD_USE_TIMEOUT #ifdef TWI_LCD_USE_TIMEOUT
bool twiLCD::checkTimeout(void) boolean twiLCD::checkTimeout(void)
{ {
if (displayStatus && millis() - previousMillis > TWI_LCD_TIMEOUT) { if (displayStatus && millis() - previousMillis > TWI_LCD_TIMEOUT) {
turnOff(); turnOff();
@ -425,3 +425,10 @@ void twiLCD::printInteger(int16_t integer)
} }
#endif #endif
#ifdef LCD_USE_CLRSCREEN_CALLBACK
void twiLCD::setClrscreenCallback(void (*userFunc)(void))
{
twiLCDcallbackFunc[0] = userFunc;
}
#endif

@ -1,8 +1,8 @@
#ifndef twiLCD_H #ifndef twiLCD_H
#define twiLCD_H #define twiLCD_H
#include "../global.h"
#include <inttypes.h>
#include "../configs/LCD/lcd.h"
#include "twiLCDConfig.h" #include "twiLCDConfig.h"
#define PCF8574_WADDR 0x20 #define PCF8574_WADDR 0x20
@ -29,6 +29,10 @@
#define printString(str) printString_P(PSTR(str)) #define printString(str) printString_P(PSTR(str))
#endif #endif
#ifdef LCD_USE_CLRSCREEN_CALLBACK
volatile static voidFuncPtr twiLCDcallbackFunc[1];
#endif
class twiLCD { class twiLCD {
public: public:
/** /**
@ -45,7 +49,7 @@
* writeData: write a byte of data to the LCD * writeData: write a byte of data to the LCD
* @param: value: the byte to write * @param: value: the byte to write
**/ **/
void writeData(uint8_t value); void writeData(uint8_t);
/** /**
* clearScreen: clears the LCD and resets the cursor position to 0,0 * clearScreen: clears the LCD and resets the cursor position to 0,0
@ -56,7 +60,11 @@
* printString_P: prints a program string to the LCD * printString_P: prints a program string to the LCD
* To call this function, use the LCD.printString() macro! * To call this function, use the LCD.printString() macro!
**/ **/
void printString_P(const char *data); void printString_P(const char *);
#ifdef LCD_USE_CLRSCREEN_CALLBACK
void setClrscreenCallback(void (*)(void));
#endif
/** /**
* These function are only available on the mega168 for space reasons * These function are only available on the mega168 for space reasons
**/ **/
@ -67,7 +75,7 @@
* Returns true if the time is expired * Returns true if the time is expired
**/ **/
#ifdef TWI_LCD_USE_TIMEOUT #ifdef TWI_LCD_USE_TIMEOUT
bool checkTimeout(void); boolean checkTimeout(void);
#endif #endif
/** /**

@ -36,7 +36,10 @@
#define TWI_LCD_DB_LEVEL 225 #define TWI_LCD_DB_LEVEL 225
#endif #endif
#endif #endif
// End LCD Control
#endif #endif
// End Small version
#endif #endif
#endif #endif

Loading…
Cancel
Save