首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[原创]DG128输入捕捉问题

[原创]DG128输入捕捉问题

求助:
我用的是DG128B的输入捕捉0 和1,为什么0用信号的时候会两个中断都能进去,1有信号的时候进不去中断呢?急,请高手指教
不明白你的意思.
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void Init_Capture(void){

TSCR1 = 0X80; //enable time;
TSCR2 = 0X00; //prescale factor;

TSCR2 = 0x03; //分频系数为8,一次溢出时间为21ms,对应速度为0.1/s

TIOS = 0x00; //选择为输入捕捉
TCTL4 = 0x05; //沿选择
TIE = 0x03; //中断使能
TFLG1=0x0f;


}

/***********************************************************
函数名称:CAPTURE
函数功能:
入口参数:无
出口参数:无
备 注:ENCDOE1 U3
***********************************************************/
interrupt void CAPTURE2(void)
{

TFLG1_C1F=1;
//TCNT = 0;
//TSCR1_TEN = 1; //定时器使能

//TIE = TIE&0xfd;
g_ucEncodeFlag=0;

Sci_T(0x06);
if( ENCODE1_PHA ==0) //下降沿引发中断
{
if(ENCODE1_PHB ==1) //B相为高发左旋代码
{
g_ucCurrentKey=LEFT;
//g_ucEncodeSta=1;

}
else if(ENCODE1_PHB==0) //B相为低右代码
{
g_ucCurrentKey=RIGHT;
//g_ucEncodeSta=2;
}
}
else //上升沿引发中断
{
if(ENCODE1_PHB==0) //B相为低发左旋代码
{
g_ucCurrentKey=LEFT;
//g_ucEncodeSta=1;
}
else if(ENCODE1_PHB==1) //B相为高发右旋代码
{
g_ucCurrentKey=RIGHT;
//g_ucEncodeSta=2;
}
}
g_ucEncodeFlag=1;
g_ucEncodeCounter=0xff;

}

/***********************************************************
函数名称:CAPTURE2
函数功能:
入口参数:无
出口参数:无
备 注:ENCODE2 U2
***********************************************************/
interrupt void CAPTURE1(void)
{
TFLG1_C0F=1;
g_ucEncodeFlag=0;
Sci_T(0x07);
if( ENCODE2_PHA==0) //下降沿引发中断
{
if(ENCODE2_PHB==1)
{
g_ucCurrentKey=HYPHEN; //B相为高发左旋代码
//g_ucEncodeSta=1;
}
else if(ENCODE2_PHB==0)
{
g_ucCurrentKey=EQUAL; //B相为低发右旋代码
//g_ucEncodeSta=2;
}
}
else
{
if(ENCODE2_PHB==0) //B相为低发左旋代码
{
g_ucCurrentKey=HYPHEN;
}
else if(ENCODE2_PHB==1) //B相为高发右旋代码
{
g_ucCurrentKey=EQUAL;

}
}
g_ucEncodeFlag=1;
g_ucEncodeCounter=0xff;
}
#pragma CODE_SEG DEFAULT

//VECTOR ADDRESS 0XFFEE CAPTURE1
//VECTOR ADDRESS 0XFFEC CAPTURE2
都设置了.
就是进入中断CAPTURE1的同时也会进入CAPTURE2里面是怎么回事
把整个project传上来看看
个人BLOG:http://blog.eccn.com/u/107300/index.htm
中断为两个旋扭控制,现在的问题是动旋扭1时两个中断都进入,最郁闷的是旋扭2进不去中断,硬件电路我都测了都正常,旋扭的波形,IO口的工作状态都正常,我把旋扭1接到旋扭2的IO口上也可以正常进入中断测得进入CAPTURE2().现在就象由旋扭2控制时IO口输入捕捉不工作似的,郁闷那,求高人指点
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define ENCODE1_PHA PTT_PTT1
#define ENCODE1_PHB PTT_PTT0
#define ENCODE2_PHA PTT_PTT4
#define ENCODE2_PHB PTT_PTT3

#define RIGHT 1
#define LEFT 0
#define EQUAL 3
#define HYPHEN 2
unsigned char Sci_Flag;
unsigned char Sci_Buffer[6];
unsigned char g_ucEncodeFlag;
unsigned char g_ucCurrentKey;
unsigned char g_ucEncodeCounter;


void Init_IO(void){

DDRP = 0x00;
}

void Init_Capture(void){

TSCR1 = 0X80; //enable time;
TSCR2 = 0X00; //prescale factor;
TSCR2 = 0x03; //分频系数为8,一次溢出时间为21ms,对应速度为0.1/s
//溢出中断禁止
TIOS = 0x00; //选择为输入捕捉
//TCTL3 = 0xff; //沿选择
//TCTL4 = 0x01; //沿选择
TCTL4 = 0x0F; //沿选择




//ICSYS = 0x0a; //00001010:两个有效沿之后中断,使能保持寄存器,队列模式
//ICOVW_NOVW0 = 0; //0为允许重写
//DLYCT = 0x01; //延时

//TFLG1 = 0x01; //清中断标志

TIE = 0x03; //中断使能

//ICSYS |= 0x0A;
TFLG1=0x03;

//TSCR1_TEN = 1; //定时器使能
//ICSYS=0x0E;//队列模式;

}

void main(void) {
/* put your own code here */
EnableInterrupts;
Init_IO();
Init_Capture();
//Sci_R();

for(;;) {
if(PTT_PTT3 ==0x00) {
//Sci_T(0xff);
}
if(PTT_PTT3 ==0x01) {
//Sci_T(0xf0);
}
} /* wait forever */
/* please make sure that you never leave this function */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

/***********************************************************
函数名称:CAPTURE
函数功能:旋钮1中断处理程序
入口参数:无
出口参数:无
备 注:ENCDOE1 U3
***********************************************************/
interrupt void CAPTURE1(void)
{
int i;
TIE = 0x00;
TFLG1_C0F=1;
//TCNT = 0;
//TSCR1_TEN = 1; //定时器使能


g_ucEncodeFlag=0;
//for(i=0;i<10000;i++);
if( ENCODE1_PHA ==0) //下降沿引发中断
{
if(ENCODE1_PHB ==1) //B相为高发左旋代码
{
g_ucCurrentKey=LEFT;
//g_ucEncodeSta=1;
}
else if(ENCODE1_PHB==0) //B相为低右代码
{
g_ucCurrentKey=RIGHT;
//g_ucEncodeSta=2;
}
}
else //上升沿引发中断
{
if(ENCODE1_PHB==0) //B相为低发左旋代码
{
g_ucCurrentKey=LEFT;
//g_ucEncodeSta=1;
}
else if(ENCODE1_PHB==1) //B相为高发右旋代码
{
g_ucCurrentKey=RIGHT;
//g_ucEncodeSta=2;
}
}
g_ucEncodeFlag=1;
g_ucEncodeCounter=0xff;
//TFLG1 = 0x02;
//TFLG2 = 0x80; //清中断标志
TIE = 0x03;

}

/***********************************************************
函数名称:CAPTURE2
函数功能:旋钮2中断处理程序
入口参数:无
出口参数:无
备 注:ENCODE2 U2
***********************************************************/

interrupt void CAPTURE2(void)
{
TIE = 0x00;
TFLG1_C1F=1;

g_ucEncodeFlag=0;
if( ENCODE2_PHA==0) //下降沿引发中断
{
if(ENCODE2_PHB==1)
{
g_ucCurrentKey=HYPHEN; //B相为高发左旋代码
//g_ucEncodeSta=1;
Sci_T(0x03);

}
else if(ENCODE2_PHB==0)
{
g_ucCurrentKey=EQUAL; //B相为低发右旋代码
//g_ucEncodeSta=2;

}
}
else
{
if(ENCODE2_PHB==0) //B相为低发左旋代码
{
g_ucCurrentKey=HYPHEN;
//g_ucEncodeSta=1;

}
else if(ENCODE2_PHB==1) //B相为高发右旋代码
{
g_ucCurrentKey=EQUAL;
//g_ucEncodeSta=2;

}
}
g_ucEncodeFlag=1;
g_ucEncodeCounter=0xff;

// TFLG1 = 0xff;
// TFLG2 = 0x80;
TIE = 0x03;
}
#pragma CODE_SEG DEFAULT

//VECTOR ADDRESS 0XFFEE CAPTURE1
//VECTOR ADDRESS 0XFFEC CAPTURE2
都设置了.

[此贴子已经被作者于2008-4-17 11:37:05编辑过]

为什么PTT_PTT0  PTT_PTT1 输入捕捉能捕捉得到 PTT_PTT3  PTT_PTT4输入捕捉捕捉不到呢,这是什么原因,设置都是一样设置的
3.4的TIE没有使能
3 4 用的不就是TIM1么 TIE=0X03;这已经使能了,我刚刚 把TIE设置成0XFF也同样都不好使
那把旋钮2接到通道0又会怎样?
海纳百川  有容乃大
你试试,把PORT T先设为普通输出,运行程序
再设为普通输入,运行程序
再试试你那个程序.

没见过这样的问题,看它是不是坏了.
昨天SCI模块出了问题,一直置高电平,结果弄好了.
我的方法是,设置复用口为普通输出或输入.运行程序.
完了再改为SCI就行了.

可能是片子自身的问题.

en 旋扭2接到通道0是正常工作的,

   IO口输出高低,输入也都测过了,都正常,应该就是IO口的问题,现在我把PORT0 PORT4改接编码器1 , PORT1 PORT3改接编码器2,现在就都正常了.

[此贴子已经被作者于2008-4-18 13:33:28编辑过]

正常就好
返回列表