RTC interrupt does not wake up my Arduino
hi everyone!
i'm using ds1337 real time clock generate interrupts wake arduino sleep mode. isn't working out me. when tested external interrupt without sleep mode, in basic program when interrupt occurs works fine. put in sleep mode , try wake external interrupt doesn't happen.
i'm using ds1337 library found here: https://github.com/sridharrajagopal/dsrtclib
'write alarm' function didn't work me used 'getregister' function set alarm myself based on datasheet.
right i'm stuck. don't have idea i'm doing wrong i'm asking me.
thank in advance,
xdinozzox
p.s. code:
i'm using ds1337 real time clock generate interrupts wake arduino sleep mode. isn't working out me. when tested external interrupt without sleep mode, in basic program when interrupt occurs works fine. put in sleep mode , try wake external interrupt doesn't happen.
i'm using ds1337 library found here: https://github.com/sridharrajagopal/dsrtclib
'write alarm' function didn't work me used 'getregister' function set alarm myself based on datasheet.
right i'm stuck. don't have idea i'm doing wrong i'm asking me.
thank in advance,
xdinozzox
p.s. code:
code: [select]
#include <dsrtclib.h>
#include <wire.h>
#include <avr/power.h>
#include <avr/sleep.h>
// definition register addresses
#define al1reg1 0x07
#define al1reg2 0x08
#define al1reg3 0x09
#define al1reg4 0x0a
#define al2reg1 0x0b
#define al2reg2 0x0c
#define al2reg3 0x0d
#define conreg 0x0e
#define stareg 0x0f
/*
ds1339 rtc example
tests , examples common rtc library features.
shows basic functions (reading , setting time/alarm values), converting , forth between epoch seconds , calendar dates,
, using alarm interrupts.
don't let 'binary sketch size' throw you; example file , print statements add lot of overhead.
*/
int ledpin = 6; // led on pin 6
int int_pin = 3; // interrupt pin
int int_number = 1; // int1
ds1339 rtc = ds1339(int_pin, int_number);
void isr(){ // isr function
detachinterrupt(int_number);
rtc.setregister(stareg, b00000000); // reseting alarm flag
}
void entersleep(){ // function entering sleep mode
digitalwrite(ledpin, low);
attachinterrupt(int_number, isr, falling);
set_sleep_mode(sleep_mode_pwr_save);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();
}
/* ----------------- { set } ---------------------------- */
void setup(){
pinmode(int_pin, input);
//digitalwrite(int_pin, high);
pinmode(ledpin, output);
digitalwrite(ledpin, low);
//enable deep sleeping
//set_sleep_mode(sleep_mode_pwr_down);
//sleep_enable();
serial.begin(9600);
serial.println ("dsrtclib tests");
rtc.start(); // make sure rtc running
if(!rtc.time_is_set()){ // set time if not already
serial.print("clock not set. ");
set_time();
}
// warning if osc not working
if(!rtc.time_is_set()){
serial.println("clock did not set! check oscillator working.");
}
delay(100);
// set alarm '2' every minute (at 00 sec)
attachinterrupt(int_number, isr, falling);
//rtc.setregister(0x07, b10000000);
rtc.setregister(al2reg1, b10000000);
rtc.setregister(al2reg2, b10000000);
rtc.setregister(al2reg3, b10000000);
rtc.setregister(conreg, b00011110);
}
/* ----------------- { main program} ---------------------------- */
void loop(){
digitalwrite(ledpin, high);
delay(100);
entersleep();
}
/* ----------------- { functions set , print time - not problem atm } ---------------------------- */
void set_time()
{
serial.println("enter date , time (yyyymmdd hh:mm:ss)");
int year, month, day, hour, minute, second;
int result = read_date(&year, &month, &day, &hour, &minute, &second);
if (result != 0) {
serial.println("date not in correct format!");
return;
}
// set epoch
rtc.setseconds(second);
rtc.setminutes(minute);
rtc.sethours(hour);
rtc.setdays(day);
rtc.setmonths(month);
rtc.setyears(year);
rtc.writetime();
read_time();
}
void read_time()
{
serial.print ("the current time ");
rtc.readtime(); // update rtc library's buffers chip
printtime(0);
serial.println();
}
void printtime(byte type)
{
// print formatted string of current date , time.
// if 'type' non-zero, print alarm value (seconds thru dow/month only)
// function assumes desired time values present in rtc library buffer (e.g. readtime() has been called recently)
if(!type){
serial.print(int(rtc.getmonths()));
serial.print("/");
serial.print(int(rtc.getdays()));
serial.print("/");
serial.print(rtc.getyears());
}
else{
//if(rtc.getdays() == 0) // day-of-week repeating alarm have dayofweek *instead* of date, print that.
{
serial.print(int(rtc.getdayofweek()));
serial.print("th day of week, ");
}
//else
{
serial.print(int(rtc.getdays()));
serial.print("th day of month, ");
}
}
serial.print(" ");
serial.print(int(rtc.gethours()));
serial.print(":");
serial.print(int(rtc.getminutes()));
serial.print(":");
serial.print(int(rtc.getseconds()));
}
int read_int(char sep){
static byte c;
static int i;
= 0;
while (1){
while (!serial.available())
{;}
c = serial.read();
// serial.write(c);
if (c == sep){
// serial.print("return value is");
// serial.println(i);
return i;
}
if (isdigit(c)){
= * 10 + c - '0';
}
else{
serial.print("\r\nerror: \"");
serial.write(c);
serial.print("\" not digit\r\n");
return -1;
}
}
}
int read_int(int numbytes){
static byte c;
static int i;
int num = 0;
= 0;
while (1){
while (!serial.available())
{;}
c = serial.read();
num++;
// serial.write(c);
if (isdigit(c)){
= * 10 + c - '0';
}
else{
serial.print("\r\nerror: \"");
serial.write(c);
serial.print("\" not digit\r\n");
return -1;
}
if (num == numbytes){
// serial.print("return value is");
// serial.println(i);
return i;
}
}
}
int read_date(int *year, int *month, int *day, int *hour, int* minute, int* second){
*year = read_int(4);
*month = read_int(2);
*day = read_int(' ');
*hour = read_int(':');
*minute = read_int(':');
*second = read_int(2);
return 0;
}
i believe want change
attachinterrupt(int_number, isr, falling);
to
attachinterrupt(1, isr, low);
attachinterrupt(int_number, isr, falling);
to
attachinterrupt(1, isr, low);
Arduino Forum > Using Arduino > Programming Questions > RTC interrupt does not wake up my Arduino
arduino
Comments
Post a Comment