Embedded 使用ez430 RF2500建立RX/TX通信,以显示是否按下按钮

Embedded 使用ez430 RF2500建立RX/TX通信,以显示是否按下按钮,embedded,msp430,iar,Embedded,Msp430,Iar,我是一名机械工程师,拥有MatLab和Arduino的大部分编码经验。我正在使用EZ430-RF2500板,以便为我的capstone项目建立低电流通信。我正在使用IAR Embedded Workbench IDE 7.0 该代码的总体目标是,当且仅当按下板上按钮(Pin1.2)时,使变送器板以约1Hz的频率发送周期性数据包。然后,如果接收板正在接收数据包,则会打开LED(Pout1.1),但如果在大于1s(例如3秒)的特定时间内未接收到数据包,则会关闭LED(Pout1.1)。接收机和发射机

我是一名机械工程师,拥有MatLab和Arduino的大部分编码经验。我正在使用EZ430-RF2500板,以便为我的capstone项目建立低电流通信。我正在使用IAR Embedded Workbench IDE 7.0

该代码的总体目标是,当且仅当按下板上按钮(Pin1.2)时,使变送器板以约1Hz的频率发送周期性数据包。然后,如果接收板正在接收数据包,则会打开LED(Pout1.1),但如果在大于1s(例如3秒)的特定时间内未接收到数据包,则会关闭LED(Pout1.1)。接收机和发射机都有相同的编码,但使用不同的端口

这段代码与我成功遵循的教程()中的TX/RX talk示例非常相似,但我无法使代码正常工作

如果你感兴趣,请提供一些背景资料。本项目的目的是开发一种汽车座椅传感器,以防止婴儿被遗忘在车内。因此,当接收器位于监护人钥匙链上时,发射器将放置在座椅上

我尝试过的这段代码的不同版本产生了不同的结果。我很抱歉,如果有一些明显的错误,我是非常新的编译器和董事会。我一直使用的代码如下

    // If one button (p1.2) is pushed, the other boards red LED (p1.0) 
//Set Ports1.2 as input, set ports 1.0,1.1 (on board LEDS) as outputs

//GOAL: Set port 2.0 as input from Arduino, set port 2.1,2.2 as output for LED and Alarm
//Keep functionality of push button and turn on red LED(p1.0) for testing
//GOAL: Read port 2.0
//GOAL: If port 2.0 is HIGH, send packet
//GOAL: If packet is received, set Pout2.1,Pout2.2 as HIGH to activate LED/buzzer (for now)
//GOAL: Eventually add RSSI to determine if activate alarm. 




#include "mrfi.h"
#include "radios/family1/mrfi_spi.h"
int main(void)
{
  BSP_Init();           //*** Sets p1.0,1.1 as outputs, sets p1.2 as input, init MCLK at 8MHz, disables watchdog
  P1REN |= 0x04;        //*** 0100 Enables pull resistors (Needed for inputs)
  P1IE  |= 0x04;            //*** 0100 Enables interupts

//Eventual GOAL:
//  P2DIR |= 0x06;      //*** 0110 Pout2.1,Pout2.2 as outputs, all other inputs (Pin2.0)
//  P2REN |= 0x01;      //*** 0001 Enables pull resistor for Pin2.0   
//  P2OUT |= 0x03;      //*** 0001 Sets Pout2.1,Pout2.2 as Low, Enables Pull resistor for Pin2.0
        //*** May need to move P2OUT into another void

  MRFI_Init();
  MRFI_WakeUp();
  MRFI_RxOn();
  __bis_SR_register(GIE+LPM4_bits);
}
void MRFI_RxCompleteISR()   //*** If receives packet, turn on when packet is received, turn off if no packet is received after x seconds
                //*** GOAL: If packet is received, turn LED on, if packet is not received for certain time, turn LED off
{               //*** Eneventually would need to add RSSI to determine if alarm should sound


   int i;
   int j;
    P1OUT |= 0x02;
   for (i=0;i<10000;i++) {
 for (j=0;j<10;i++) {
      __no_operation();

  }
      __no_operation();

  }
   P1OUT ^= 0x02;
}  





#pragma vector=PORT1_VECTOR
__interrupt void Port_1 (void)

{               //*** On-Board actions
P1IFG &= 0x04;      //***  
P1OUT |= 0x00;  
  while (1) 
  {
if (P1IN == 0x04) {
  int i;
  mrfiPacket_t packet;                  //*** Initiate packet
  packet.frame[0]=8+20;
  MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);      //*** Send Packet
  P1OUT ^= 0x01;                    //*** Toggle Pout1.0 (RED LED) for Debugging
    for (i=0;i<30000;i++) 
    {               //*** Wait for next cycle
      __no_operation();
    }
   }
  } 
}
//如果按下一个按钮(p1.2),其他板将显示红色LED(p1.0)
//将端口1.2设置为输入,将端口1.0,1.1(车载LED)设置为输出
//目标:将端口2.0设置为Arduino的输入,将端口2.1,2.2设置为LED和报警的输出
//保持按钮的功能并打开红色LED(p1.0)进行测试
//目标:读取端口2.0
//目标:如果端口2.0高,发送数据包
//目标:如果收到数据包,将Pout2.1、Pout2.2设置为高以激活LED/蜂鸣器(目前)
//目标:最终添加RSSI以确定是否激活报警。
#包括“mrfi.h”
#包括“收音机/家庭1/mrfi_spi.h”
内部主(空)
{
BSP_Init();//***将p1.0,1.1设置为输出,将p1.2设置为输入,将Init MCLK设置为8MHz,禁用看门狗
P1REN |=0x04;//***0100启用拉电阻(输入所需)
P1IE |=0x04;//***0100启用中断
//最终目标:
//P2DIR |=0x06;//***0110 Pout2.1、Pout2.2作为输出,所有其他输入(Pin2.0)
//P2REN |=0x01;//***0001启用Pin2.0的牵引电阻器
//P2OUT |=0x03;//***0001将Pout2.1、Pout2.2设置为低,启用Pin2.0的牵引电阻器
//***可能需要移动到另一个空间
MRFI_Init();
MRFI_WakeUp();
MRFI_RxOn();
__bis_SR_寄存器(GIE+LPM4_位);
}
void MRFI_RxCompleteISR()//***如果收到数据包,则在收到数据包时打开,如果x秒后未收到数据包,则关闭
//***目标:如果收到数据包,则打开LED,如果在一定时间内未收到数据包,则关闭LED
{//***最终需要添加RSSI以确定警报是否响起
int i;
int j;
P1OUT |=0x02;

对于(i=0;i什么工作,什么不工作?发射机是否识别按钮按下?、发送数据包?、点亮LED?接收机是否接收到任何信息?或者点亮LED?您的ISR中可能不应该有这些延迟回路。(考虑如果接收器在上一个中断的延迟环路中接收到另一个中断会发生什么情况。)相反,在ISR中设置一个标志,让主环路检查该标志,并根据该标志进行延迟。@kkrambo代码的目的是最终确定是否按下了按钮,然后确定距离(使用RSSI)为了查看监护人是否在安全范围内。在连续按下按钮时发送周期性数据包失败后,我每次都使用中断发送数据包。这不是最终设计的方式,但它完成了原型的演示工作。然而,尽管代码似乎运行正常,RSSI似乎不起作用有任何与发射机距离有关的押韵或理由。可能是我的编码导致了这一点。@kkrambo您是否有使用EZ430RF2500板的RSSI的经验?我将发布与接收机相关的代码。这是部分代码
void MRFI_RxCompleteISR(){int m;for(m=0;m