int0 int1 int2 int3 int4 это номера прирываний timer0 timer1 timer2 timer3 timer4 здесь глянь и станет все ясно
SPI c pin0 не связанны на пинах 0,1 UART 2,3 связанны с теми что подписанны на плате SCL SDA это и есть квадратная шина, SPI выведен на отдельный разем (SPI процессора)
Например если подключаешь дисплей по SPI там в зависимости как органезованна библиотека для конкретного устройства и там же прописанны пины.
Можещь запускать и останавливать таймеры когда тебе надо, инициалезируешь таймер и при инициализации указываещь номер таймера . нужно посмотреть, как на леонардо, точнее какой таймер за что отвечает. Например timer0 системный таймер, timer1 управляет ШИМ итд... Точно посмотрю и напишу.
Посмотри здесь описание функции attachInterrupt()
Запускаем таймер при появлении сигнала и останавливаем при исчезновении, записывая длинну сигнала.
библиотека просто дает возможность задействовать мощный системный таймер. почитай здесь про библиотеку
вот пример, делал обработку сигнала с RC пульта.
ps: просьба заключать выкладываемые примеры кодов в php teg (доступен в расшыренном режиме написания сообщения)PHP код:#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define L 5 // Выход на H-Мост вращение в лево
#define R 6 // Выход на H-Мост вращение в право
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
startImpuls=0;
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
pinMode (L, OUTPUT);
pinMode (R, OUTPUT);
Serial.begin(115200);
Timer1.initialize(10); // Интервал срабатывания таймера 10мкс
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING); // Запуск таймера при наличии сигнала HIGH
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
if (li > 100 && li < 150) // эамер сигнала для вращения в лево
analogWrite (L, 23 - li);
if (li > 155 && li < 200) // эамер сигнала для вращения в право
analogWrite (R, 23 - li);
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, RISING);
}




Ответить с цитированием