TI中文支持网
TI专业的中文技术问题搜集分享网站

【MSP430引脚的判断问题】

请教大家一个可能你们看来很简单的问题:

我把MSP430的2.1和2.2设为输入,上电的时候,其中有一个为高,另外一个是低但不确定是哪个,

过了一段时间顺序会颠倒过来,即之前拉高的现在变低,之前是低的现在拉高,判断状态变化之后把3.0输出为高,请问如何判断呢? 语句要怎么写。

谢谢。

A1Beyond:

回复 Jarvan Song:

多谢您的回答,程序是正确的。

另外再请教两个问题:

第一个补充问题:可以说是上个问题的扩充,我现在是想把2.1或者2.2的变化(其中一个即可),比如就设定为2.2,刚一上电2.2不是高(3.6V)就是低(0),这个不确定,当2.2变化的时候即由高转低,或者由低转高,我想设定一个2.2变化可以出发的中断,在中断里把3.0输出为高。

现在的想法是设置一个计数器,每隔一段时间(可以是几ms)中断一次,检测2.2的状态是否变化。我用的是MSP4301232,请问语句如何表达?谢谢。

 

另外第二个补充问题,现在就确定2.2开始的状态为低,我想设定一个2.2的上升沿触发中断,一旦2.2拉高触发中断,就在中断里把3.3拉高。但是我发现一个问题,这个上升沿触发中断太灵敏,我想给这个上升沿设置一个阈值,比如上升到3V再出发中断,请问MSP430支持吗?如果支持请问语句怎么表达?谢谢。

A1Beyond:

回复 Jarvan Song:

Jarvan Song

#include<msp430g25543.h>

void main(void)

{

P2DIR&=~BIT1;

P2DIR&=~BIT2;

      while(1)

     {

           if(P2IN&0x02)

           {

              if(P2IN&0x04)

               {

                      _NOP();

               }

              else

             {

                  P1DIR|=BIT3;

                  P1OUT|=BIT3;

             }

          else

         {

             if(P2IN&0x04)

            {

                 if(P2IN&0x02)

                 {

                       _NOP();

                  }

                  else

                   {

                       P1DIR|=BIT3;

                       P1OUT&=~BIT3;

                    }

     }

           }

     }

}

Jarvan Song:

回复 A1Beyond:

/* * main.c */void main(void){ P2DIR&=~BIT2; P3DIR|=BIT0; while(1) {

  if(P2IN&0x04)  {      P2REN |= BIT2;      P2IES &=~BIT2;      P2IE  |= BIT2;      P2IFG &=~BIT2;  }  else  {      P2REN |= BIT2;      P2IES |= BIT2;      P2IE  |= BIT2;      P2IFG &=~BIT2;  }   __bis_SR_register(LPM0_bits + GIE);

 }}#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){ if(P2IFG&BIT2) {  P2IFG&=~BIT2;  P3OUT|=BIT0;  __bic_SR_register_on_exit(LPM0_bits); }}

至于用定时器,我不建议用,因为当计数器正在计数的过程中,如果此时2.2发生中断那么你是没办法检测的,只有等到定时器中断才可以,那么你的gpio口的中断就没有任何意义。因为我可以只设定时器,每隔一段时间检测和比较他的状态和前一个状态的。

第二个问题:这个你完全可以在中断程序里面比较2.2的值与阀值的大小,然后决定该不该把3.3拉高。

比较的时候就得用ad采样了。

A1Beyond:

回复 Jarvan Song:

Jarvan Song

/* * main.c */void main(void){ P2DIR&=~BIT2; P3DIR|=BIT0; while(1) {

  if(P2IN&0x04)  {      P2REN |= BIT2;      P2IES &=~BIT2;      P2IE  |= BIT2;      P2IFG &=~BIT2;  }  else  {      P2REN |= BIT2;      P2IES |= BIT2;      P2IE  |= BIT2;      P2IFG &=~BIT2;  }   __bis_SR_register(LPM0_bits + GIE);

 }}#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){ if(P2IFG&BIT2) {  P2IFG&=~BIT2;  P3OUT|=BIT0;  __bic_SR_register_on_exit(LPM0_bits); }}

至于用定时器,我不建议用,因为当计数器正在计数的过程中,如果此时2.2发生中断那么你是没办法检测的,只有等到定时器中断才可以,那么你的gpio口的中断就没有任何意义。因为我可以只设定时器,每隔一段时间检测和比较他的状态和前一个状态的。

第二个问题:这个你完全可以在中断程序里面比较2.2的值与阀值的大小,然后决定该不该把3.3拉高。

比较的时候就得用ad采样了。

Jarvan Song:

回复 A1Beyond:

首先, P2REN |= BIT2是决定IO口是上拉电阻使能。第二个问题你可以在程序刚开始的时候就判断,2.2的高低,然后在中断了把他和下一个状态进行比较。io口没有你说的那种可以自己更改数值除法中断的功能。

A1Beyond:

回复 Jarvan Song:

Jarvan Song

首先, P2REN |= BIT2是决定IO口是上拉电阻使能。第二个问题你可以在程序刚开始的时候就判断,2.2的高低,然后在中断了把他和下一个状态进行比较。io口没有你说的那种可以自己更改数值除法中断的功能。

Jarvan Song:

回复 A1Beyond:

你要用那个IO口,就加上对应的语句,如果上电检测到是高电平,就设置下降沿触发,如果是低电平就设置上升沿中断,

void main(void){ P2DIR|=BIT2; unsigned char a; if(P2IN&0x04) {  a=0x01;

 } else {  a=0x00; }}#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A(void){ if(P2IN==a) {  _NOP(); } else {  a=P2IN;  P3DIR|=BIT0;  P3OUT|=BIT0; }}

Jarvan Song:

回复 A1Beyond:

上面程序定时器对应的寄存器参数没有设置,lz可以自己设置想要中断的时间。

A1Beyond:

回复 Jarvan Song:

Jarvan Song

你要用那个IO口,就加上对应的语句,如果上电检测到是高电平,就设置下降沿触发,如果是低电平就设置上升沿中断,

void main(void){ P2DIR|=BIT2; unsigned char a; if(P2IN&0x04) {  a=0x01;

 } else {  a=0x00; }}#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A(void){ if(P2IN==a) {  _NOP(); } else {  a=P2IN;  P3DIR|=BIT0;  P3OUT|=BIT0; }}

赞(0)
未经允许不得转载:TI中文支持网 » 【MSP430引脚的判断问题】
分享到: 更多 (0)