[ZLG-ARM] 实时时钟问题

[复制链接]
2370|10
 楼主| txmac 发表于 2008-3-27 22:46 | 显示全部楼层 |阅读模式
<br />以下这个程序只是对实验教程(一)RTC实验1稍作改动,功能如下描述,但为什么只能计数,不能报警?请问周工该程序错在哪呢???<br /><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;<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(10);<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(ILR==1)<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;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ILR==3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartAlarm();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x03;<br />&nbsp;&nbsp;&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=0;&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;<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;
 楼主| txmac 发表于 2008-3-27 22:51 | 显示全部楼层

感觉这个问题出在中断服务程序中,应该如何来判断秒中断和报警中断???<br />void&nbsp;__irq&nbsp;IRQ_RTC(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(ILR==1)<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 /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ILR==3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartAlarm();&nbsp;&nbsp;&nbsp;//开始报警<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ILR=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;<br />}<br />
huangbingg 发表于 2008-3-28 10:30 | 显示全部楼层

当我把这个中断服务子程序改为以下这样时,先计数,然后在12:00:00时报警了,但报警后计数中止,没有正常的继续下去,请问是怎么回事呢???<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;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;<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 />}
 楼主| txmac 发表于 2008-3-28 13:43 | 显示全部楼层

  
 楼主| txmac 发表于 2008-3-28 14:44 | 显示全部楼层

ding

给个反应啊。。。周工,这都是实验教程上的程序,只稍微改动了一下
zlgarm 发表于 2008-3-28 15:21 | 显示全部楼层

中断标志

txmac&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1&nbsp;==(IIR&0x01)),while(2&nbsp;==(IIR&0x01))改为while(0&nbsp;==(IIR&0x01)),while(0&nbsp;==(IIR&0x01)).<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;duty&nbsp;zlgarm_lijintao
huangbingg 发表于 2008-3-28 15:30 | 显示全部楼层

看不懂

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

,,,

楼主他好象没用社么while..吧,周工何出此言???<br /><br />无非是中断没清好的问题...
 楼主| txmac 发表于 2008-3-28 15:52 | 显示全部楼层

xu

周工你搞错了吧。。。。。。。。
xcxxyc 发表于 2008-3-28 15:55 | 显示全部楼层

周公没错啊

  
zlgarm 发表于 2008-3-29 12:06 | 显示全部楼层

楼主,您好!

1、在BBS上我们不提供用户代码的技术支持;<br />2、现在是下班时间,所以稍微看了下您的代码,您的问题主要在清除中断上,不管产生哪种中断,都会把计数中断和报警中断清除。把ILR=0x03;删除就可以了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By:&nbsp;zlgarm_Zhangxiaomeng
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

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