智能车制作

标题: S12定时程序中定时1秒应该装多大的初值 [打印本页]

作者: mxj1005071012    时间: 2012-12-30 15:19
标题: S12定时程序中定时1秒应该装多大的初值
S12定时程序中定时1秒应该装多大的初值  
是怎么计算1秒的啊

作者: 音之夏萤    时间: 2012-12-30 15:30
要根据你的晶振频率来算,
作者: 1627252997    时间: 2012-12-30 15:31
你可以计个20ms的中断然后在中断里计50次,直接计一秒可不是小数。
作者: mxj1005071012    时间: 2012-12-30 16:14
1627252997 发表于 2012-12-30 15:31
你可以计个20ms的中断然后在中断里计50次,直接计一秒可不是小数。

这个知道 只是怎么写定时函数呢 真不会
作者: 1627252997    时间: 2012-12-30 16:16
本帖最后由 1627252997 于 2012-12-30 16:17 编辑

#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
/*
计算公式:总线时钟/PITMTLD0/PITLDO=定时中断的时间

*/
void initPIT0(void)//定时中断初始化函数 5MS定时中断设置
{
  PITCFLMT_PITE=0; //定时总中断关闭                                
  PITCE_PCE0=1;//定时器通道0使能                                     ///
  PITMTLD0=200-1;//8位定时器初值设定(四个同道共用)。200分频, 80MHz/200=400KHz
  PITLD0=2000-1;//第0同道16位定时器初值设定。   400000Hz/2000= 200Hz         ///
  PITINTE_PINTE0= 1;//定时器中断通道0中断使能                                         ///
  PITCFLMT_PITE=1;//定时器总中断打开
}
void SetBusCLK_80M(void)
{   
    CLKSEL=0X00;                                //disengage PLL to system
    PLLCTL_PLLON=1;                        //turn on PLL
    SYNR =0xc0 | 0x09;                        
    REFDV=0x80 | 0x01;
    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
    _asm(nop);          //BUS CLOCK=80M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;                        //engage PLL to system;
}
void SystemIo()
{
        DDRB = 0xff;
        PORTB = 0xff;
}
void main(void) {
        /* put your own code here */
        SystemIo();
        initPIT0();
        SetBusCLK_80M();
        EnableInterrupts;

        for(;;) {} /* wait forever */
        /* please make sure that you never leave this function */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0Interrupt(void)
{         
    PORTB = ~PORTB;
        PITTF_PTF0=1;//清中断标志位      
}
#pragma CODE_SEG DEFAULT
得学会看着技术手册写程序。


作者: mxj1005071012    时间: 2012-12-30 16:33
1627252997 发表于 2012-12-30 16:16
#include       /* common defines and macros */
#include      /* derivative information */
#pragma  ...

是啊 谢了
作者: mxj1005071012    时间: 2012-12-30 16:35
1627252997 发表于 2012-12-30 16:16
#include       /* common defines and macros */
#include      /* derivative information */
#pragma  ...

我是打算用TIM模块里的定时器 PIT模块我也知道 不过我还是想用TIM模块
作者: 1627252997    时间: 2012-12-30 17:20
本帖最后由 1627252997 于 2012-12-30 17:23 编辑
mxj1005071012 发表于 2012-12-30 16:35
我是打算用TIM模块里的定时器 PIT模块我也知道 不过我还是想用TIM模块

#include <hidef.h>
#include <MC9S12XS128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
unsigned int num=0;
void SetBusCLK_64M(void)
{   
    CLKSEL=0X00;       //时钟选择寄存器  系统时钟取自OSCCLK
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR =0xc0 | 0x07;////pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;                          
    REFDV=0x80 | 0x01;
    POSTDIV=0x00;       //fpll=fvco   
    _asm(nop);          //BUS CLOCK=64M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //锁相环输出稳定
    CLKSEL_PLLSEL =1;            //系统时钟取自PLL      
}
void Timer_Init(void)
{
    TSCR1=0X90;
    //使能定时器并设置为自动清除标志TFLG1

    TSCR2=0X03;
    //设置分频系数为8,及23

    //TIE=0X01;
    //定时器通道0中断使能
    TIE=0x8e;
    TIOS_IOS7=1;
    //PT0口为输出比较
    TC7=TCNT+3000;
  
    //设定初值 //定的时间就是从0加到3000要的时间
    EnableInterrupts;
}
#pragma CODE_SEG NON_BANKED
void interrupt 15 Timer(void)//中断序号与定时器通道一一对应从8到15
{
  DisableInterrupts;
  num++;
  TC7=TCNT+3000;

  //设定比较器下次中断时间
  
  //TSCR1=0x00;
  //关定时器(一般情况定没必要用这个)
  EnableInterrupts;
}
void main(void)
{
  SetBusCLK_64M();//总线时钟
  DDRB=0xff;
  Timer_Init();
  PORTB=0;
  EnableInterrupts;
  for(;;)
  {
      if(num==1000)
      {
        num=0;
        PORTB=~PORTB;
        _FEED_COP(); /* feeds the dog */
      }
      
  }
}


作者: mxj1005071012    时间: 2012-12-30 17:45
1627252997 发表于 2012-12-30 17:20
#include  
#include  
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

谢了




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2