有关实时时钟问题

[复制链接]
2900|4
 楼主| huangbingg 发表于 2008-3-28 10:41 | 显示全部楼层 |阅读模式
以下这个程序是基于EasyLPC2200系列的实时时钟实验,我想实现的功能是:先计数,到12:00:00后报警。但现在的问题是:先进行计数了,到12:00:00后也报警了,但是报警后,计数却中止了,没有继续计数。哪位大虾帮我解决下啊,多谢。。。。。<br />注:关键在于void&nbsp;__irq&nbsp;IRQ_RTC(void)这个中断服务子程序中感觉有问题,其它程序都是正确的。。。<br /><br /><br />/*功能:运行RTC进行计时,把秒值输出到LED1~LED8显示<br />&nbsp;&nbsp;同时定时12:00:00报警功能*/<br /><br />#include&nbsp;&quot;config.h&quot;<br /><br />#define&nbsp;SPI_CS&nbsp;0x00000100<br />#define&nbsp;SPI_DATA&nbsp;0x00000040<br />#define&nbsp;SPI_CLK&nbsp;&nbsp;0x00000010<br />#define&nbsp;SPI_IOCON&nbsp;0x00000150<br /><br />#define&nbsp;BEEPCON&nbsp;0x00000080&nbsp;&nbsp;//p0.7引脚控制蜂鸣器,低电平蜂鸣<br /><br /><br />void&nbsp;DelayNs(uint32&nbsp;dly)<br />{<br />&nbsp;&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;for(;dly&gt0;dly--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt5000;i++);<br />}<br /><br />void&nbsp;&nbsp;HC595_SendDat(uint8&nbsp;dat)<br />{<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO0CLR=SPI_CS;<br />&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=SPI_CLK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((dat&0x80)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=SPI_DATA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=SPI_DATA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat&lt&lt=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=SPI_CLK;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=SPI_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SPI_CS=1,输出显示数据<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br />void&nbsp;StartAlarm(void)<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=BEEPCON;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=BEEPCON;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((IO0SET&BEEPCON)==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=BEEPCON;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=BEEPCON;&nbsp;&nbsp;&nbsp;//开始蜂鸣<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNs(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=BEEPCON;&nbsp;&nbsp;&nbsp;//停止蜂鸣<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br /><br />void&nbsp;__irq&nbsp;IRQ_RTC(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(1==(ILR&0x01))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HC595_SendDat(~SEC);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(2==(ILR&0x02))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x02;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartAlarm();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if(ILR==3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;HC595_SendDat(~SEC);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;<br />}<br /><br />void&nbsp;RTCIni(void)<br />{<br />&nbsp;&nbsp;&nbsp;PREINT=Fpclk/32768-1;<br />&nbsp;&nbsp;&nbsp;PREFRAC=Fpclk-(PREINT+1)*32768;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;YEAR=2004;<br />&nbsp;&nbsp;&nbsp;MONTH=2;<br />&nbsp;&nbsp;&nbsp;DOM=19;<br />&nbsp;&nbsp;&nbsp;HOUR=11;<br />&nbsp;&nbsp;&nbsp;MIN=59;<br />&nbsp;&nbsp;&nbsp;SEC=50;<br /><br />&nbsp;&nbsp;&nbsp;ILR=0x03;&nbsp;&nbsp;//清除RTC中断标志<br />&nbsp;&nbsp;&nbsp;ALHOUR=12;&nbsp;//设置小时比较值<br />&nbsp;&nbsp;&nbsp;ALMIN=0;&nbsp;&nbsp;&nbsp;//设置分比较值<br />&nbsp;&nbsp;&nbsp;ALSEC=2;&nbsp;&nbsp;&nbsp;//设置秒比较值<br />&nbsp;&nbsp;&nbsp;AMR=0xf8;&nbsp;&nbsp;//设置报警屏蔽寄存器,只允许时分秒比较<br /><br />&nbsp;&nbsp;&nbsp;CIIR=0x01;<br />&nbsp;&nbsp;&nbsp;CCR=0x01;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntSelect=0x00000000;<br />&nbsp;&nbsp;&nbsp;VICVectCntl0=0x2D;<br />&nbsp;&nbsp;&nbsp;VICVectAddr0=(uint32)IRQ_RTC;<br />&nbsp;&nbsp;&nbsp;VICIntEnable=0x00002000;&nbsp;&nbsp;&nbsp;//使能RTC中断<br />}<br /><br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;PINSEL0=0x00000005;&nbsp;&nbsp;&nbsp;//设置连接到UART0其他为通用I/O口<br />&nbsp;&nbsp;&nbsp;PINSEL1=0x00000000;<br />&nbsp;&nbsp;&nbsp;IO0DIR=SPI_IOCON;&nbsp;&nbsp;&nbsp;&nbsp;//设置LED控制口为输出其他I/O口为输入<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;RTCIni();&nbsp;&nbsp;&nbsp;&nbsp;//初始化RTC<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return(0);<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;
txmac 发表于 2008-3-28 13:44 | 显示全部楼层

ding

  
 楼主| huangbingg 发表于 2008-3-28 15:52 | 显示全部楼层

大家就看下中断程序吧

void&nbsp;__irq&nbsp;IRQ_RTC(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(1==(ILR&0x01))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HC595_SendDat(~SEC);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(2==(ILR&0x02))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x02;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartAlarm();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;<br />}<br />注:ILR寄存器只有两位,bit0为1表示计数中断,bit1为1表示报警中断
 楼主| huangbingg 发表于 2008-3-28 15:57 | 显示全部楼层

,,

其中两个条件语句,前者表明计数秒中断;后者表明计数值与报警预设值匹配,即计数秒中断和报警中断同时产生;<br />   <br />   由于两个中断共用同一中断号,报警后,计数却中止了,没有继续计数,肯定是秒中断位没清零,不知则么清,因为有两个中断在????
后学 发表于 2008-3-28 17:01 | 显示全部楼层

查一下程序吧。。。

建议以后写程序前先画流程图,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

270

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部