首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教大侠!---利用ECT的OC中断做一准确电子钟(支持楼主)

请教大侠!---利用ECT的OC中断做一准确电子钟(支持楼主)

我想用ECT的OC中断做一准确电子钟,其间主要用到了display(x,y)显示函数和一个中断函数。


 


为方便看,特把display函数分成两个单独的分钟显示函数displaymin(x)和小时显示函数displayhour(y)


 


出现的问题:


如果只显示分钟displaymin(x)准确做到过一分钟数字增加1,但一加上显示小时的功能函数displayhour(y)分钟数字的递加好像就得过1分半钟(我那另一块表作比较)


 


所用单片机为9s12dg128,总线频率8M


 


程序如下,希望高手指点问题的出处


 


#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */



#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


void interrupt 15 timch7();
void displaymin(volatile unsigned char x);
void displayhour(volatile unsigned char y);
void delay();


unsigned char a[10]={
    0xc0,0xf3,0xa4,0xa1,0x93,0x89,0x88,0xe3,0x80,0x81
  };
 
volatile int i=0;
volatile int j=0;
volatile unsigned char min=9;
volatile unsigned char hour=23;


void main(void) {
  /* put your own code here */
 
  TSCR1=0x90;  //使能TEN,快速清零标志TFFCA
  TSCR2=0x0f;  //分频系数128,TCRE=1
  TC7=125;  //2ms中断
  TIOS=0x80;  //管脚7为OC7
  TIE=0x80;    //使能中断TI7
 
  DDRA=0xff;
 
  EnableInterrupts;
  for(;;) {} /* wait forever */
}


void interrupt 15 timch7(){
 
  i+=1;
  if(i==500){
    i=0;
    j+=1;
  }
  if(j==60){
    j=0;
    min+=1;
  }
  if(min==60){
    min=0;
    hour+=1;
  }
  if(hour==24) hour=0;
  TC7=125;
  displaymin(min);
  displayhour(hour);
 }


void displaymin(volatile unsigned char x){
   if(x<10){
      PORTA=a[x];
      DDRP=0x01;
      delay();     
      PORTA=a[0];
      DDRP=0x02;
      delay();
      PORTA=0xff;
    }
    else{      
      PORTA=a[x%10];
      DDRP=0x01;
      delay();      
      PORTA=a[x/10];
      DDRP=0x02;
      delay();
      PORTA=0xff;
    }     
}


void displayhour(volatile unsigned char y) {
  if(y<10){
      PORTA=a[y];
      DDRP=0x04;
      delay();     
      PORTA=a[0];
      DDRP=0x08;
      delay();
      PORTA=0xff;
    }
    else{      
      PORTA=a[y%10];
      DDRP=0x04;
      delay();      
      PORTA=a[y/10];
      DDRP=0x08;
      delay();
      PORTA=0xff;
    }
}
void delay(){
  int k;
  for(k=0;k<1000;k++);
}


 

可能是你的加上显示小时的函数后,中断处理函数的执行时间太长,在中断处理函数还未处理完,下一个中断又来了,你可以将2ms中断一次改长一点试试
谢谢大侠,我把中断间隔改为4ms后问题确实可以解决!

但仍然有点迷惑,之前我用RTI中断也做了个电子钟,所用dispaly函数和上面一样,而且我的中断时间只有1.024ms,除了RTI先天性的秒表误差之外其他显示情况都很正常。

以下是我用的RTI中断函数,我觉得该函数的处理量和OC中断函数处理量差不多,清高手指点上面的中断函数中到底是哪一步占用了大量资源。

void interrupt 7 RealTI(void){

i+=1;
if(i==978){
i=1;
sec+=1;
}
if(sec==60){
sec=0;
min+=1;
}
if(min==60){
min=0;
hour+=1;
}
if(hour==24) hour=0;
CRGFLG=0x80; //清零RTI中断标志
display(min,hour);
}
在用RTI中断情况下,你设的总线频率是多少
指令执行所花时间是与总线频率有关的,你的第一种情况下总线频率8MHz是比较低的,我不知道你片子上晶振频率是多少,我当时用的晶振频率为16M,然后经过PLL,总线频率为24M
谢谢
我明白了,我用RTI做的那个中断所用时钟为晶振时钟,其频率为16M
虽然中断函数长短基本相同,但执行时间不同
16M---8M, 1.024ms---2ms
就这0.048ms程序就不能运行!
谢谢大侠
返回列表