打印
[ZLG-ARM]

实时时钟问题

[复制链接]
1086|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txmac|  楼主 | 2008-3-27 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

以下这个程序只是对实验教程(一)RTC实验1稍作改动,功能如下描述,但为什么只能计数,不能报警?请问周工该程序错在哪呢???

急。。。。。。。。。。。。。。。。。谢谢!

/*功能:运行RTC进行计时,把秒值输出到LED1~LED8显示
  同时定时12:00:00报警功能*/

#include "config.h"

#define SPI_CS 0x00000100
#define SPI_DATA 0x00000040
#define SPI_CLK  0x00000010
#define SPI_IOCON 0x00000150

#define BEEPCON 0x00000080  //p0.7引脚控制蜂鸣器,低电平蜂鸣


void DelayNs(uint32 dly)
{
   uint32 i;
   for(;dly>0;dly--)
     for(i=0;i<5000;i++);
}

void  HC595_SendDat(uint8 dat)
{
   uint8 i;
   
   IO0CLR=SPI_CS;
   for(i=0;i<8;i++)
   {
      IO0CLR=SPI_CLK;
      
      if((dat&0x80)!=0)
        IO0SET=SPI_DATA;
      else
        IO0CLR=SPI_DATA;
      dat<<=1;
      IO0SET=SPI_CLK;
    }
    IO0SET=SPI_CS;         //SPI_CS=1,输出显示数据
    
}


void StartAlarm(void)

     IO0DIR=BEEPCON;
   
     if((IO0SET&BEEPCON)==0)
        IO0SET=BEEPCON;
     else
     {
        IO0CLR=BEEPCON;   //开始蜂鸣
        DelayNs(10);
        IO0SET=BEEPCON;   //停止蜂鸣
      }

}


void __irq IRQ_RTC(void)
{
    if(ILR==1)
    {
       ILR=0x01;
       HC595_SendDat(~SEC);
 
       if(ILR==3)
      {
        
         StartAlarm();
         ILR=0x03;
      }
    }
      ILR=0x03;
      VICVectAddr=0x00;
}

void RTCIni(void)
{
   PREINT=Fpclk/32768-1;
   PREFRAC=Fpclk-(PREINT+1)*32768;
   
   YEAR=2004;
   MONTH=2;
   DOM=19;
   HOUR=11;
   MIN=59;
   SEC=50;

   ILR=0x03;  //清除RTC中断标志
   ALHOUR=12; //设置小时比较值
   ALMIN=0;   //设置分比较值
   ALSEC=0;   //设置秒比较值
   AMR=0xf8;  //设置报警屏蔽寄存器,只允许时分秒比较

   CIIR=0x01;
   CCR=0x01;
   
   VICIntSelect=0x00000000;
   VICVectCntl0=0x2D;
   VICVectAddr0=(uint32)IRQ_RTC;
   VICIntEnable=0x00002000;   //使能RTC中断
}


int main(void)
{
  
   PINSEL0=0x00000005;   //设置连接到UART0其他为通用I/O口
   PINSEL1=0x00000000;
   IO0DIR=SPI_IOCON;    //设置LED控制口为输出其他I/O口为输入
   
   
   RTCIni();    //初始化RTC
   
   while(1);
    
   return(0);
}
      

相关帖子

沙发
txmac|  楼主 | 2008-3-27 22:51 | 只看该作者

感觉这个问题出在中断服务程序中,应该如何来判断秒中断和报警中断???
void __irq IRQ_RTC(void)
{
    if(ILR==1)
    {
       ILR=0x01;
       HC595_SendDat(~SEC);

       if(ILR==3)
      {
        
         StartAlarm();   //开始报警
         ILR=0x03;
      }
    }
      ILR=0x03;
      VICVectAddr=0x00;
}

使用特权

评论回复
板凳
huangbingg| | 2008-3-28 10:30 | 只看该作者

当我把这个中断服务子程序改为以下这样时,先计数,然后在12:00:00时报警了,但报警后计数中止,没有正常的继续下去,请问是怎么回事呢???

    void __irq IRQ_RTC(void)
{
    if(1==(ILR&0x01))
    {
       ILR=0x01;
       HC595_SendDat(~SEC);
    }
 
    if(2==(ILR&0x02))
    {
       ILR=0x02;
       StartAlarm();
       
    }
        
    ILR=0x03;
    VICVectAddr=0x00;
}

使用特权

评论回复
地板
txmac|  楼主 | 2008-3-28 13:43 | 只看该作者

使用特权

评论回复
5
txmac|  楼主 | 2008-3-28 14:44 | 只看该作者

ding

给个反应啊。。。周工,这都是实验教程上的程序,只稍微改动了一下

使用特权

评论回复
6
zlgarm| | 2008-3-28 15:21 | 只看该作者

中断标志

txmac 您好!
    while(1 ==(IIR&0x01)),while(2 ==(IIR&0x01))改为while(0 ==(IIR&0x01)),while(0 ==(IIR&0x01)).
                      On duty zlgarm_lijintao

使用特权

评论回复
7
huangbingg| | 2008-3-28 15:30 | 只看该作者

看不懂

使用特权

评论回复
8
huangbingg| | 2008-3-28 15:34 | 只看该作者

,,,

楼主他好象没用社么while..吧,周工何出此言???

无非是中断没清好的问题...

使用特权

评论回复
9
txmac|  楼主 | 2008-3-28 15:52 | 只看该作者

xu

周工你搞错了吧。。。。。。。。

使用特权

评论回复
10
xcxxyc| | 2008-3-28 15:55 | 只看该作者

周公没错啊

使用特权

评论回复
11
zlgarm| | 2008-3-29 12:06 | 只看该作者

楼主,您好!

1、在BBS上我们不提供用户代码的技术支持;
2、现在是下班时间,所以稍微看了下您的代码,您的问题主要在清除中断上,不管产生哪种中断,都会把计数中断和报警中断清除。把ILR=0x03;删除就可以了。

                                                                                                                 By: zlgarm_Zhangxiaomeng

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝