EPSON RX8010SJ RTC 调试笔记之四, 报警中断功能 (Alarm Interrupt Function)

硬件: EPSON RX8010 SJ


功能描述:

报警中断功能 (Alarm Interrupt Function) 分日期或周两种报警模式,于设定时间(小时和分钟)产生中断事件。

当报警中断事件产生时,AF 标志位会被置 "1", 引脚 IRQ1 电平被置低为 "0" . 当报警中断触发后的 1.46mS (最大时间), AF 标志位和 IRQ1 输出状态会被改变. 

IRQ1="L" 会保持,除非给予强制中止指令

** 清除标志寄存器 FLAG Register 的标志位 AF 为 "0", IRQ1 输出则会为返回高电平或 Hi-Z 状态. 


报警中断具体功能

1. 周模式;  <扩展寄存器 Extension Register 标志位 WADA="0">
    1.1 一周中每天指定 hh:mm 时间产生报警中断;
    1.2 一周中某天或某几天, 于 hh:?? 时间产生小时整点报警; (分钟设定被忽略)
    1.3 一周中某天或某几天, 于每个小时的 ??:mm 时间产生报警; (小时设定被忽略)

2. 日期模式;  <扩展寄存器 Extension Register 标志位 WADA="1">
    2.1 每天指定 hh:mm 时间产生报警中断;
    2.2 于某天 hh:?? 时间产生小时整点报警; (分钟设定被忽略)
    2.3 于某天每个小时的 ??:mm 时间产生报警; (小时设定被忽略)


设定报警中断功能流程


功能图

?! IRQ1 中断触发后,AF bit 复位为 "0" 时, 程序中 IRQ1 低电平中断再次触发一次, 须特别注意,目前尚未找到原因; ?? IRQ1 为 Hi-Z 输出信号造成?


涉及相关寄存器


寄存器设置规则




设定举例


功能函数


/** Alarm Interrupt Function -- START -- **/

void RX8010SJ_AIF_reset_FLAG_AF(void);
void RX8010SJ_AIF_unable_CTRL_AIE(void);
void RX8010SJ_AIF_enable_CTRL_AIE(void);

void RX8010SJ_AIF_set_WEEK_MODE_of_EXT_WADA(void);
void RX8010SJ_AIF_set_DAY_MODE_of_EXT_WADA(void);

void RX8010SJ_AIF_unable_ALARM_MIN(void);
void RX8010SJ_AIF_unable_ALARM_HOUR(void);
void RX8010SJ_AIF_unable_ALARM_WEEK_OR_DAY(void);

void RX8010SJ_AIF_set_ALARM_MIN(uint8_t minute);
void RX8010SJ_AIF_set_ALARM_HOUR(uint8_t hour);
void RX8010SJ_AIF_set_ALARM_WEEK_OR_DAY(uint8_t para);
	
void RX8010SJ_AIF_trigger_by_per_minute(void);																					// ALARM trigger by per minute, 条件: all AE = 1, WADA 没关系
void RX8010SJ_AIF_trigger_every_day_set_time(uint8_t hour_para,uint8_t min_para);				// AIF 报警中断功能: 每天某个设定时间(hh:mm)报警 
void RX8010SJ_AIF_trigger_WEEK_MODE_hour_on_time(uint8_t week_para,uint8_t hour_para);	// AIF 报警中断功能: 周模式下,某天或某几天的小时准点(hh:??)报警, 分钟被忽略 
void RX8010SJ_AIF_trigger_WEEK_MODE_minute_on_time(uint8_t week_para,uint8_t min_para);	// AIF 报警中断功能: 周模式下,某天或某几天的分钟(??:mm)报警, 小时被忽略
void RX8010SJ_AIF_trigger_DAY_MODE_hour_on_time(uint8_t day_para,uint8_t hour_para);		// AIF 报警中断功能: 日期模式下,某天的小时准点(hh:??)报警, 分钟被忽略 
void RX8010SJ_AIF_trigger_DAY_MODE_minute_on_time(uint8_t day_para,uint8_t min_para);		// AIF 报警中断功能: 日期模式下,某天或某几天的分钟(??:mm)报警, 小时被忽略

/** Alarm Interrupt Function,AIF -- END -- **/



/** Alarm Interrupt Function -- START -- **/

void RX8010SJ_AIF_reset_FLAG_AF(void)
{
		RX8010SJ_reset_bit_FLAG_AF();
}


void RX8010SJ_AIF_unable_CTRL_AIE(void)
{
		RX8010SJ_write_bit_CTRL_AIE( RX8010SJ_BIT_UNABLE );
}

void RX8010SJ_AIF_enable_CTRL_AIE(void)
{
		RX8010SJ_write_bit_CTRL_AIE( RX8010SJ_BIT_ENABLE );
}

void RX8010SJ_AIF_set_WEEK_MODE_of_EXT_WADA(void)
{
		RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_WEEK );		// 0: WEEK, 1: DAY
}

void RX8010SJ_AIF_set_DAY_MODE_of_EXT_WADA(void)
{
		RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_DAY );		// 0: WEEK, 1: DAY
}

void RX8010SJ_AIF_unable_ALARM_MIN(void)
{
		RX8010SJ_write_reg_ALARM_MIN( 0x80 );						// ALARM_MIN  AE = "1"
}
	
void RX8010SJ_AIF_unable_ALARM_HOUR(void)
{
		RX8010SJ_write_reg_ALARM_HOUR( 0x80 );					// ALARM_HOUR  AE = "1"
}

void RX8010SJ_AIF_unable_ALARM_WEEK_OR_DAY(void)
{
		RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( 0x80 );		// ALARM_WEEK_OR_DAY  AE = "1"
}


void RX8010SJ_AIF_set_ALARM_MIN(uint8_t minute)
{
		RX8010SJ_write_reg_ALARM_MIN( minute );
}

void RX8010SJ_AIF_set_ALARM_HOUR(uint8_t hour)
{
		RX8010SJ_write_reg_ALARM_HOUR( hour );
}

void RX8010SJ_AIF_set_ALARM_WEEK_OR_DAY(uint8_t para)
{
		RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( para );
}

// ALARM trigger by per minute, 条件: all AE = 1, WADA 没关系
void RX8010SJ_AIF_trigger_by_per_minute(void)
{
	RX8010SJ_AIF_unable_CTRL_AIE();
	RX8010SJ_AIF_reset_FLAG_AF();
	
//	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_WEEK );		// 0: WEEK, 1: DAY
//	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_DAY );		// 0: WEEK, 1: DAY

	RX8010SJ_write_reg_ALARM_MIN( 0x80 );						// ALARM_MIN  AE = "1"
	RX8010SJ_write_reg_ALARM_HOUR( 0x80 );					// ALARM_HOUR  AE = "1"
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( 0x80 );		// ALARM_WEEK_OR_DAY  AE = "1"
	
	RX8010SJ_AIF_enable_CTRL_AIE();
}

// AIF 报警中断功能: 每天某个设定时间(hh:mm)报警 
void RX8010SJ_AIF_trigger_every_day_set_time(uint8_t hour_para,uint8_t min_para)
{
	RX8010SJ_AIF_unable_CTRL_AIE();
	RX8010SJ_AIF_reset_FLAG_AF();
	/*
	RX8010SJ_write_bit_EXT_WADA( AIF_MODE_WEEK );		// 0: WEEK, 1: DAY
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( 0x7F );		// 每周每天工作模式设定, 功能等同	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( 0x80 )
*/
	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_DAY );		// 0: WEEK, 1: DAY
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( 0x80 );
	
	RX8010SJ_write_reg_ALARM_MIN( min_para );
	RX8010SJ_write_reg_ALARM_HOUR( hour_para );
	
	RX8010SJ_AIF_enable_CTRL_AIE();
}

// AIF 报警中断功能: 周模式下,某天或某几天的小时准点(hh:??)报警, 分钟被忽略 
void RX8010SJ_AIF_trigger_WEEK_MODE_hour_on_time(uint8_t week_para,uint8_t hour_para)
{
	RX8010SJ_AIF_unable_CTRL_AIE();
	RX8010SJ_AIF_reset_FLAG_AF();
	
	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_WEEK );		// 0: WEEK, 1: DAY
	
	RX8010SJ_write_reg_ALARM_MIN( 0x80 );								// ALARM_MIN  AE = "1"
	RX8010SJ_write_reg_ALARM_HOUR( hour_para );
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( week_para );	// ALARM_WEEK_OR_DAY, AE = "0"
	
	RX8010SJ_AIF_enable_CTRL_AIE();
}

// AIF 报警中断功能: 周模式下,某天或某几天的分钟(??:mm)报警, 小时被忽略
void RX8010SJ_AIF_trigger_WEEK_MODE_minute_on_time(uint8_t week_para,uint8_t min_para)
{
	RX8010SJ_AIF_unable_CTRL_AIE();
	RX8010SJ_AIF_reset_FLAG_AF();
	
	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_WEEK );		// 0: WEEK, 1: DAY
	
	RX8010SJ_write_reg_ALARM_MIN( min_para );								
	RX8010SJ_write_reg_ALARM_HOUR( 0x80 );							// ALARM_HOUR  AE = "1"
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( week_para );	// ALARM_WEEK_OR_DAY, AE = "0"
	
	RX8010SJ_AIF_enable_CTRL_AIE();
}


// AIF 报警中断功能: 日期模式下,某天的小时准点(hh:??)报警, 分钟被忽略 
void RX8010SJ_AIF_trigger_DAY_MODE_hour_on_time(uint8_t day_para,uint8_t hour_para)
{
	RX8010SJ_AIF_unable_CTRL_AIE();
	RX8010SJ_AIF_reset_FLAG_AF();
	
	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_DAY );		// 0: WEEK, 1: DAY
	
	RX8010SJ_write_reg_ALARM_MIN( 0x80 );								// ALARM_MIN  AE = "1" 
	RX8010SJ_write_reg_ALARM_HOUR( hour_para );
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( day_para );	// ALARM_WEEK_OR_DAY, AE = "0"
	
	RX8010SJ_AIF_enable_CTRL_AIE();
}

// AIF 报警中断功能: 日期模式下,某天或某几天的分钟(??:mm)报警, 小时被忽略
void RX8010SJ_AIF_trigger_DAY_MODE_minute_on_time(uint8_t day_para,uint8_t min_para)
{
	RX8010SJ_AIF_unable_CTRL_AIE();
	RX8010SJ_AIF_reset_FLAG_AF();
	
	RX8010SJ_write_bit_EXT_WADA( RX8010SJ_EXT_WADA_AIF_MODE_DAY );						// 0: WEEK, 1: DAY
	
	RX8010SJ_write_reg_ALARM_MIN( min_para );								
	RX8010SJ_write_reg_ALARM_HOUR( 0x80 );									// ALARM_HOUR  AE = "1"
	RX8010SJ_write_reg_ALARM_WEEK_OR_DAY( day_para );				// ALARM_WEEK_OR_DAY, AE = "0"
	
	RX8010SJ_AIF_enable_CTRL_AIE();
}

/** Alarm Interrupt Function,AIF -- END -- **/

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值