На ATtiny84, почему delay() перестает работать, когда используется RadioHead ASK?
Когда я вызываю функцию delay()
на микроконтроллере ATtiny84, она задерживается на ожидаемое время, пока я не вызову функцию init()
на Объект RH_ASK
. После этого микро кажется зависшим.
#include <RH_ASK.h>
RH_ASK driver();
void setup() {
delay(100); // работает нормально
driver.init();
delay(100); // зависает надолго (а может навсегда?)
}
@Nick Bolton, 👍0
1 ответ
Лучший ответ:
Прочитав исходный код 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.
- При использовании Arduino Uno в качестве ISP: "Yikes! Invalid device signature" - плохое соединение, неверную конфигурацию или неверную версию avrdude?
- Связь ATtiny85 с компьютером через USB
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- avrdude: ошибка проверки, первое несоответствие в байте 0x0000 : 0x00 != 0x16 с использованием USBasp
- Радиочастотное дистанционное управление с использованием VirtualWire на ATtiny85, работающем на частоте 8 МГц на внутреннем генераторе
- I2C с ATtiny85 на частоте 8 МГц с использованием библиотеки TinyWireM
- Эмуляция 1-проводных устройств
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?