查看: 6231|回复: 5

[其他] DZ60定时器问题

[复制链接]

该用户从未签到

11

主题

56

帖子

0

新手上路

Rank: 1

积分
106
最后登录
1970-1-1
发表于 2011-7-24 13:30:23 | 显示全部楼层 |阅读模式
大家好:
   我想请教一下关于DZ60中利用定时器产生一个1ms的中断,软件如何处理,顺便说一下,我用的是外部4M晶振。有没有现成的软件参考一下,谢谢!
我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

6

主题

21

帖子

0

新手上路

Rank: 1

积分
45
最后登录
1970-1-1
发表于 2011-7-24 16:41:33 | 显示全部楼层

回复:DZ60定时器问题

/*-------------------------------------------------------------*/
/*           该程序由定时器脉冲宽度调节器TPM来完成             */
/*       利用TPM的输出比较功能,产生1mS定时    */
/*           微控制器采用的是MC9S08DZ60                        */
/*                    晶振频率4MHz                             */
/*         TOF位对应的是定时器溢出中断,                       */
/*        而CH0F位对应的是定时器通道0匹配中断                  */
/*-------------------------------------------------------------*/  
#include  /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
/////////////////////////////////////////////////////////////////////////////////////////
// MCU单片机初始化程序
/////////////////////////////////////////////////////////////////////////////////////////
void PeriphInit(void)
{
   
  SOPT1 = 0x00;  
 
  MCGC1 = 0xBB;     // 选择外部参考时钟作为总线的时钟源,使能内部参考时钟
           
  MCGC2 = 0x36; //选择外部1M~16M高频晶振,总线分频率为1
  MCGC3 = 0x00; // PLL=0即禁止PLL
  //计算一下总线频率:晶振频率是4MHz,BDIV=1,MCGOUT频率为4MHz,总线频率为2MHz
 
  while(!(MCGSC&0x02))
    ;
 //I/O口初始化 
 PTDDD=0xff;       //TPM1CH0设置为输出
 PTDD=0x00;        //输出初始化为0                                    
 //TPM1初始化
 TPM1SC=0x48;      //TOF中断使能、选择总线速率时钟作为时钟源、预分频器因子为1
TPM1CNT=0x0000;//清计数器值
TPM1MOD=0x07d0;//模数寄存器值
 TPM1C0SC=0x14;    //通道中断不使能,输出比较为切换比较输出
 TPM1C0V=0x03e8; //通道寄存器值
 
}
 /////////////////////////////////////////////////////////////////////////////////////////
//中断处理子函数
/////////////////////////////////////////////////////////////////////////////////////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void TPM1ovf_inter(void)
{
 if(TPM1SC_TOF!=0) {
  TPM1SC_TOF=0;//清中断标志位
  你自己加的中断操作
 }
}
 /////////////////////////////////////////////////////////////////////////////////////////
//主函数
/////////////////////////////////////////////////////////////////////////////////////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void main(void) {
  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  PeriphInit();
  for(;;) {
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
 

该用户从未签到

6

主题

21

帖子

0

新手上路

Rank: 1

积分
45
最后登录
1970-1-1
发表于 2011-7-24 16:44:18 | 显示全部楼层

RE:DZ60定时器问题

这是我的程序,在我的板子上试过了,可以实现。还有就是在project.prm文件的最后要添加VECTOR ADDRESS 0x0000FFE8 TPM1ovf_inter

该用户从未签到

27

主题

418

帖子

0

新手上路

Rank: 1

积分
228
最后登录
1970-1-1
发表于 2011-7-24 22:17:42 | 显示全部楼层

回复:DZ60定时器问题

程序有rti模块,挺好用的,不过出1ms好像不行,1s可以

该用户从未签到

1

主题

34

帖子

0

新手上路

Rank: 1

积分
48
最后登录
1970-1-1
发表于 2011-12-12 16:09:26 | 显示全部楼层

回复:DZ60定时器问题

回复第 2 楼 于2011-07-24 08:41:33发表:
/*-------------------------------------------------------------*/
/*           该程序由定时器脉冲宽度调节器TPM来完成             */
/*       利用TPM的输出比较功能,产生1mS定时    */
/*           微控制器采用的是MC9S08DZ60                        */
/*                    晶振频率4MHz                             */
/*         TOF位对应的是定时器溢出中断,                       */
/*        而CH0F位对应的是定时器通道0匹配中断                  */
/*-------------------------------------------------------------*/  
#include  /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
/////////////////////////////////////////////////////////////////////////////////////////
// MCU单片机初始化程序
/////////////////////////////////////////////////////////////////////////////////////////
void PeriphInit(void)
{
   
  SOPT1 = 0x00;  
 
  MCGC1 = 0xBB;     // 选择外部参考时钟作为总线的时钟源,使能内部参考时钟
           
  MCGC2 = 0x36; //选择外部1M~16M高频晶振,总线分频率为1
  MCGC3 = 0x00; // PLL=0即禁止PLL
  //计算一下总线频率:晶振频率是4MHz,BDIV=1,MCGOUT频率为4MHz,总线频率为2MHz
 
  while(!(MCGSC&0x02))
    ;
 //I/O口初始化 
 PTDDD=0xff;       //TPM1CH0设置为输出
 PTDD=0x00;        //输出初始化为0                                    
 //TPM1初始化
 TPM1SC=0x48;      //TOF中断使能、选择总线速率时钟作为时钟源、预分频器因子为1
TPM1CNT=0x0000;//清计数器值
TPM1MOD=0x07d0;//模数寄存器值
 TPM1C0SC=0x14;    //通道中断不使能,输出比较为切换比较输出
 TPM1C0V=0x03e8; //通道寄存器值
 
}
 /////////////////////////////////////////////////////////////////////////////////////////
//中断处理子函数
/////////////////////////////////////////////////////////////////////////////////////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void TPM1ovf_inter(void)
{
 if(TPM1SC_TOF!=0) {
  TPM1SC_TOF=0;//清中断标志位
  你自己加的中断操作
 }
}
 /////////////////////////////////////////////////////////////////////////////////////////
//主函数
/////////////////////////////////////////////////////////////////////////////////////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void main(void) {
  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  PeriphInit();
  for(;;) {
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
  
 
我做了一个程序也跟你这个一样,但发现一个问题,当我改变通道寄存器的值时,输出的PWM的占空比是不变的,还是50%,按理来说改变通道寄存器的值就能改变占空比的,希望能提供帮助,谢谢
 
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

5

帖子

0

新手上路

Rank: 1

积分
6
最后登录
1970-1-1
发表于 2011-12-12 21:27:06 | 显示全部楼层

回复:DZ60定时器问题

我把程序复制下来调了一下很好用
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 03:03 , Processed in 0.093359 second(s), 26 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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