Re: PPM энкодер на ...дуино
Поверьте, я ночью столько перепробовал и было почти уже добился, но превысил время обработки моих if в void impDown() и начало выдавать нули. Получается, что на мой анализ не хватило 500 мкс. Вычистил, кстати переменные оставил в скетче, но важно не это, я нигде не могу найти развернутого описания функции attachInterrupt(0, переход, событие);
что такое 0 ?
CHANGE, RISING, FALLING - понятно, но не до конца, что она будет делать, если не произойдет ожидаемое событие? Наверно поэтому и ставят detachInterrupt(0);
Про LOW вообще в описании завуалировано, не понятно когда произойдет событие.
Re: PPM энкодер на ...дуино
0 это прерывание int0, может быть int1, int2 и т.д.
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
0 это прерывание int0, может быть int1, int2 и т.д.
Спасибо, удобно и просто.
Может и правда задействовать еще один таймер? Тогда можно независимо считать и отрицательный и положительные импульсы.
Про LOW есть информация?
И еще, delayMicroseconds() и micros() к какому таймеру привязаны?
Re: PPM энкодер на ...дуино
Попробовал int2, int3 - возвращает 0, видимо не работают. :(
Re: PPM энкодер на ...дуино
На Arduino 328/168 только INT0, INT1
НО для меги можно настроить int0-int7
Re: PPM энкодер на ...дуино
Так у меня оба эти таймера задействованы, но сейчас это не важно,притормозил из-за зависания в прерывании. Как не давать ему уходить ему в нирвну.
При появлении помехи или выключении передатчика, с пол-секунды еще пытается выводить мелкие длительности, но а потом виснет. Реально в тупике.
Прошу помощи.
Re: PPM энкодер на ...дуино
Это не таймеры, это внешние прерывания
Позже код посмотрю , я еще на работе
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
Это не таймеры, это внешние прерывания
Позже код посмотрю , я еще на работе
И не привязаны к таймерам, т.е. я могу и таймер 1 использовать и препывание 1 одновременно? Сечас попробую.
Re: PPM энкодер на ...дуино
Все ноли при изменении на вариант
с 1-м прерыванием, но не виснет при включении и выключении.
PHP код:
#include <TimerOne.h>
volatile uint16_t timerCount;
#define BTNPIN 2 //Входной сигнал PPM
int ppmImpuls[9]; // Массив импульсов для паузы и 8 каналов
int chImpuls[9] = {1000, 100, 100, 100, 100, 100, 100, 100, 100}; // Массив средних значений для паузы и 8 каналов
int chanel = 0 ; // Номер канала
int minImpuls = 45 ; // Минимальный импульс (450 us)
int maxImpuls = 155; // Максимальный импульс (1550 us)
int minPausa = 500; // Минимальная пауза (5000 us)
int maxPausa = 1300; // Максимальная пауза (13000 us)
void setup()
{
Serial.begin(115200);
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(1, impDown, RISING);
}
void loop()
{
for (int i=1; i <= 8; i++)
{
chImpuls[i] = (4 * chImpuls[i] + ppmImpuls[i]) / 5 ; // усреднение 3 импульсов
Serial.print(i); Serial.print("=");
Serial.print(chImpuls[i]); Serial.print(" ");
}
Serial.println("");
//delay (200);
//servo1.writeMicroseconds(chImpuls[1]*10);
//servo2.writeMicroseconds(chImpuls[2]*10);
}
void callback() //--------- Счетчик------------
{
timerCount++;
}
void impUp() //---------- Функция обработки положительного импульса по таймеру 0
{
detachInterrupt(1);
timerCount=0;
attachInterrupt(1, impDown, RISING);
}
void impDown() // Функция обработки отрицательного импульса по таймеру 0
{
int ppm = timerCount;
detachInterrupt(1);
if( ppm > minPausa ) { chanel=0 ; } else { chanel ++ ; }
ppmImpuls[chanel] = ppm ;
attachInterrupt(1, impUp, FALLING);
}
p.s. Я кажись понял, нужно и пин другой подключить. Снова пробую.
Re: PPM энкодер на ...дуино
Конечно можешь, они никак друг от друга не зависят