Как исправить ошибку компиляции для тона (), используя тот же таймер, что и другие функции

Я пытаюсь интегрировать tone () с программой с открытым исходным кодом для монитора частоты сердечных сокращений Amped. Ошибка:

  

Tone.cpp.o (символ из плагина): В функции `timer0_pin_port ':

     

(. text + 0x0): множественное определение `__vector_7 '

     

sketch \ PulseSensorAmped_Arduino_1dot4.ino.cpp.o (символ из плагина) :( текст + 0x0): сначала определено здесь

Программа поставляется в трех файлах. PulseSensorAmped_Arduino_1dot4.cpp Я не думаю, что ссылки на любые таймеры, но ссылки на функцию в другом файле с помощью этого кода:

  // Initializes Timer2 to throw an interrupt every 2mS.
  TCCR2A = 0x02;     // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
  TCCR2B = 0x06;     // DON'T FORCE COMPARE, 256 PRESCALER 
  OCR2A = 0X7C;      // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
  TIMSK2 = 0x02;     // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
  sei();             // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

В этом случае используется таймер 2; но это не ошибка для таймера 1? На эталонной странице tone () говорится, что тон мешает контактам 3 и 11. Есть ли способ исправить это?

ссылки:

https://www.arduino.cc/ru/Reference/Tone

https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino

2 голоса | спросил rur2641 8 Jam1000000amSun, 08 Jan 2017 04:58:36 +030017 2017, 04:58:36

1 ответ


2

Похоже, что библиотека Tone использует Timer 2, и похоже, что ваш другой код также использует Timer 2, поэтому сообщение об ошибке. Вектор 7 будет TIMER2_COMPA_vect (сравните таймер 2 «a»).

Штыри 3 и 11 относятся к таймеру 2.

Я написал небольшую библиотеку, которая генерирует тональные сигналы с использованием аппаратной ШИМ, а не прерываний. Вы можете прочитать об этом здесь .

Пример кода:

#include <TonePlayer.h>

TonePlayer tone1 (TCCR1A, TCCR1B, OCR1AH, OCR1AL, TCNT1H, TCNT1L);  // pin D9 (Uno), D11 (Mega)

void setup() 
  {
  pinMode (9, OUTPUT);  // output pin is fixed (OC1A)

  tone1.tone (220);  // 220 Hz
  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) и никаких прерываний.

ответил Nick Gammon 8 Jam1000000amSun, 08 Jan 2017 05:24:30 +030017 2017, 05:24:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132