【问题标题】:Embedded system: MSP430g2553 IAR programming ports/pins BASIC Input / Output syntax嵌入式系统:MSP430g2553 IAR 编程端口/引脚 BASIC 输入/输出语法
【发布时间】: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 分配。使用按位逻辑运算符而不是算术,并将事物适当地组合在一起。

标签: c io embedded iar


【解决方案1】:

首先,这是定义输入/输出的正确方法吗?

我假设 P1DIR 是正确的数据方向寄存器(我不详细了解这个特定的 MCU),但除此之外:不,它不正确。首先,使用按位 OR | 而不是加法。它们给出了相同的结果,但+ 使代码看起来很奇怪并且有点难以阅读。一般的 C 编程书籍会告诉你:

P1DIR |= BIT0 | BIT1;

请注意,P1DIR |= ... 将使当前设置为输出的所有引脚保持原样。这可能是也可能不是你想要的。

要设置端口引脚处于活动状态,只需执行相同操作,SOME_PORT_REGISTER |= PIN_MASK;。同样,您可以使用^= 切换单个引脚,这是按位异或。或者使用 &= ~(mask) 将其设置为零。

P1DIR &= ~BIT2 + BIT3 + BIT4; 是错误的,~ 是一元运算符,仅适用于一个操作数。更正代码:

P1DIR &= ~(BIT2 | BIT3 | BIT4);

我看过很多教程

不幸的是,网络上的大多数教程都很糟糕。首先阅读一本体面的 C 编程书籍。一旦你学会了 C 的基础知识,你就可以去寻找教程了。

比如我这里写的这篇关于寄存器访问的文章,假设读者已经知道C:How to access a hardware register from firmware?

至于完整的初学者教程,我认为这个质量比大多数都好:Embedded Software in C for an ARM Cortex M, Jonathan W. Valvano and Ramesh Yerraballi。 (是 Cortex M 而不是 MSP430 但无论 MCU 原理都非常相似。同一作者还有一个较旧的教程,使用 NXP HSC12 示例,这与 MSP430 更相似的另一个 16 苦。)

【讨论】:

  • 谢谢!我会调查你链接的资源。我想我在不断挖掘和尝试的过程中也让它发挥了作用。我发现我可以直接用二进制/十六进制代码设置引脚,即。 P1DIR |= 0x03 这将引脚 1 和 2 设置为输出。我可以类似地设置输出,即 P1OUT = 0x01 将第一个输出设置为 1,将第二个输出设置为零。对于输入检查,我编写了一个简单的函数,它接收掩码字符和字符中的输入位,返回 & op 的结果。我的状态机似乎运行良好!这是我的学校项目,一个线跟随机器人。我明天要测试代码。我真的很喜欢嵌入式系统
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多