【发布时间】:2021-05-27 04:23:32
【问题描述】:
简单地说:如何在 IAR EW 中使用 MSP430g2553 正确定义和使用端口/引脚?
我会用例子来澄清我不明白的地方。
我有一个具有 3 个状态的简单状态机。我想为输入编程 3 个引脚,为输出编程 2 个引脚。 然后,根据输入我管理状态。
首先,这是定义输入/输出的正确方法吗?
P1DIR |= BIT0 + BIT1; //pins 1.0 and 1.1 output
P1DIR &= ~BIT2 + BIT3 + BIT4; // pins 1.2 , 1.3, 1.4 input
在我看来,上面的内容使用起来相当简单,但是,更大的问题是如何在代码中引用输入引脚?以及如何根据输入设置输出?
为了进一步解决我的问题,这是我的状态机的起始代码,并且我在我不明白如何编写语法的地方放入了伪代码。如果有人可以填写伪代码并进行一些注释,那将有很大帮助。我看过很多教程,但我似乎没有从他们那里得到这个简单的东西。
# include "msp430g2553.h"
# include "stdio.h"
# include "math.h"
#define START 1
#define LEFT_ON 2
#define RIGHT_ON 3
char STATE;
main ()
{
P1DIR |= BIT0 + BIT1; //port 1.0 and 1.1 output
P1DIR &= ~BIT2 + BIT3 + BIT4; // port 1.2 , 1.3, 1.4 input
WDTCTL = WDTPW + WDTHOLD;
STATE =START;
while(1)
{
//STATE = START;
switch (STATE)
{
case START:
{
// Starting state I want both outputs to be set 1, I dont know how
set p1.0 to 1
set p1.1 to 1
puts("START");
//check inputs to switch state
if (1.2 == 1 & 1.3==0 & 1.4==0) {
STATE = RIGHT_ON;
} else if (1.2 == 0 & 1.3==0 & 1.4==1)) {
STATE = LEFT_ON;
}
break;
}
case LEFT_ON:
{
// Here I wish to to put 1.0 output to 1 and 1.1 output to 0
p1.0 set to 1
p1.1 set to 0
// now check if 1.3 is 1
if (1.3 == 1) {
STATE = START;
}
break;
}
case RIGHT_ON:
{
// Here I wish to to put 1.0 output to 0 and 1.1 output to 1
p1.0 set to 0
p1.1 set to 1
// now check if 1.3 is 1
if (1.3 == 1) {
STATE = START;
}
break;
}
}//end of Switch
}// end of while
}// end of main
【问题讨论】:
-
让我给出一些线索,而不是 P1DIR |= BIT0 + BIT1; , P1DIR | = ((BIT0) | (BIT1));更好。其次,在您的状态机中,有很多 int == 双重压缩。这些比较肯定会创建 UB。比较相同类型的值。
-
"int == 双重压缩。" 我的意思是伪代码,我想将 pin1.0 设置为 1,这是伪代码,不是实际的。如何编写语法来创建该伪代码,这就是我想知道的。如果输出端口 1 引脚 1.0,我如何编写语法来更改该引脚以提供输出 1?
-
我已经好多年没碰MSP430了,但类似于有一个P1DIR寄存器用于设置端口1上的引脚方向,应该有另一个寄存器与端口1的值相关联. 也许是 P1IN 和 P1OUT?此外,您需要修复您的 P1DIR 分配。使用按位逻辑运算符而不是算术,并将事物适当地组合在一起。