Как исправить ошибку компиляции для 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

, 👍4

Обсуждение

В моем случае библиотека IR конфликтовала с Tone. Решение Ника работает отлично., @brasofilo


1 ответ


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

4

Похоже, что в библиотеке тонов используется таймер 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