4477|7

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

帮忙看个中断程序!!! [复制链接]

我初学msp的c,写了个小程序,程序如下:
/********************************************************************************************\
文件名:chushi.c
描述:MSP430框架程序。程序为MSP430F149编写,此处为简单的MSP程序,为初始学习实验例子。
版本:1.0.0.20070824
\********************************************************************************************/
lianxi.h
//在练习中自己定义的头文件
#ifndef _lianxi
#define _lianxi

//常量定义声明
#define AB0 BIT0
#define AB1 BIT1
#define AB2 BIT2
#define AB3 BIT3
#define AB4 BIT4
#define AB5 BIT5
#define AB6 BIT6
#define AB7 BIT7

//函数声明
void ClockInitSys(); //时钟模块初始化
void Port_Init(); //I/O模块初始化
void DelayOutput(); //I/O口延时输出,测试延时程序
void Ta_Init(); //TA初始化
void ClockChange(); //时钟切换至LFXT1
void Delay_100ms(); //延时100ms

#endif
/***************************************************************/


//头文件
#include <MSP430x16x.h>
#include "lianxi.h"
//主程序
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
ClockInitSys(); //时钟初始化

//start:
Port_Init(); //用户程序
DelayOutput(); //用户程序
ClockChange();
Delay_100ms();
// DelayOutput();
Ta_Init();
_EINT(); //打开全局中断
LPM1; //进入低功耗模式1
// goto start;

}

/*******************************************************************************************
时钟系统初始化
*******************************************************************************************/
void ClockInitSys()
{
unsigned int iq0;

//使用XT2振荡器
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for(iq0=0xFF;iq0>0;iq0--); //延时,等待XT2起振
}
while ((IFG1 & OFIFG)!=0); //判断XT2是否起振

BCSCTL2=SELM_2+DIVM_2+SELS+DIVS_2; //选择MCLK、**CLK为XT2,且MCLK、**CLK为4分频
//对各个模块初始化

}

/********************************************************************************************
I/O模块初始化
********************************************************************************************/
void Port_Init()
{
//P1、P3、P4口全设置为输出
P1DIR = 0xFF;
P3DIR = 0xFF;
P4DIR = 0xFF;

//P2.3设为输入,其他为输出
P2DIR = 0xF7;

//P1.1设为外设功能,即TA的OUT0输出
P1SEL |= AB2;

//P2.3使能中断并清标志,下降沿触发
P2IFG = 0;
P2IE |= AB3;
P2IES |= AB3;

//全输出为高电平
P1OUT = 0x30;
P2OUT = 0;
P3OUT = 0;
P4OUT = 0;
}

/********************************************************************************************
I/O延时输出
********************************************************************************************/
void DelayOutput()
{
unsigned int i,j;
// P1OUT |= AB1; //P1.1输出高电平
P1OUT |= AB1; //P1.1输出高电平

//延时1s
for(i=0;i<5155;i++)
for(j=0;j<17;j++);

P1OUT &= ~AB1;

}

/*******************************************************************************************
时钟切换
*******************************************************************************************/
void ClockChange()
{
BCSCTL1 = XT2OFF; //选择低频模式
BCSCTL2 = SELM_3; //
}

/*******************************************************************************************
Time_A初始化设置
*******************************************************************************************/
void Ta_Init()
{
TACTL=TASSEL_1+TACLR;
CCR0 = 20000;
CCR1 = 10000;
TACCTL1=OUTMOD_2; //PWM翻转

TACTL |= MC_1;
}
/********************************************************************************************
延时100ms
********************************************************************************************/
void Delay_100ms()
{
unsigned int i;
for(i=0;i<1309;i++);
}

/********************************************************************************************
P2口中断函数
********************************************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{

//判断是否为正确中断
if((P2IFG&AB3)==AB3)
{
_DINT();
// P2IE = 0;
P2IFG = 0;
unsigned int i,j;
//多次重复检测,进行软件消除干扰
for(i=0;i<100;i++)
{
if((P2IN&AB3)==0)
_NOP();
else
break;
}


//进行指示灯指示
if(i==100)
{ P1OUT &= ~AB4; //绿色指示灯,表示正确中断
for(j=0;j<6553;j++);
P1OUT |= AB4;
}
else
{ P1OUT &= ~AB5; //红色指示灯,表示正确中断
for(j=0;j<6553;j++);
P1OUT |= AB5;
}

_EINT();
// P2IE |= AB3;
}
//非正确中断,清标志,退出循环
else
P2IFG = 0;

}

现在问题是P2.3我采用按键中断,但几乎是每次按键后都会出现2次中断,找不到什么原因,请高手指点!!!!或者邮箱:qzliuhaiyun@163.com联系,谢谢

最新回复

确实,这段时间忙其他事情,呵呵 我采用的是延时多次检测消抖,是不是有些问题?通过观察寄存器得:这段消抖程序好像不是很有用的 //判断是否为正确中断 if((P2IFG&AB3)==AB3) { _DINT(); // P2IE = 0; P2IFG = 0; unsigned int i,j; //多次重复检测,进行软件消除干扰  ******* for(i=0;i<100;i++) { if((P2IN&AB3)==0) _NOP(); else break; } 不知道什么原因,不过也多谢3楼的提醒,中断不宜做太多事情的,呵呵  详情 回复 发表于 2007-10-31 11:11
 
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
呵呵,键盘输入怎么能用中断
 
 

回复

97

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如果想做实验的话还是可以在中断里面做一些事情的,
不过最好还是只在中断里面设置一个标志,在主程序里面做复杂一点事情,特别是延时的一些东西,最好不要在中断里面去做,那样会让系统运行效率很低的
void main()
{
if (BZ==1)
{.......}
}
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{

if((P2IFG&AB3)==AB3)
{
BZ=1;
P2IFG = 0;
}
}
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
在键盘输入的判断可以使用中断方式,在硬件电路上应该注意一下机械键盘的消抖!也可以通过软件延时实现。你现在程序运行中出现中断两次的现象,估计和这个有关系!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
说的极是
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼上说的对,应该加个延时消抖
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 

看了 3楼的帖子,感觉说的很有道理

 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

8
 
确实,这段时间忙其他事情,呵呵
我采用的是延时多次检测消抖,是不是有些问题?通过观察寄存器得:这段消抖程序好像不是很有用的
//判断是否为正确中断
if((P2IFG&AB3)==AB3)
{
_DINT();
// P2IE = 0;
P2IFG = 0;
unsigned int i,j;
//多次重复检测,进行软件消除干扰 *******
for(i=0;i<100;i++)
{
if((P2IN&AB3)==0)
_NOP();
else
break;
}
不知道什么原因,不过也多谢3楼的提醒,中断不宜做太多事情的,呵呵
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表