На ATtiny84, почему delay() перестает работать, когда используется RadioHead ASK?

Когда я вызываю функцию delay() на микроконтроллере ATtiny84, она задерживается на ожидаемое время, пока я не вызову функцию init() на Объект RH_ASK. После этого микро кажется зависшим.

#include <RH_ASK.h>
RH_ASK driver();

void setup() {
    delay(100); // работает нормально
    driver.init();
    delay(100); // зависает надолго (а может навсегда?)
}

, 👍0


1 ответ


Лучший ответ:

2

Прочитав исходный код RH_ASK.cpp, я обнаружил закомментированный макрос.

// RH_ASK на ATtiny8x использует таймер 0 для генерации прерываний 8 раз за
// битовый интервал. Таймер 0 используется платформой Arduino для millis()/micros().
// который используется функцией delay()
// Раскомментируйте определение RH_ASK_ATTINY_USE_TIMER1 ниже, если вы хотите использовать
// Таймер 1 вместо Таймера 0 на ATtiny
// Таймер 1 также используется некоторыми другими библиотеками, например Servo. Всегда проверяйте
// использование Таймера 1 перед его включением.
// Должен быть перемещен в заголовочный файл
//#define RH_ASK_ATTINY_USE_TIMER1

Другими словами, по умолчанию RadioHead ASK init() использует Timer 0, что вызывает delay() (который использует millis()/micro()) для некорректного поведения.

Что исправить: скажите RadioHead ASK использовать таймер 1. Поскольку макрос RH_ASK_ATTINY_USE_TIMER1 находится в исходном коде, а не в заголовке (на данный момент), вам необходимо изменить фактический исходный файл RadioHead ASK, RH_ASK.cpp*. Снимите комментарий со строки #define RH_ASK_ATTINY_USE_TIMER1, в которой будет использоваться Таймер 1 вместо Таймер 0. Перекомпилируйте свой код, и delay() снова начнет работать правильно.

* RH_ASK.cpp можно найти в %USERPROFILE%\Documents\Arduino\libraries\RadioHead в Windows, если вы установили RadioHead через менеджер библиотек Arduino IDE.

,