EmbeddedRelated.com
Forums
The 2024 Embedded Online Conference

RTC alarm problem lpc2148

Started by timo_kuisma June 10, 2007
Hi,

I try to use RTC alarm every 5 sec.
And now i ask yuo that why i cant get RTC alarm.
I have RTC backup battery and i use 32MHz external oscillator.

RTC.H is next:
#ifndef __RTC_H
#define __RTC_H

typedef struct {
DWORD RTC_Sec; /* Second value - [0,59] */
DWORD RTC_Min; /* Minute value - [0,59] */
DWORD RTC_Hour; /* Hour value - [0,23] */
DWORD RTC_Mday; /* Day of the month value - [1,31] */
DWORD RTC_Mon; /* Month value - [1,12] */
DWORD RTC_Year; /* Year value - [0,4095] */
DWORD RTC_Wday; /* Day of week value - [0,6] */
DWORD RTC_Yday; /* Day of year value - [1,365] */
} RTCTime;

/*#define CTIME0 0x071F3F3F
#define CTIME1 0x0FFF0F1F
#define CTIME2 0x00000FFF*/

#define IMSEC 0x00000001
#define IMMIN 0x00000002
#define IMHOUR 0x00000004
#define IMDOM 0x00000008
#define IMDOW 0x00000010
#define IMDOY 0x00000020
#define IMMON 0x00000040
#define IMYEAR 0x00000080

#define AMRSEC 0x00000001 /* Alarm mask for Seconds */
#define AMRMIN 0x00000002 /* Alarm mask for Minutes */
#define AMRHOUR 0x00000004 /* Alarm mask for Hours */
#define AMRDOM 0x00000008 /* Alarm mask for Day of Month */
#define AMRDOW 0x00000010 /* Alarm mask for Day of Week */
#define AMRDOY 0x00000020 /* Alarm mask for Day of Year */
#define AMRMON 0x00000040 /* Alarm mask for Month */
#define AMRYEAR 0x00000080 /* Alarm mask for Year */

#define PREINT_RTC 0x000001C8 /* Prescaler value, integer
portion,
PCLK = 15Mhz */
#define PREFRAC_RTC 0x000061C0 /* Prescaler value, fraction
portion, PCLK = 15Mhz */

#define ILR_RTCCIF 0x01
#define ILR_RTCALF 0x02

#define CCR_CLKEN 0x01
#define CCR_CTCRST 0x02
#define CCR_CLKSRC 0x10

extern void RTCHandler (void) __irq;
extern void RTCInit( void );
extern void RTCStart( void );
extern void RTCStop( void );
extern void RTC_CTCReset( void );
extern void RTCSetTime( RTCTime );
extern RTCTime RTCGetTime( void );
extern void RTCSetAlarm( RTCTime );
extern void RTCSetAlarmMask( DWORD AlarmMask );
#endif /* end __RTC_H */

RTC.C is next:
void RTCHandler (void) __irq
{
ILR |= ILR_RTCCIF; /* clear interrupt flag */
IENABLE; /* handles nested interrupt */

alarm_on = 1;

IDISABLE;
VICVectAddr = 0; /* Acknowledge Interrupt */
}

void RTCInit( void )
{
alarm_on = 0;

/*--- Initialize registers ---*/
AMR = 0;
CIIR = 0;
CCR = 0;
PREINT = PREINT_RTC;
PREFRAC = PREFRAC_RTC;
return;
}
void RTCStart( void )
{
/*--- Start RTC counters ---*/
CCR = (CCR_CLKEN | CCR_CLKSRC); //enable 32MHz oscillator
//CCR |= CCR_CLKEN;
ILR = ILR_RTCCIF;
return;
}
void RTCStop( void )
{
/*--- Stop RTC counters ---*/
CCR &= ~CCR_CLKEN;
return;
}
void RTC_CTCReset( void )
{
/*--- Reset CTC ---*/
CCR |= CCR_CTCRST;
return;
}
void RTCSetTime( RTCTime Time )
{
SEC = Time.RTC_Sec;
MIN = Time.RTC_Min;
HOUR = Time.RTC_Hour;
DOM = Time.RTC_Mday;
DOW = Time.RTC_Wday;
DOY = Time.RTC_Yday;
MONTH = Time.RTC_Mon;
YEAR = Time.RTC_Year;
return;
}

void RTCSetAlarm( RTCTime Alarm )
{
ALSEC = Alarm.RTC_Sec;
ALMIN = Alarm.RTC_Min;
ALHOUR = Alarm.RTC_Hour;
ALDOM = Alarm.RTC_Mday;
ALDOW = Alarm.RTC_Wday;
ALDOY = Alarm.RTC_Yday;
ALMON = Alarm.RTC_Mon;
ALYEAR = Alarm.RTC_Year;
return;
}
RTCTime RTCGetTime( void )
{
RTCTime LocalTime;

LocalTime.RTC_Sec = SEC;
LocalTime.RTC_Min = MIN;
LocalTime.RTC_Hour = HOUR;
LocalTime.RTC_Mday = DOM;
LocalTime.RTC_Wday = DOW;
LocalTime.RTC_Yday = DOY;
LocalTime.RTC_Mon = MONTH;
LocalTime.RTC_Year = YEAR;
return LocalTime;
}

void RTCSetAlarmMask( DWORD AlarmMask )
{
/*--- Set alarm mask ---*/
AMR = AlarmMask;
return;
}

int main (void)
{
init_VIC();

/* Initialize RTC module */
RTCInit();
RTCStart();
Local time comes from RTC using backup battery
/*local_time.RTC_Sec = SEC;//0;
local_time.RTC_Min = MIN;//0;
local_time.RTC_Hour = HOUR;//0;
local_time.RTC_Mday = DOM;//8;//8
local_time.RTC_Wday = DOW;//5;
local_time.RTC_Yday = DOY;//0; // current date 2/08/2005
local_time.RTC_Mon = MONTH;//2;
local_time.RTC_Year = YEAR;//2007;
RTCSetTime( local_time ); // Set local time */

alarm_time.RTC_Sec = 5;
alarm_time.RTC_Min = 0;
alarm_time.RTC_Hour = 0;
alarm_time.RTC_Mday = 0;//1
alarm_time.RTC_Wday = 0;
alarm_time.RTC_Yday = 0;//1 /* alarm date 01/01/2006 */
alarm_time.RTC_Mon = 0;//1
alarm_time.RTC_Year = 0;//2007;//2007
RTCSetAlarm( alarm_time ); /* set alarm time */

/* install RTC timer handler mainly for alarm control */
if ( install_irq( RTC_INT, (void *)RTCHandler ) == FALSE )
{
while ( 1 ); /* very bad happened */
}

/* mask off alarm mask, turn on IMYEAR in the counter increment
interrupt register */
RTCSetAlarmMask(AMRSEC
|AMRMIN|AMRHOUR|AMRDOM|AMRDOW|AMRDOY|AMRMON|AMRYEAR);
CIIR = IMSEC;// |IMMIN | IMYEAR;
/* 2006/01/01/00:00:00 is the alarm on */
IODIR1 = 0x80000000;
IOCLR1 = 0x80000000; //led green up
while (1)
{ /* Loop forever */
if ( alarm_on != 0 )
{
alarm_on = 0;
IOSET1 = 0x40000000; //led green low
IODIR1 = 0x80000000;
IOCLR1 = 0x80000000; //led red up
}
}
return 0;
}

An Engineer's Guide to the LPC2100 Series

--- In l..., "timo_kuisma" wrote:
>
> Hi,
>
> I try to use RTC alarm every 5 sec.
> And now i ask yuo that why i cant get RTC alarm.
> I have RTC backup battery and i use 32MHz external oscillator.

If you are really using 32 MHz, it is far too fast. The spec is for
32.768 kHz

Richard
--- In l..., "rtstofer" wrote:
>
> --- In l..., "timo_kuisma" wrote:
> >
> > Hi,
> >
> > I try to use RTC alarm every 5 sec.
> > And now i ask yuo that why i cant get RTC alarm.
> > I have RTC backup battery and i use 32MHz external oscillator.
>
> If you are really using 32 MHz, it is far too fast. The spec is for
> 32.768 kHz
>
> Richard
>

Hi Richard,

I'am sorry. The XTAL is 32.768kHz.

regards
Timo

The 2024 Embedded Online Conference