【求助】再发中断问题

zhaogu   2005-12-7 14:12 楼主
程序运行后,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,定义输出时,仿真器就出错,不知为什么.

回复评论 (11)

进入低攻耗了吧~
点赞  2005-12-7 14:34
当P2.1外部中断来时,会退出低功耗
点赞  2005-12-7 22:58
LPM4好像把MCLK ACLK SMCLK都关了,进入LPM4后你的Timer_A用什么时钟源?

while(1)
{
LPM4;
if(ISR_Symbol)break;
}
LPM4使系统进入低功耗,相应完又进入低功耗,好像无法执行if(ISR_Symbol)break;语句
点赞  2005-12-8 09:25
定时器中断关了吗
点赞  2005-12-8 11:02
大虾们看一下程序,程序中有一段P2口的中断服务程序
#pragma vector = PORT2_VECTOR
__interrupt void Port2()

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

}

主程序中在关闭看门狗后允许P2.1中断,并进入低功耗,我在P2.1与地之间焊了一个按键开关,当开关按下时,进入P2口中断服务程序并退出低功耗,初始化定时器,然后执行后面语句.我用仿真器调试过没问题,但在定时中断次数到了之后,还执行定时器中断服务程序,甚至还跳回到低功耗处.
点赞  2005-12-8 11:16
请大虾们仔细的耐心的帮我看一下程序,看看有什么办法解决.我看到有的资料上说:MSP430 在进入睡眠后,如果发生事件产生中断,那么单片机会退出睡眠,自动执行中断程序,但是当中断返回时,主程序又重新进入睡眠状态。如果要在发生中断后,主程序需要退出睡眠,那么需要在中断程序中修改SP 堆栈中的内容,C 语言没有指令可以修改堆栈内的内容.不知道我的问题是不是就这个问题.
点赞  2005-12-8 11:22
TACTL |= 0x00;???????????????????????????
停不了
点赞  2005-12-9 09:07

9楼 tsz 

引用:

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

退出中断现在一条指今就可以搞定
在中断最后一条语中写
_BIC_SR_IRQ(LPM0_bits);
点赞  2005-12-9 09:30
请问楼主,_BIC_SR_IRQ(LPM0_bits)和LPM0_EXIT是不是一样?
点赞  2005-12-9 13:35
中断里没有唤醒休眠啊
点赞  2005-12-12 13:08
#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
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复