Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
Кстати посмотрел Ардуиновкую либу, судя по коду там все 8 прерываний можно использовать.
Мне больше Ваш вариант нравится, компактный, а значит имеющий меньше глюков и прост в понимании.
Я еще узнал, что можно и аналоговые входы использовать как внешнее прерывание, в котором можно устанавливать порог срабатывания. Правда сейчас мне это не нужно.
Хочу быстрее разобраться с чтением PPM и получить в переменных СН1-СН8 значения длительности отрицательных импульсов, усреднить и передать на управление сервоприводами. Положительные импульсы и пауза нужны только для контроля верного сигнала.
Еще не помешает в переменной Error получить значения типа:
0 - нет сигнала ( в течении 1-2 сек. нет паузы )
1 - помеха (есть пауза, но положительные импульсы иногда короче или длинее 450-550 мкс. )
2 - норма
3-7 - для другой части программы, где будет контролироваться: аналоговые сигналы RSSI(величина ВЧ сигнала на входе приемника - отдельный провод с приемника), напряжение питания и температура разных элементов.
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
На Arduino mega PortD выводы 43-46 (INT0-INT3) и PortE выводы 6,7,8,9(INT4-INT7)
регистры управления внешними прерываниями
EICRA -для конфигурации прерываний INT0-INT3
EICRB -для конфигурации прерываний INT4-INT7
EIMSK -Разрешение на внешнее прерывание INT7 – INT0
Я правильно разобрался?
(SCL/INT0)PD0 и (SDA/INT1)PD1 оставлю для возможного расширения.
(RXD1/INT2)PD2 и (TXD1/INT3)PD3 можно, но сейчас у меня там GPS подключен.
(T3/INT6)PE6 и (CLKO/ICP3/INT7)PE7 , можно подпаяться к ножкам, т.к. они не разведены в ардуино Мега.
Остались свободными только
(OCR3B/INT4)PE4 - в ардуине пин2
(OCR3B/INT5)PE5 - в ардуине пин3
Значит мне нужно при подключении к пин2 изменить четыре строки
ISR(INT4_vect)
if (PINE & (1<<4))
а тут как E4 = ICS60?
EICRB &= ~((1<<ISC??)|(1<<ISC??))
EICRB |= (1<<ISC??)
Re: PPM энкодер на ...дуино
Попробуй вот так
PHP код:
void setup()
{
for(int x = 18; x < 22; x = x++){pinMode(x, INPUT); digitalWrite(x, HIGH);}
pinMode(2, INPUT); digitalWrite(2, HIGH);
pinMode(3, INPUT); digitalWrite(3, HIGH);
attachInterrupt(0, INT_0, FALLING);
attachInterrupt(1, INT_1, FALLING);
attachInterrupt(2, INT_2, FALLING);
attachInterrupt(3, INT_3, FALLING);
attachInterrupt(4, INT_4, FALLING);
attachInterrupt(5, INT_5, FALLING);
attachInterrupt(6, INT_6, FALLING);
attachInterrupt(7, INT_7, FALLING);
Serial.begin (115200);
}
void loop()
{
}
// обработка прерывания
void INT_0()
{
}
// обработка прерывания
void INT_1()
{
}
// обработка прерывания
void INT_2()
{
}
// обработка прерывания
void INT_3()
{
}
// обработка прерывания
void INT_4()
{
}
// обработка прерывания
void INT_5()
{
}
// обработка прерывания
void INT_6()
{
}
// обработка прерывания
void INT_7()
{
}
P.S.
Скетч который я выкладывал работает, попробуй его еще раз, а то может ты успел его попробовать до того как я подправил
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
Скетч который я выкладывал работает, попробуй его еще раз, а то может ты успел его попробовать до того как я подправил
Не спорю, но у меня подключен вход на PORTE4, поэтому и начал исправлять.
----
Попробовать не проблема, минут через 5-10, но я хотел добить тот вариант, а пока не разобрался до конца с регистрами.
ISR(INT4_vect)
if (PINE & (1<<4))
а тут как E4 = ICS60?
EICRB &= ~((1<<ISC??)|(1<<ISC??))
EICRB |= (1<<ISC??)
Re: PPM энкодер на ...дуино
Так его доделать нужно, иначе я ничего не увижу?
Re: PPM энкодер на ...дуино
ISR(INT4_vect)
if (PINE & (1<<4))
E4 = ICS4х
EICRB &= ~((1<<ISC40)|(1<<ISC41))
EICRB |= (1<<ISC40)
EIMSK |=(1<<INT4);
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Mastar
Так его доделать нужно, иначе я ничего не увижу?
Ну так там все просто поставь в нужном прерывании включение светодиода (L)
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
Ну так там все просто поставь в нужном прерывании включение светодиода (L)
Я в порт отправлял и при подключении к пин2 выдавало 0, при пин3 выдавало 1. Работает.
PHP код:
void setup()
{
for(int x = 18; x < 22; x = x++){pinMode(x, INPUT); digitalWrite(x, HIGH);}
pinMode(2, INPUT); digitalWrite(2, HIGH);
pinMode(3, INPUT); digitalWrite(3, HIGH);
attachInterrupt(0, INT_0, FALLING);
attachInterrupt(1, INT_1, FALLING);
attachInterrupt(2, INT_2, FALLING);
attachInterrupt(3, INT_3, FALLING);
attachInterrupt(4, INT_4, FALLING);
attachInterrupt(5, INT_5, FALLING);
attachInterrupt(6, INT_6, FALLING);
attachInterrupt(7, INT_7, FALLING);
Serial.begin (115200);
}
void loop()
{
}
// обработка прерывания
void INT_0()
{
Serial.println ("0");
}
// обработка прерывания
void INT_1()
{
Serial.println ("1");
}
// обработка прерывания
void INT_2()
{
Serial.println ("2");
}
// обработка прерывания
void INT_3()
{
Serial.println ("3");
}
// обработка прерывания
void INT_4()
{
Serial.println ("4");
}
// обработка прерывания
void INT_5()
{
Serial.println ("5");
}
// обработка прерывания
void INT_6()
{
Serial.println ("6");
}
// обработка прерывания
void INT_7()
{
Serial.println ("7");
}
Re: PPM энкодер на ...дуино
В скетче из 23 поста положительные импульсы не воспринимает, всегда выдает 0, а вот отрицательные отлавливает, но выдает странные значения.
Я еще разберусь с установками таймера под свою мегу, т.к. помню, что из скетча Ардулайт у меня сразу не заработало, изменил регистры под свою плату в таймере и все заработало.
Приятно, что не зависает при выключении - включении передатчика.
Ближе к вечеру снова займусь.
Re: PPM энкодер на ...дуино
Может странные значения от того что куда нибудь не туда вставляешь serialprint ?