智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1834|回复: 8
打印 上一主题 下一主题

S12定时程序中定时1秒应该装多大的初值

[复制链接]

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
跳转到指定楼层
1#
发表于 2012-12-30 15:19:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
S12定时程序中定时1秒应该装多大的初值  
是怎么计算1秒的啊

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
9#
 楼主| 发表于 2012-12-30 17:45:15 | 只看该作者
1627252997 发表于 2012-12-30 17:20
#include  
#include  
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

谢了
回复 支持 反对

使用道具 举报

46

主题

521

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1819
威望
1227
贡献
168
兑换币
161
注册时间
2012-2-7
在线时间
212 小时
毕业学校
山东
8#
发表于 2012-12-30 17:20:17 | 只看该作者
本帖最后由 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 */
      }
      
  }
}

回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
7#
 楼主| 发表于 2012-12-30 16:35:11 | 只看该作者
1627252997 发表于 2012-12-30 16:16
#include       /* common defines and macros */
#include      /* derivative information */
#pragma  ...

我是打算用TIM模块里的定时器 PIT模块我也知道 不过我还是想用TIM模块
回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
6#
 楼主| 发表于 2012-12-30 16:33:07 | 只看该作者
1627252997 发表于 2012-12-30 16:16
#include       /* common defines and macros */
#include      /* derivative information */
#pragma  ...

是啊 谢了
回复 支持 反对

使用道具 举报

46

主题

521

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1819
威望
1227
贡献
168
兑换币
161
注册时间
2012-2-7
在线时间
212 小时
毕业学校
山东
5#
发表于 2012-12-30 16:16:43 | 只看该作者
本帖最后由 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
得学会看着技术手册写程序。

回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
4#
 楼主| 发表于 2012-12-30 16:14:15 | 只看该作者
1627252997 发表于 2012-12-30 15:31
你可以计个20ms的中断然后在中断里计50次,直接计一秒可不是小数。

这个知道 只是怎么写定时函数呢 真不会
回复 支持 反对

使用道具 举报

46

主题

521

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1819
威望
1227
贡献
168
兑换币
161
注册时间
2012-2-7
在线时间
212 小时
毕业学校
山东
3#
发表于 2012-12-30 15:31:15 | 只看该作者
你可以计个20ms的中断然后在中断里计50次,直接计一秒可不是小数。
回复 支持 反对

使用道具 举报

7

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2777
威望
1405
贡献
792
兑换币
756
注册时间
2012-7-9
在线时间
290 小时
2#
发表于 2012-12-30 15:30:34 | 只看该作者
要根据你的晶振频率来算,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-28 23:20 , Processed in 0.054995 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表