打印

求助-定时器

[复制链接]
1724|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wytianyi|  楼主 | 2007-5-23 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
古道热肠| | 2007-5-23 10:55 | 只看该作者

定时器的初始值是算出来的

   你那种写法不对吧!至少得给出工作模式
  我有个试过的,给你看看
#define   FOSC                    11059200L
//#define   FOSC                    18432000L

#define   MACHINE_NUM             12          /*根据需要调整,如:W777E58=4*/
#define   TICKS_PER_SEC           20            /* # of clock ticks to obtain 1 second               */

void Init_sys_timer(void)
{
  BYTE_WORD Init_value; 

  
  Sys_clk_init();  
    
  T2CON=0x00;
//定时器2使用机器周期作为计数脉冲(Fosc/12)
  Init_value.word=FOSC/((ulong)TICKS_PER_SEC*MACHINE_NUM); 
//  Init_value.word=38400; 
  TH2=RCAP2H=-Init_value.bytes.high;
  TL2=RCAP2L=-Init_value.bytes.low;

//    ComSendTxt ("TH2Value", &Init_value, 2);

//启动定时器2工作
      ET2=1;
    TR2=1; 
//开中断总开关    
    ENTER_CRITICAL();   
  //TMOD&=0xF0;                  //使用定时器0,但在中断中需要重新赋初值,因而我更倾向用Timer2
  //TMOD|=0x01;
  
 // Init_value.word=FOSC/(TICKS_PER_SEC*MACHINE_NUM); 
  //TH0=-Init_value.bytes.high;
  //TL0=-Init_value.bytes.low;

  //ET0=1;
  //TR0=1;
}

使用特权

评论回复
板凳
wytianyi|  楼主 | 2007-5-23 11:05 | 只看该作者

不理解我这个怎么算的

我也是看的,F020单片机的

void SYSCLK_Init (void)
{
   int i;                                          // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                                    // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;               // XTLVLD blanking interval (>1ms)

   while (!(OSCXCN & 0x80)) ;      // Wait for crystal osc. to settle

   OSCICN = 0x88;                       // select external oscillator as SYSCLK
                                                   // source and enable missing clock
                                                   // detector
}

void Timer0_Init (void)
{
   CKCON|=0x8;   //T0M=1(CKCON.3),T0用系统时钟作为时钟基准正确。
   TMOD|=0x1;                                                //16Bit
   TR0 = 0;                                                      // STOP Timer0
   TH0 = (-SYSCLK/1000) >> 8;                      // set Timer0 to overflow in 1ms
   TL0 = -SYSCLK/1000;
   TR0 = 1;                                                      // START Timer0
   IE|= 0x2; 
}
不明白这里的TH0和TL0是怎么算的

使用特权

评论回复
地板
zxq1234508| | 2007-5-23 11:23 | 只看该作者

遇到过

曾经遇到过这样得问题,也不是很明白,这种计算方法是有得,但是不是很精确,甚至会产生很大得误差。那位大虾说说看,LZ说得是怎么个计算得。定时值该是多少啊?

使用特权

评论回复
5
wytianyi|  楼主 | 2007-5-23 14:04 | 只看该作者

ding

ding

使用特权

评论回复
6
infree| | 2007-5-23 15:00 | 只看该作者

这个应是正确的

SYSCLK/1000计算出1ms定时需要计数的次数,而加上负号就是计数的初值。即若计数次数应为1000次,则-1000对应的16位整数为FC18(补码),FFFF-FC18整好是1000次。

使用特权

评论回复
7
ww4u| | 2007-5-23 20:00 | 只看该作者

正解,顶!

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝