Как изменить таймер?

photomuza

✩✩✩✩✩✩✩
16 Сен 2021
6
0
Пытаюсь приладить код сирены в код приемника.
Код приемника:
C++:
///////// подключение сервы  на D3 //////////
///////// мотор 1 - D2 D5 //////////
///////// мотор 2 - D4 D6 //////////

#include <SPI.h>  // Подключаем библиотеку для работы с SPI-интерфейсом
#include "nRF24L01.h" // Подключаем файл конфигурации из библиотеки RF24
#include "RF24.h" // Подключаем библиотеку для работа для работы с модулем NRF24L01
#include "GyverMotor.h"
#include <Servo.h>
GMotor motor0(DRIVER2WIRE, 2, 5, HIGH); //IN1 -> PIN2, IN2 -> PIN3
GMotor motor1(DRIVER2WIRE, 4, 6, HIGH); //IN3 -> PIN4, IN4 -> PIN5
Servo myservo;
byte servo = 3; // сервопривод на 3 цифровом

RF24 radio(9, 10); // CE, CSN модуль nrf24l01 + pa + lna на пинах RF24 radio(9,10); Для Уно/нано. RF24 radio(9,53); для Меги.

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

int recieved_data[15]; //Для nrf24

void setup() {

/////////////// СЮДА ВСТАВЛЯЮ НАСТРОЙКИ СИРЕНЫ И МИГАЛКИ ///////////////

  Serial.begin(9600); //открываем порт для связи с ПК
  myservo.attach(servo);


// Пины D5 и D6 - 31.4 кГц
TCCR0B = 0b00000001;  // x1
TCCR0A = 0b00000001;  // phase correct

  motor0.setSmoothSpeed(20); // установка скорости изменения скорости (ускорения) мотора
  motor0.setMode(AUTO);
  motor1.setSmoothSpeed(20); // установка скорости изменения скорости (ускорения) мотора
  motor1.setMode(AUTO);
  Serial.begin(9600); //открываем порт для связи с ПК
  radio.begin(); //активировать модуль
  radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) сигнал постабильние
  radio.enableAckPayload();//разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);//размер пакета, в байтах
  radio.openReadingPipe(1, address[0]);//хотим слушать трубу 0
  radio.setChannel(0x71);//выбираем канал (в котором нет шумов!)
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}
void loop() {
  NRF24L01();
      myservo.write(recieved_data[2]); // повернуть серво на угол 0..180
   setMotorL298();
}
void NRF24L01() {
  if (radio.available() > 0) {
    radio.read(&recieved_data, sizeof(recieved_data));

  }
}


void setMotorL298() {
  if (recieved_data[0] > 5 || recieved_data[0] < -5) {
    motor0.smoothTick(recieved_data[0]);
  } else {
    recieved_data[0] = 0;
    motor0.smoothTick(recieved_data[0]);
  }
  if (recieved_data[1] > 5 || recieved_data[1] < -5) {
    motor1.smoothTick(recieved_data[1]);
  } else {
    recieved_data[1] = 0;
    motor1.smoothTick(recieved_data[1]);
  }
}
/////////////// СЮДА ВСТАВЛЯЮ КОД СИРЕНЫ И МИГАЛКИ ///////////////
Код сирены:
C++:
void setup() {
//настройка сирены
pinMode(7,OUTPUT); // speaker на 7 ноге
tone(7,300); // цифровой пин, с какой частоты начинать гудеть
//настройка мигалки
TCCR1A=0; // Если закомментить, мигают по 1 разу
OCR1A=624;// 40ms
TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode
TIMSK1=1<<OCIE1A;
pinMode(A1,OUTPUT);// светодиод на A1 ноге
pinMode(A2,OUTPUT); // светодиод на A2 ноге
}

void loop() { }

ISR (TIMER1_COMPA_vect) {
static byte n=1;
static byte spik=40;
static boolean count_direct=false;
if (n<=6) PORTC^=(1<<1);//6 тиков моргать светодиодом на A1 ноге
if (n>=18&&n<=23) PORTC^=(1<<2);//6 тиков моргать светодиодом на A2 ноге
n==35? n=1:n++;
if (count_direct==false){
    spik==60? count_direct=true : spik++; // 50-150 - скорость завывания сирены
    }
if (count_direct==true){
    spik==40? count_direct=false : spik--;
    }
OCR2A=spik;
}
ОШИБКА:
libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':
(.text+0x0): multiple definition of `__vector_11'
sketch\new-RX_Priyoum6_6.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1

Ошибка компиляции для платы Arduino Nano.
Сказали, что серво и сирена на одном таймере. Проверил: закомментил все строки с сервой - так и есть.
Теперь задачка: как изменить таймер сирене (или серве)?
 

photomuza

✩✩✩✩✩✩✩
16 Сен 2021
6
0
Скачал, заменил. Ошибка исчезла, но сирена не работает. А сама серво не знаю, т.к. не подключена. Что делает ServoTimer2 толком непонятно, описания минимум - "не использует Timer1 в случае конфликта", больше информации не нашел. Да и смысл, если не работает просто замена. А перелопачивать код - опять же смысл?

Сорри, еще раз проделал, в первый раз код недовставил. Сейчас ошибки нет, мигалка заработала, сирена молчит пока. Ща покумекаю еще... Спасибо за наводку!

Не, все-таки сирена не воет, видимо еще одного таймера не хватает.