微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助,关于TPM的输入捕捉,万分感谢!

求助,关于TPM的输入捕捉,万分感谢!

时间:10-02 整理:3721RD 点击:
鄙人新手,对这个几乎什么都不懂,想要对外部输入的信号进行捕捉,测得两个信号之间的时间差,照着数据手册,自己瞎写了一个程序,编译是不报错的,但是运行也没任何效果。   希望能有老师帮忙看看那里出了问题。 网上也找不到关于TPM输入捕捉的例
程,实在是很苦恼。  谢谢!
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
void PTBDD_INIT(void);
long i,j,a,b,c,x;
void main(void) {
DisableInterrupts;//关闭中断
  SOPT1=0x03;//关狗
   PTBDD_INIT(); //对管脚初始化
   x=TPM1SC;
  TPM1SC_TOF=0;//对TPM1SC溢出标志清除
  TPM1SC_TOIE=1;  //TPM1可以中断
  TPM1SC_CPWMS=0;//加法计数器方式
  TPM1SC_CLKSB=0; //总线时钟
  TPM1SC_CLKSA=1;
  TPM1SC_PS0=0;//1分频
  TPM1SC_PS1=0;
  TPM1SC_PS2=0;
  TPM1CNT=0x0000;// TPM计数器清零
  TPM1MOD=0x0000; //自由计数模式      
  a=TPM1C1SC;     //将1.2通道标志位清除
  b=TPM1C2SC;
  TPM1C1SC_CH1F=0;
  TPM1C2SC_CH2F=0;
  TPM1C1SC_CH1IE=1; //1.2通道中断使能
  TPM1C2SC_CH2IE=1;
  TPM1C1SC_MS1B=0; //通道输入捕捉
  TPM1C1SC_MS1A=0;
  TPM1C2SC_MS2B=0;
  TPM1C2SC_MS2A=0;
  TPM1C1SC_ELS1B=1;//下降沿捕捉
  TPM1C1SC_ELS1A=0;
  TPM1C2SC_ELS2B=1;
  TPM1C2SC_ELS2A=0;
   EnableInterrupts; /* enable interrupts */
  /* include your code here */
  c=j-i;
  for(;;) {
    //__RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
void PTBDD_INIT(void){
PTBDD_PTBDD4=0; //4管脚设为输入,在电路板上是连接着按键的
PTBDD_PTBDD5=0;//5管脚也连接一个按键
PTBDD_PTBDD0=1;// 0管脚设为输出,在电路板上连接LED
PTBDD_PTBDD1=1;//1管脚也连接一个LED
PTBD_PTBD0=1;
PTBD_PTBD1=1;//将两个LED置为不亮状态。
}
void interrupt 10 tpm_isr1(){  // 此处是想用TPM1的ch1的中断来着,中断号里关于ch1的只有这一个,也不知道这么用对不对。  
  i=TPM1C1V;    //如果中断是对的,读此时捕捉到的计数器数值
  a=TPM1C1SC;
  TPM1C1SC_CH1F=0;//清楚中断标志位?      
  PTBD_PTBD0=0;//点亮LED

}
void interrupt 11 tpm_isr2(){
  j=TPM1C2V;
  b=TPM1C2SC;
  TPM1C2SC_CH2F=0;
  PTBD_PTBD1=0;
}

有没有好心的老师帮忙看一下,谢谢谢谢!

你没有描述清楚问题呢,什么芯片,要实现什么功能?

谢谢~~   是MC9S08JM60的板子,   想要做一个输入捕捉,目前的想法是用按键(PTBD4和5)去提供低电平,然后用TPM的通道1.2去捕捉下降沿,进入中断,如果进入中断就把LED点亮(PTBD0和1)   现在好像是不能进中断,灯点不亮。         我把程序修改了一些,还是不行。   

这是修改之后的程序,把主计数器的中断关掉了,只打开了TPM1的通道1和2的中断。   
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

void PTBDD_INIT(void);
long i,j,c,x;
void main(void) {
  DisableInterrupts;//关闭中断
  SOPT1=0x03;//关狗

  PTBDD_INIT(); //对管脚初始化
  

  x=TPM1SC;
  TPM1SC_TOF=0;//对TPM1SC溢出标志清除
  TPM1SC_TOIE=0;  //TPM1中断禁止
  TPM1SC_CPWMS=0;//加法计数器方式
  TPM1SC_CLKSB=0; //总线时钟
  TPM1SC_CLKSA=1;
  TPM1SC_PS0=0;//1分频
  TPM1SC_PS1=0;
  TPM1SC_PS2=0;
  TPM1CNT=0x0000;// TPM计数器清零
  TPM1MOD=0x0000; //自由计数模式      
  
  TPM1C1SC_CH1F=0;
  TPM1C2SC_CH2F=0;
  TPM1C1SC_CH1IE=1; //1.2通道中断使能
  TPM1C2SC_CH2IE=1;
  TPM1C1SC_MS1B=0; //通道输入捕捉
  TPM1C1SC_MS1A=0;
  TPM1C2SC_MS2B=0;
  TPM1C2SC_MS2A=0;
  TPM1C1SC_ELS1B=1;//下降沿捕捉
  TPM1C1SC_ELS1A=0;
  TPM1C2SC_ELS2B=1;
  TPM1C2SC_ELS2A=0;
  
  EnableInterrupts; /* enable interrupts */
  /* include your code here */

  //c=j-i;
  
  
  for(;;) {
   
   
    //__RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
void PTBDD_INIT(void){
PTBDD_PTBDD4=0;
PTBDD_PTBDD5=0;
PTBDD_PTBDD0=1;
PTBDD_PTBDD1=1;
PTBD_PTBD0=1;
PTBD_PTBD1=1;
}

void interrupt 10 tpm_isr1(){
  i=TPM1C1VH*256+TPM1C1VL;
  PTBD_PTBD0=0;   
  TPM1C1SC=TPM1C1SC&0x48;  //TPM1频道1中断标识清除   
  
  
}
void interrupt 11 tpm_isr2(){
  j=TPM1C2VH*256+TPM1C2VL;
  PTBD_PTBD1=0;
  TPM1C2SC=TPM1C2SC&0x48;   //TPM1频道2中断标识清除
  
}
  

搞个外部触发中断不就可以了吗?就像51那样,检测到外边按键按下,有电平变化,进入中断,点亮LED

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top