请教大家一个可能你们看来很简单的问题:
我把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; }}