5123|11

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】再发中断问题 [复制链接]

程序运行后,P2.1开中断,并进入低功耗,中断后退出低功耗,初始化定时器,每隔125 US进入定时器中断服务程序,我要判断进入定时器中断的次数(page_length),满足条件后,退出定时器中断,我在主程序中判断 if(k>page_length)break; ,但怎么关不了中断,而且执行不到while后面的语句.

#include <MSP430x14x.h>
#define CLE BIT3
#define ALE BIT3
#define WE BIT6
#define CE BIT4
#define RE BIT5
#define page_length 2142 //85E=2142,总共85F页,即0-85E
#define RD BIT0
#define RB BIT7



void InitSys(); //系统初始化

unsigned int j,k=0,j1,j2=0,j3=0,j4=0;
unsigned char ISR_Symbol;
unsigned int i;

int main (void)
{
WDTCTL = WDTPW + WDTHOLD;

P2DIR &= ~BIT1;
P2SEL &= ~BIT1; //P2.1口允许中断;
P2IES |= BIT1;
P2IE |= BIT1;
P2IFG = 0;

P4DIR |= 0x00;
P5DIR |= 0x00;
P6DIR |= 0xFF;
ISR_Symbol = 0;


_EINT();

while(1)
{
LPM4;
if(ISR_Symbol)break;
}
ISR_Symbol = 0;
InitSys();

_NOP();
_NOP();



while(1)
{
if(k>page_length)break; //判断次数
}

TACTL |= 0x00;


while(1)
{
_NOP();


}

}




void InitSys() //系统初始化
{
unsigned int iq0;
BCSCTL1 &= ~XT2OFF;
do
{
IFG1 &= ~OFIFG;
for(iq0=0xFF; iq0>0; iq0--);
}
while ((IFG1 & OFIFG)!= 0);

BCSCTL2 = SELM_2 + SELS + DIVS_1; //启动XT2晶振;

TACTL = TASSEL1 + TACLR + MC0;
CCTL0 = CCIE; //初始化TA定时器
CCR0 = 500;
_EINT();

}

#pragma vector = PORT2_VECTOR
__interrupt void Port2()

{
LPM4_EXIT;
_NOP();
_NOP();


P2DIR &= ~BIT1;
if((P2IN&BIT1)==0)return;
for(j=0;j<100;j++);
if((P2IN&BIT1)==0)return;

P3DIR |= BIT1 + BIT4;
P3OUT |= BIT4; //为1
P3OUT &= ~BIT1; //为0 //P2口中断,给AD上电
_NOP();
_NOP();
_NOP();


P1DIR |= BIT0 + BIT7 + BIT6 + BIT5;
P1OUT |= BIT7 + BIT6; //A1、A2为1
P1OUT &= ~BIT5; //A0为0

P2IFG &= ~BIT1;


_DINT();
P2IFG = 0;
P2IE = 0;
ISR_Symbol = 0xff;
return;

}


#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
{
P1OUT ^= BIT0;
P1OUT ^= BIT0; //产生HOLD

for(j1=0xFF; j1>0; j1--); //延时
k++; //HOLD个数i加1

return;
}



另外小弟还问一个问题,我用MSP430F149的P6口与FLASH存储器I/O口相联,但一执行P6DIR|=0XFF,定义输出时,仿真器就出错,不知为什么.

最新回复

#include <In430.h> #define LPM0      _BIS_SR(LPM0_bits)     /* Enter Low Power Mode 0 */ #define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */ #define LPM1      _BIS_SR(LPM1_bits)     /* Enter Low Power Mode 1 */ #define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */ #define LPM2      _BIS_SR(LPM2_bits)     /* Enter Low Power Mode 2 */ #define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */ #define LPM3      _BIS_SR(LPM3_bits)     /* Enter Low Power Mode 3 */ #define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */ #define LPM4      _BIS_SR(LPM4_bits)     /* Enter Low Power Mode 4 */ #define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */ #endif /* End #defines for C */ yiyang  详情 回复 发表于 2005-12-12 13:27
 
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
进入低攻耗了吧~
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
当P2.1外部中断来时,会退出低功耗
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
LPM4好像把MCLK ACLK SMCLK都关了,进入LPM4后你的Timer_A用什么时钟源?

while(1)
{
LPM4;
if(ISR_Symbol)break;
}
LPM4使系统进入低功耗,相应完又进入低功耗,好像无法执行if(ISR_Symbol)break;语句
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
定时器中断关了吗
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
大虾们看一下程序,程序中有一段P2口的中断服务程序
#pragma vector = PORT2_VECTOR
__interrupt void Port2()

{
LPM4_EXIT;
.
.
.
.
.
ISR_Symbol = 0xff;
return;

}

主程序中在关闭看门狗后允许P2.1中断,并进入低功耗,我在P2.1与地之间焊了一个按键开关,当开关按下时,进入P2口中断服务程序并退出低功耗,初始化定时器,然后执行后面语句.我用仿真器调试过没问题,但在定时中断次数到了之后,还执行定时器中断服务程序,甚至还跳回到低功耗处.
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
请大虾们仔细的耐心的帮我看一下程序,看看有什么办法解决.我看到有的资料上说:MSP430 在进入睡眠后,如果发生事件产生中断,那么单片机会退出睡眠,自动执行中断程序,但是当中断返回时,主程序又重新进入睡眠状态。如果要在发生中断后,主程序需要退出睡眠,那么需要在中断程序中修改SP 堆栈中的内容,C 语言没有指令可以修改堆栈内的内容.不知道我的问题是不是就这个问题.
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
TACTL |= 0x00;???????????????????????????
停不了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用:

请大虾们仔细的耐心的帮我看一下程序,看看有什么办法解决.我看到有的资料上说:MSP430 在进入睡眠后,如果发生事件产生中断,那么单片机会退出睡眠,自动执行中断程序,但是当中断返回时,主程序又重新进入睡眠状态。如果要在发生中断后,主程序需要退出睡眠,那么需要在中断程序中修改SP 堆栈中的内容,C 语言没有指令可以修改堆栈内的内容.不知道我的问题是不是就这个问题.

退出中断现在一条指今就可以搞定
在中断最后一条语中写
_BIC_SR_IRQ(LPM0_bits);
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

10
 
请问楼主,_BIC_SR_IRQ(LPM0_bits)和LPM0_EXIT是不是一样?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
中断里没有唤醒休眠啊
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
#include <In430.h>

#define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */
#define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */
#define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */
#define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */
#define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */
#define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */
#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */
#define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */
#define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */
#define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */
#endif /* End #defines for C */

yiyang
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表