attiny, low pwr и virtualwire

Тема в разделе "Микроконтроллеры AVR", создана пользователем Megahertz, 18 май 2017.

  1. Megahertz

    Megahertz Нуб

    Добрый день форумчане
    Пытаюсь реализовать следующую задачу на attiny:
    Есть attiny85 и rf433. Необходимо посылать слово "test" по rf433 на приемник и затем в целях энергосбережения уходить в сон на 8 секунд, затем снова просыпаться, и так по кругу. Если использовать вместо rf433 и библиотеки virtualwire обычный led чтобы отследить работоспособность то как бы вроде все работает, потребление в режиме сна достаточно мало чтобы заставить работать передатчик без замены батарейки, пример:
    Код (C++):

    #include <avr/sleep.h>
    #include <avr/wdt.h>
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif
    int Led = 2;
    volatile boolean f_wdt = 1;

    void setup(){
    pinMode(Led,OUTPUT);
    }

    void loop(){
    if (f_wdt==1) {
    f_wdt=0;

    digitalWrite(Led,HIGH);
    delay(300);
    digitalWrite(Led,LOW);
    pinMode(Led,INPUT);
    deep_sleep();
    pinMode(Led,OUTPUT);
    }}
    void deep_sleep() {
    int ii = 9;
      byte bpb;
      int ww;
      if (ii > 9 ) ii=9;
      bb=ii & 7;
      if (ii > 7) bb|= (1<<5);
      bb|= (1<<WDCE);
      ww=bb;

    MCUSR &= ~(1<<WDRF);
    // start timed sequence
    WDTCR |= (1<<WDCE) | (1<<WDE);
    // set new watchdog timeout value
    WDTCR = bb;
    WDTCR |= _BV(WDIE);
    cbi(ADCSRA,ADEN);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sleep_mode();
    sleep_disable();
    sbi(ADCSRA,ADEN);
    }

    // Watchdog Interrupt Service / is executed when watchdog timed out
    ISR(WDT_vect) {
    f_wdt=1;  // set global flag
    }
    Но как только я подключаю библиотеку virtualwire, настраиваю датчик и пытаюсь что либо передать, wdt перестает работать, данные через модуль тоже не передаются.
    Пример:
    Код (C++):
    #include <VirtualWire.h>
    ..
    void setup(){
    pinMode(pinLed,OUTPUT);
       vw_set_ptt_inverted(true);
       vw_set_tx_pin(1);
       vw_setup(2000);
    }
    ...
    void loop(){
    if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    f_wdt=0; // reset flag
    char msg[36];
    printf(msg, "test");
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    digitalWrite(pinLed,HIGH);
    delay(300);
    digitalWrite(pinLed,LOW);
    pinMode(pinLed,INPUT);
    deep_sleep(2);
    pinMode(pinLed,OUTPUT);
    }}
    ...
    Подключаю все на прямую, резисторы, емкости, или кварц для теста на макетке не использую. Если пытаться передать что-то без wdt то virtualwire при вышеупомянутой конфигурации(второй пример) работает без проблем.
    Что я делаю неправильно?
     
    Последнее редактирование: 18 май 2017
  2. Unixon

    Unixon Оракул Модератор

    Посмотрите, что там VirtualWire делает внутри себя во время инициализации.