Arduino XBee和看门狗定时器传输不工作

Arduino XBee和看门狗定时器传输不工作,arduino,watchdog,xbee,zigbee,Arduino,Watchdog,Xbee,Zigbee,我已经创建了一个使用每八秒运行一次的看门狗计时器的。我用计数器等了64秒(大约一分钟) 此外,我在XBee上使用了pin休眠模式。XBee通信与pin休眠一起正常工作。如果我加上这个,它就会停止工作。程序是否从看门狗中断前执行的最后一行重新启动 #include <avr/sleep.h> #include <avr/power.h> #include <avr/wdt.h> #include <XBee.h> XBeeAddress64 coo

我已经创建了一个使用每八秒运行一次的看门狗计时器的。我用计数器等了64秒(大约一分钟)

此外,我在XBee上使用了pin休眠模式。XBee通信与pin休眠一起正常工作。如果我加上这个,它就会停止工作。程序是否从看门狗中断前执行的最后一行重新启动

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <XBee.h>

XBeeAddress64 coordAddr = XBeeAddress64(0x0013a200, 0x4090c5a6);
uint8_t xbeePayload[] = "Hello";
XBee xbee = XBee();

ZBTxRequest zbTx = ZBTxRequest();
ZBTxStatusResponse txStatus = ZBTxStatusResponse();

int XBee_pin = 9;          // This pin wakes up the XBee and puts it to sleep.
int counter = 0;

void sendData() {
    zbTx.setAddress64(coordAddr);
    zbTx.setAddress16(0xFFFE);
    zbTx.setPayload(xbeePayload);
    zbTx.setPayloadLength(sizeof(xbeePayload));
    xbee.send(zbTx);
}

ISR(WDT_vect)
{
    counter++;
}

void enterSleep(void)
{
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();

    /* Now enter sleep mode. */
    sleep_mode();

    /* The program will continue from here after the WDT timeout */
    sleep_disable(); /* First thing to do is disable sleep. */

    /* Re-enable the peripherals. */
    power_all_enable();
}

void setup()
{
    // To reduce power, setup all pins as inputs with without any pullups
    /*for(int x = 1 ; x < 18 ; x++){
          pinMode(x, INPUT);
          digitalWrite(x, LOW);
    }*/

    pinMode(XBee_pin, OUTPUT);
    digitalWrite(XBee_pin, HIGH);
    xbee.begin(9600);
    delay(5000);

    /*** Setup the WDT ***/

    /* Clear the reset flag. */
    MCUSR &= ~(1 << WDRF);

    /* In order to change WDE or the prescaler, we need to
     * set WDCE (this will allow updates for 4 clock cycles).
     */
    WDTCSR |= (1 << WDCE) | (1 << WDE);

    /* Set new watchdog timeout prescaler value */
    WDTCSR = 1 << WDP0 | 1 << WDP3; /* 8.0 seconds */

    /* Enable the WD interrupt (note no reset). */
    WDTCSR |= _BV(WDIE);

    //Serial.println("Initialisation complete.");
    //delay(100); //Allow for serial print to complete.

    ADCSRA &= ~(1 << ADEN); //Disable ADC
    ACSR = (1 << ACD);  //Disable Analog Comparator
    DIDR0 = 0x3E;    //Disable digital input buffers on ADC1-ADC5 pins
    DIDR1 = (1 << AIN1D)|(1 << AIN0D); //Disable digital input buffer on AIN1/0

    power_twi_disable();
    power_spi_disable();
    power_usart0_disable();
    //power_timer0_disable(); //Needed for delay_ms
    power_timer1_disable();
    power_timer2_disable();
}

void loop()
{
    if(counter == 8)
    {
        counter = 0;
        pinMode(XBee_pin, OUTPUT);
        digitalWrite(XBee_pin, LOW);
        delay(5000);
        sendData();
        delay(2000);
        pinMode(XBee_pin, INPUT);
        digitalWrite(XBee_pin, HIGH);

        /* Re-enter sleep mode. */
        enterSleep();
    }
}
#包括
#包括
#包括
#包括
XBEEDAddress64 coordAddr=XBEEDAddress64(0x0013a200,0x4090c5a6);
uint8_t xbeePayload[]=“你好”;
XBee XBee=XBee();
ZBTxRequest zbTx=ZBTxRequest();
ZBTxStatusResponse txStatus=ZBTxStatusResponse();
int XBee_pin=9;//此pin会唤醒XBee并使其进入睡眠状态。
int计数器=0;
void sendData(){
zbTx.setAddress64(coordAddr);
zbTx.setAddress16(0xFFFE);
zbTx.setPayload(xbeePayload);
zbTx.setPayloadLength(sizeof(xbeePayload));
xbee.send(zbTx);
}
行业特殊风险(WDT_vect)
{
计数器++;
}
无效进入睡眠(无效)
{
设置睡眠模式(睡眠模式关闭);
sleep_enable();
/*现在进入睡眠模式*/
睡眠模式();
/*WDT超时后,程序将从此处继续*/
sleep_disable();/*首先要做的是禁用睡眠*/
/*重新启用外围设备*/
电源全部启用();
}
无效设置()
{
//要降低功耗,请将所有引脚设置为输入,无需任何上拉
/*对于(int x=1;x<18;x++){
pinMode(x,输入);
数字写入(x,低);
}*/
引脚模式(XBee_引脚,输出);
数字写入(XBee_引脚,高电平);
xbee.begin(9600);
延迟(5000);
/***设置WDT***/
/*清除重置标志*/
MCUSR&=~(1enterSleep()需要在if语句之外。您当前的实现在循环中旋转(),等待8个看门狗超时,执行代码一次,然后休眠、唤醒并执行相同的旋转。我相信代码应该是这样的

void loop()
{
  if(counter == 8)
  {
     counter = 0;
    pinMode(XBee_pin, OUTPUT);
    digitalWrite(XBee_pin, LOW);
    delay(5000);    
    sendData();
    delay(2000);
    pinMode(XBee_pin, INPUT);    
    digitalWrite(XBee_pin, HIGH);
  }
  /* Re-enter sleep mode. */
  enterSleep();
}
另外,请注意,在发生延迟时,看门狗仍在运行。它可能会在if语句中再次触发,您应该在以下几个位置发出wdt_reset()

void loop()
{
  if(counter == 8)
  {
     counter = 0;
    pinMode(XBee_pin, OUTPUT);
    digitalWrite(XBee_pin, LOW);
    delay(5000); 
    wdt_reset();
    sendData();
    wdt_reset();
    delay(2000);
    pinMode(XBee_pin, INPUT);    
    digitalWrite(XBee_pin, HIGH);
  }
  /* Re-enter sleep mode. */
  enterSleep();
}

我不确定这将需要不到8秒的时间…我认为最好暂时禁用看门狗计时器…你有什么建议?传输现在正在工作。这是示意图:它使用了一些节能选项,xBee引脚的电源休眠和电源完成模式。问题是我需要等待一段时间我需要很长时间(大约10秒)才能发送数据包。我哪里错了?你使用的是哪个xBee模块?我想看看我是否能设计出一些使用中断+看门狗(安全计时器)的东西因此,您可以在等待xBee出现时休眠micro。使用RPSMA Connector的xBee PRO Series 2您可能想知道为什么需要这么长时间才能起床。我在另一个xBee规范中读到,唤醒时间应该是毫秒,而不是秒。您应该先调试这一巨大延迟,因为它将减少唤醒时间xBee设备开启的时间。如果xBee一直处于唤醒状态,而你在Arduino上睡觉,那么最终你不会节省那么多电量。