Board logo

标题: QL4中定时器的设置问题 [打印本页]

作者: 加密咖啡    时间: 2006-8-14 19:17     标题: QL4中定时器的设置问题

我用QL4的定时器功能,但是不知道为什么就是调不通,下面是我写的程序,请各位大侠指点!void interrupt tim_isr(void)
{
        count++;
     if(count==0x20)                      
     {
     
           TB_PTB2=1;


}
     else  if(count==0x40 )                     
     {
     
            TB_PTB2=0;
            count=0 ;
     }                             
    TSC_TOF=0;
  
    }


  void tim_init(void)
{
   TSC_TSTOP=1;
   
   TSC=0x43;       
    
   TMODH=0x0F;      /*计数器高位初始化*/
  
   TMODL=0xA0;      /*计数器低位初始化*/
 
  TSC_TSTOP=0;      /*定时器开启*/
}


 


作者: seuafu2005    时间: 2006-8-15 09:51

1、程序调不通主要表现在哪里?没有中断?
2、中断向量填写准确了? 全局中断用CLI放开了?
3、芯片是否正常工作?程序正常运行了吗?定时器寄存器的值都准确写入了?

作者: 加密咖啡    时间: 2006-8-15 10:03

我把程序固化进芯片后,我的PTB_PTB2脚上接上发光二极管,刚开始运行还可以发光,说明进了中断,但是一会就灭了,然后就没有反应了。全局中断已经开了,用的是EnableInterrupts;。中断向量用的是FFF2。你帮我分析一下,谢谢版主!

[此贴子已经被作者于2006-8-15 10:03:17编辑过]


作者: strongchen    时间: 2006-8-15 10:24

你的程序应该是让LED闪烁,它闪烁了吗?你是否设置中断调试过?
作者: 加密咖啡    时间: 2006-8-15 10:34

对阿,刚开始闪烁了,但是一会后就没有反应了,而且我测了一下引脚信号,发现发出的不是方波,而是毛刺,不知道为什么!请版主指点!
作者: 加密咖啡    时间: 2006-8-15 10:46

那位如果有时间能否指点一下啊,我的联系方式是,QQ:23555016,MSN:tianzhu_zhang@hotmail.com,希望大家能帮我一下,谢谢
作者: strongchen    时间: 2006-8-15 11:12

闪烁了几次?大概闪烁了多长时间?你的总线频率是多少?根据你的总线频率,闪烁周期应该是多大?
作者: 加密咖啡    时间: 2006-8-16 09:29

其实也不是闪烁了,应该是毫秒级的吗,我用示波器测只是两个毛刺,然后LED就比较暗,而且一会以后毛刺也没有了,灯也就不亮了。总线频率应该是12M吧,因为我就设置了一个OSCTRIM=0xC0;版主能不能找个例程给我看看啊,小弟不胜感激!老师现在天天催我呢!急死我了!
各位大侠救我啊!
作者: strongchen    时间: 2006-8-16 10:04

QL4的最大总线频率应该是8M,你怎么会是12M?你用的是什么振荡器,内部还是外部?
作者: 加密咖啡    时间: 2006-8-16 10:47

我是看资料上OSCSC默认值是那样,但是我看库文件里只定义了OSCSTAT - Oscillator Status and Control Register; 0x00000036 ***/
typedef union {
byte Byte;
struct {
byte ECGST :1; /* External Clock Status Bit */
byte ECGON :1; /* External Clock Generator On Bit */
byte BFS :1; /* Bus Frequency Select Bit */
byte :1;
byte :1;
byte :1;
byte :1;
byte :1;
} Bits;
} OSCSTATSTR;
我都不知道该怎么设置!版主帮忙啊,谢谢了!
作者: 加密咖啡    时间: 2006-8-16 10:57

我的程序是这样子的,现在只是想用一下定时器,希望各位指教!
void PORT_INIT(void)
{
DDRB_DDRB4=0;/*LIN模块输入端口*/
DDRB_DDRB5=1;/*LIN模块输出端口*/
DDRB_DDRB6=1;/*LIN模块使能端*/
DDRB_DDRB3=1;
DDRB_DDRB2=1;
DDRB_DDRB1=1;
DDRB_DDRB0=1;

PTB_PTB5=0;
PTB_PTB3=0;
PTB_PTB2=0;
PTB_PTB1=0;
PTB_PTB0=0;
PTB_PTB6=1;/*MC33399被使能*/



}

/***********************************************/
void init_hardware(void)
{

OSCTRIM=0xC0;
}
/*******************************************/







/****************************************************/
void interrupt tim_isr(void)
{
TSC_TOF=0;
PTB_PTB3=0;
count++;

if(count==10) /*设置延时次数*/

{

/*定时器中断指示灯*/
PTB_PTB0=1;
PTB_PTB1=0; /*计数器轻零*/
PTB_PTB2=0;
PTB_PTB3=0;
}
if(count==20) /*设置延时次数*/

{
PTB_PTB0=0;
PTB_PTB1=1; /*计数器轻零*/
PTB_PTB2=0;
PTB_PTB3=0;
/*计数器轻零*/
}
if(count==30) /*设置延时次数*/

{

/*定时器中断指示灯*/
PTB_PTB0=0;
PTB_PTB1=0; /*计数器轻零*/
PTB_PTB2=1;
PTB_PTB3=0;
/*计数器轻零*/
} /*计数器加1*/
else{
PTB_PTB0=0;
PTB_PTB1=0; /*计数器轻零*/
PTB_PTB2=0;
PTB_PTB3=1;
count=0 ;
}




}

void tim_init(void)
{

TSC_TRST=1;

TMODH=0x0F; /*计数器高位初始化*/

TMODL=0xA0; /*计数器低位初始化*/
TSC=0x43;
TSC_TSTOP=0;

}


/*****************************************************/
void main(void)
{

DisableInterrupts;
CONFIG1=0x09;
CONFIG2=0x00;
init_hardware();
PORT_INIT();

EnableInterrupts;

tim_init();
while(1){;

}

}/*结束主程序*/



作者: strongchen    时间: 2006-8-16 11:35

把你的整个PROJECT打包贴上来看看。
作者: 加密咖啡    时间: 2006-8-16 15:17

我的PROJECT,谢谢版主
作者: strongchen    时间: 2006-8-17 10:20

没有传上来。
作者: 加密咖啡    时间: 2006-8-31 10:06

我上传的东西怎么老是到一半就不行了,请版主给个联系方式,我给你发过去,谢谢版主!
作者: strongchen    时间: 2006-8-31 11:15

strongchen_free@yahoo.com.cn
作者: yxr20004    时间: 2006-9-1 14:33

中断入口未定义
把void interrupt tim_isr(void)
改成void interrupt 6 tim_isr(void)
另外建议及时喂狗
while(1)
{
__RESET_WATCHDOG(); /* feeds the dog */
}
作者: strongchen    时间: 2006-9-4 15:41

在你的定时中断程序里,每次count都会在else{}里清零,怎么可能计到10、20和30呢?
作者: 加密咖啡    时间: 2006-9-8 08:46

谢谢各位大侠,我现在调好了!中断的设置应该是对的,可能是中断里的程序有问题吧!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0