Как исправить ошибку компиляции для tone (), используя тот же таймер, что и другая функция
Я пытаюсь интегрировать функцию tone() в программу с открытым исходным кодом для пульсометра Amped. Ошибка:
Tone.cpp.o (символ из плагина): В функции `timer0_pin_port':
(.text+0x0): множественное определение `__vector_7'
sketch\PulseSensorAmped_Arduino_1dot4.ino.cpp.o (символ из плагина):(.text+0x0): впервые определено здесь
Программа поставляется в трех файлах. PulseSensorAmped_Arduino_1dot4.cpp Я не думаю, что ссылается на какие-либо таймеры, но ссылается на функцию в другом файле с этим кодом:
// Инициализирует Timer2 для создания прерывания каждые 2 мс.
TCCR2A = 0x02; // ОТКЛЮЧИТЬ ШИМ НА ЦИФРОВЫХ ВЫВОДАХ 3 И 11 И ПЕРЕХОДИТЬ В РЕЖИМ CTC
TCCR2B = 0x06; // НЕ ПРИНИМАТЬ СРАВНЕНИЕ, 256 PRESCALER
OCR2A = 0X7C; // УСТАНОВИМ НАЧАЛЬНУЮ ЧАСТЬ СЧЁТЧИКА НА 124 ДЛЯ ЧАСТОТЫ ВЫБОРКИ 500 Гц
TIMSK2 = 0x02; // ВКЛЮЧАЕМ ПРЕРЫВАНИЕ ПРИ СОВПАДЕНИИ МЕЖДУ TIMER2 И OCR2A
sei(); // УБЕДИТЕСЬ, ЧТО ГЛОБАЛЬНЫЕ ПРЕРЫВАНИЯ РАЗРЕШЕНЫ
При этом используется таймер 2; но разве это не ошибка для таймера 1? На справочной странице по тону() сказано, что тон мешает контактам 3 и 11. Можно ли это исправить?
ссылки:
https://www.arduino.cc/en/Reference/Tone
https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino
@rur2641, 👍4
Обсуждение1 ответ
Лучший ответ:
Похоже, что в библиотеке тонов используется таймер 2, и похоже, что ваш другой код также использует таймер 2, отсюда и сообщение об ошибке. Вектор 7 будет TIMER2_COMPA_vect (таймер 2 сравнивает "a").
Выводы 3 и 11 от таймера 2.
Я написал небольшую библиотеку, которая генерирует тоны, используя аппаратный ШИМ, а не прерывания. Вы можете прочитать об этом здесь.
Пример кода:
#include <TonePlayer.h>
TonePlayer tone1 (TCCR1A, TCCR1B, OCR1AH, OCR1AL, TCNT1H, TCNT1L); // контакт D9 (Уно), D11 (Мега)
void setup()
{
pinMode (9, OUTPUT); // выходной контакт фиксирован (OC1A)
tone1.tone (220); // 220 Гц
delay (500);
tone1.noTone ();
tone1.tone (440);
delay (500);
tone1.noTone ();
tone1.tone (880);
delay (500);
tone1.noTone ();
}
void loop() { }
Библиотеку можно загрузить с http://www.gammon.com.au/Arduino/TonePlayer.zip
При этом используется Таймер 1 (чтобы не мешать Таймеру 2) и никаких прерываний.
Для тех, кому интересно, при определении тона все эти коды кажутся адресом единственного рабочего контакта на Uno/Mega (контакт 9). Для Mega 2560 есть 3 разных контакта, а в файле TonePlayer.cpp
есть примеры., @brasofilo
Это правда, спасибо за разъяснение. В исходнике есть примеры выбора между 3 пинами (которые являются выходами трех аппаратных таймеров)., @Nick Gammon
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Генерация стабильной частоты
- Использовать timer0, не влияя на millis() и micros().
- Использование timer0 на Arduino Uno
В моем случае библиотека IR конфликтовала с Tone. Решение Ника работает отлично., @brasofilo