-
PPM энкодер на ...дуино
Так как для чтения 6 и более каналов приемника, требуется не реальное количество прерываний. Забравшись в плату приемника я легко нашел еще не декодированный сигнал PPM и теперь можно этот сигнал, одним проводом подать на один вход контроллера ардуины и задействовать только одно прерывание.
Есть много примеров декодеров, но практически все используют PulseIn(), а я заметил большую погрешность этой функции. Может кто занимался в этом направлении или подскажет где подсмотреть механизм декодирования с относительно высокой достоверностью.
p.s. Вот нашел библиотеку, может ее использовать и не морочить голову?
-
Re: PPM энкодер на ...дуино
Попробуй . Если не подойдет что нибудь придумаем
-
Вложений: 1
Re: PPM энкодер на ...дуино
Спасибо, я реально сам не разберусь.
С мегой не заработала, пока разбирался с портами, то нашел еще вариант. Как-то больше доверия :)
Пожалуйста, если сразу видно проблемность кода, тормозните.
Я так понял из библиотеки, что можно использовать на выбор любой из 3-х таймеров? С мегой работать будет?
PHP код:
#include <PinChangeInt.h> // http://www.arduino.cc/playground/Main/PinChangeInt
#include <PinChangeIntConfig.h>
#include <TimerOne.h> // http://www.arduino.cc/playground/Code/Timer1
#define NO_PORTB_PINCHANGES //PinChangeInt setup
#define NO_PORTC_PINCHANGES //only port D pinchanges (see: http://www.arduino.cc/playground/Learning/Pins)
#define PIN_COUNT 3 //number of channels attached to the reciver
#define MAX_PIN_CHANGE_PINS PIN_COUNT
#define RC_TURN 3 //arduino pins attached to the reciver
#define RC_FWD 2
#define RC_FIRE 4
byte pin[] = {RC_FWD, RC_TURN, RC_FIRE}; //for maximum efficency thise pins should be attached
unsigned int time[] = {0,0,0}; // to the reciver's channels in the order listed here
byte state=0;
byte burp=0; // a counter to see how many times the int has executed
byte cmd=0; // a place to put our serial data
byte i=0; // global counter for tracking what pin we are on
void setup() {
Serial.begin(115200);
Serial.print("PinChangeInt ReciverReading test");
Serial.println(); //warm up the serial port
Timer1.initialize(2200); //longest pulse in PPM is usally 2.1 milliseconds,
//pick a period that gives you a little headroom.
Timer1.stop(); //stop the counter
Timer1.restart(); //set the clock to zero
for (byte i=0; i<3; i++)
{
pinMode(pin[i], INPUT); //set the pin to input
digitalWrite(pin[i], HIGH); //use the internal pullup resistor
}
PCintPort::attachInterrupt(pin[i], rise,RISING); // attach a PinChange Interrupt to our first pin
}
void loop() {
cmd=Serial.read(); //while you got some time gimme a systems report
if (cmd=='p')
{
Serial.print("time:\t");
for (byte i=0; i<PIN_COUNT;i++)
{
Serial.print(i,DEC);
Serial.print(":");
Serial.print(time[i],DEC);
Serial.print("\t");
}
Serial.print(burp, DEC);
Serial.println();
/* Serial.print("\t");
Serial.print(clockCyclesToMicroseconds(Timer1.pwmPeriod), DEC);
Serial.print("\t");
Serial.print(Timer1.clockSelectBits, BIN);
Serial.print("\t");
Serial.println(ICR1, DEC);*/
}
cmd=0;
switch (state)
{
case RISING: //we have just seen a rising edge
PCintPort::detachInterrupt(pin[i]);
PCintPort::attachInterrupt(pin[i], fall, FALLING); //attach the falling end
state=255;
break;
case FALLING: //we just saw a falling edge
PCintPort::detachInterrupt(pin[i]);
i++; //move to the next pin
i = i % PIN_COUNT; //i ranges from 0 to PIN_COUNT
PCintPort::attachInterrupt(pin[i], rise,RISING);
state=255;
break;
/*default:
//do nothing
break;*/
}
}
void rise() //on the rising edge of the currently intresting pin
{
Timer1.restart(); //set our stopwatch to 0
Timer1.start(); //and start it up
state=RISING;
// Serial.print('r');
burp++;
}
void fall() //on the falling edge of the signal
{
state=FALLING;
time[i]=readTimer1(); // read the time since timer1 was restarted
// time[i]=Timer1.read(); // The function below has been ported into the
// the latest TimerOne class, if you have the
// new Timer1 lib you can use this line instead
Timer1.stop();
// Serial.print('f');
}
unsigned long readTimer1() //returns the value of the timer in microseconds
{ //rember! phase and freq correct mode counts
//up to ICR1 then down again
unsigned int tmp=TCNT1;
char scale=0;
switch (Timer1.clockSelectBits)
{
case 1:// no prescalse
scale=0;
break;
case 2:// x8 prescale
scale=3;
break;
case 3:// x64
scale=6;
break;
case 4:// x256
scale=8;
break;
case 5:// x1024
scale=10;
break;
}
while (TCNT1==tmp) //if the timer has not ticked yet
{
//do nothing -- max delay here is ~1023 cycles
}
tmp = ( (TCNT1>tmp) ? (tmp) : (ICR1-TCNT1)+ICR1 );//if we are counting down add the top value
//to how far we have counted down
return ((tmp*1000L)/(F_CPU /1000L))<<scale;
}
-
Вложений: 1
Re: PPM энкодер на ...дуино
Вот мой РРМ сигнал на фото.
Период 22 мс.
Стробирующий положительный импульс 0,5 мс.
1 канал - отрицательный импульс 1,0 мс.
Стробирующий положительный импульс 0,5 мс.
2 канал - отрицательный импульс 1,0 мс.
Стробирующий положительный импульс 0,5 мс.
3 канал - отрицательный импульс 1,5 мс.
Стробирующий положительный импульс 0,5 мс.
4 канал - отрицательный импульс 1,0 мс.
Стробирующий положительный импульс 0,5 мс.
и т.д.
-
Вложений: 1
Re: PPM энкодер на ...дуино
А это шум при отключенном передатчике, установки осциллографа те же.
После включения передатчика и до конца инициализации на выходе появляется ноль, а потом пошли пачки сигналов.
-
Re: PPM энкодер на ...дуино
А может забыть про универсальные библиотеки, а начать самостоятельно писать и навыки в программировании получу и другим возможно поможет.
Длительность канального отрицательного импульса регулируется передатчиком в пределах 0,5 - 1,5 мс.
Синхроимпульсы вначале, между каналами и в конце, все по 0,5 мс.
Пауза после пачки 5,8 - 13,8 мс.
Период, как я уже писал немного более 22 мс.
После пачки сигналов, минимальная пауза 5,8 мс.
Значит ловим 5 мс. отрицательных и обнуляем счетчик каналов.
Ждем первого перехода с 1 в 0, после которого таймер отсчитывает длительность отрицательного импульса и присваивает это значение первому каналу.
Увеличиваем счетчик каналов на 1.
Все в цикле до прихода паузы длительностью более 5 мс.
-
Re: PPM энкодер на ...дуино
Не пойму у тебя он что цифру выдает?
-
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
Не пойму у тебя он что цифру выдает?
Я просто сигнал взял со входа триггера внутри приемника, я могу его легко инвертировать и подтянуть к 5 вольтам. Там питание триггера 3,3 .
-
Re: PPM энкодер на ...дуино
Сегодня ночью появилось время и я продолжил.
PHP код:
#include <TimerOne.h>
#include <TinyGPS.h>
#include <EEPROM.h>
#include <Servo.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)
Servo servo1;
Servo servo2;
void setup()
{
servo1.attach(37);
servo2.attach(36);
servo1.writeMicroseconds(1500); // устанавливает привод в среднее положение
servo2.writeMicroseconds(1500); // устанавливает привод в среднее положение
Serial.begin(115200);
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, impDown, RISING);
}
void loop()
{
for (int i=0; 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() //---------- Функция обработки положительного импульса
{
detachInterrupt(0);
timerCount=0;
attachInterrupt(0, impDown, RISING);
}
void impDown() // Функция обработки отрицательного импульса
{
int ppm = timerCount;
detachInterrupt(0);
if( ppm > minPausa ) { chanel=0 ; } else { chanel ++ ; }
ppmImpuls[chanel] = ppm ;
attachInterrupt(0, impUp, FALLING);
}
Файл-сафе теперь нужно реализовывать.
Что можно сделать с контролем над сигналом, шум подвешивает порт. Также перестают сервы следить за положением стиков. Резет при вкл. передатчике, все работает, но до выключения передатчика.
-
Re: PPM энкодер на ...дуино
Нужно делать программный фильтр шума.
Самый простой способ : сделать три, четыре или пять замеров длительности периода и считать что это достоверный сигнал.
-
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 энкодер на ...дуино
Конечно можешь, они никак друг от друга не зависят
-
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Mastar
p.s. Я кажись понял, нужно и пин другой подключить. Снова пробую.
Соединил 2 и 3 пин - работает и первое прерывание.
Ура, сейчас проверяю одновременное измерение отрицательного и положительного импульса по нулевому и первому прерыванию.
А для меня было это в прямой связи. Спасибо.
-
Re: PPM энкодер на ...дуино
Получилась ерунда, значения не достоверные.
PHP код:
#include <TimerOne.h>
volatile uint16_t timerCount0, timerCount1;
#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)
int ppm1 = 0 ;
void setup()
{
Serial.begin(115200);
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, impDown0, RISING);
attachInterrupt(1, impUp1, FALLING);
}
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(" p=");
Serial.print(ppm1); Serial.print(" ");
delay (100);
}
Serial.println("");
}
void callback() //--------- Счетчик------------
{
timerCount0++;
timerCount1++;
}
void impUp0() //---------- Функция обработки положительного импульса по таймеру 0
{
detachInterrupt(0);
timerCount0=0;
attachInterrupt(0, impDown0, RISING);
}
void impDown0() // Функция обработки отрицательного импульса по таймеру 0
{
int ppm0 = timerCount0;
detachInterrupt(0);
if( ppm0 > minPausa ) { chanel=0 ; } else { chanel ++ ; }
ppmImpuls[chanel] = ppm0 ;
attachInterrupt(0, impUp0, FALLING);
}
void impUp1() //---------- Функция обработки положительного импульса по таймеру 1
{
ppm1 = timerCount1;
detachInterrupt(1);
attachInterrupt(1, impDown0, RISING);
}
void impDown1() // Функция обработки отрицательного импульса по таймеру 1
{
detachInterrupt(1);
timerCount1=0;
attachInterrupt(1, impUp0, FALLING);
}
-
Re: PPM энкодер на ...дуино
Вот набросал болванку , для захвата длительностей импульсов в два массива , один с длительностями положительных импульсов другой соответственно с отрицательными . В главном цикле можно делать обработку этих импульсов, разрешение таймера очень высокое, равно 8 тактам процессора 0.0000005 , это значит максимальная длительность импульса на входе D2 не должна быть больше чем 32 мс
PHP код:
volatile uint8_t i=0;
volatile uint8_t Counter=0;
volatile uint16_t Time=0;
volatile uint16_t Bit_High[255];
volatile uint16_t Bit_Low[255];
//*************************************************************************
ISR(INT0_vect) // обработчик внешнего прерывания
{
Time=TCNT1;
if (PIND & (1<<2)) // Если бит 2 порта D установлен в лог. 1
{
Bit_High[i]=Time;
} else
{
Bit_Low[i]=Time;
}
i++;
TCNT1 = 0; //обнулить счетчик таймера
}
//*************************************************************************
void setup()
{
pinMode(2, INPUT);
pinMode(13, OUTPUT);
digitalWrite(2, HIGH); // включить подтяжку входа
Serial.begin(115200);
Init_Timer1();
Init_Ext_Int0();
}
//*************************************************************************
void loop()
{
//.......
}
//*************************************************************************
void Init_Ext_Int0()// инициализация прерывания int0
{
EICRA &= ~((1<<ISC00)|(1<<ISC01)); //прерывание вызавается при сигнале LOW
EICRA |= (1<<ISC00); // прерывание вызывается при спадающем или нарастающем фронте сигнала на входе;
EIMSK |= (1<<INT0); // разрешить прерывание INT0;
sei(); //разрешить все прерывания
}
//*************************************************************************
void Init_Timer1()// инициализация таймера
{
TCCR1A = 0; //Normal mode
TCCR1B = (1<< CS11); //предделителm x8
TCNT1 = 0; //обнулить счетчик таймера
TIMSK1 = _BV(TOIE1); // Включить прерывание по переполнению таймера
sei(); //разрешить все прерывания
}
//*************************************************************************
ISR(TIMER1_OVF_vect)//вектор прерывания по переполнению счетчика
{
//Counter++;
TCNT1=0;
}
-
Re: PPM энкодер на ...дуино
Спасибо, не заработал, возможно мне под мегу нужно менять.
if (PIND & (1<<2)) // Если бит 2 порта D установлен в лог. 1
У меня сервы на порту С, PINС или PORTC, так как я понял PIN только на чтение работает или я и тут ошибаюсь?
Если помните, я притормозил развитие темы http://www.compcar.ru/forum/showpost...7&postcount=41
-
Re: PPM энкодер на ...дуино
PIND это D2 на Arduino 328, 168
С мегой сложнее, нужно даташиты курить для изучения битов конфигурации таймера и т.д. Но самого главного ты не заметил :) , В этом скетче можно конфигурировать любое из 8-ми внешнее прерывание для меги . В итоге можно получить 8 внешних прерываний
Порт работает на чтение конечно
-
Re: PPM энкодер на ...дуино
Тогда я перепаяю на порт С, мне так удобнее.
Если отказаться в моем примере от привязки к пинам ардуины, а перейти на порты, то получается, что РРМ сигнал нужно подавать на порт С2?
-
Re: PPM энкодер на ...дуино
На Arduino mega PortD выводы 43-46 (INT0-INT3) и PortE выводы 6,7,8,9(INT4-INT7)
регистры управления внешними прерываниями
EICRA -для конфигурации прерываний INT0-INT3
EICRB -для конфигурации прерываний INT4-INT7
EIMSK -Разрешение на внешнее прерывание INT7 – INT0
подробно здесь
обработчики вставляй в любом месте
пример обработчика:
PHP код:
ISR(INT7_vect) // обработчик внешнего прерывания
{
...
}
-
Re: PPM энкодер на ...дуино
Вот еще момент, сигнал с выхода приемника достаточный для чтения, поэтому digitalWrite(2, HIGH) думаю не буду подкидывать.
-
Цитата:
Сообщение от
Mastar
Вот еще момент, сигнал с выхода приемника достаточный для чтения, поэтому digitalWrite(2, HIGH) думаю не буду подкидывать.
Если вход при каких либо ситуациях в воздухе не будет висеть то нет смысла подтягивать
Кстати посмотрел Ардуиновкую либу, судя по коду там все 8 прерываний можно использовать.
Я тебе предлагал, но ты как то не отреагировал, ты можешь повесить все свои сигналы на PortC и через диоды обьеденить на одном входе с настроенным прерыванием
-
Re: PPM энкодер на ...дуино
Цитата:
Сообщение от
Chip
Я тебе предлагал, но ты как то не отреагировал, ты можешь повесить все свои сигналы на PortC и через диоды обьеденить на одном входе с настроенным прерыванием
Почему, я в заметочку поставил. :) Потом просто из интереса, залез в приемник и вытащил PPM сигнал до разделения по каналам. Получилось один провод и питание.
Цитата:
Сообщение от
Chip
Если вход в воздухе не будет висеть то нет смысла подтягивать
Нет, я намертво :) соединяюсь и при включении ардуины, с нее питание идет через фильтр прямо на приемник, т.е нет вариантов "в воздухе" , другое дело, что после включения приемника, он инициализируется и на проводе PPM в течении 2 сек низкий уровень, потом пошли пачки импульсов.
Это не критично?
-------------------
Не в тему...
Прошу прощения, Chip, я не знаю как по имени, но наверно Вы немного преувеличиваете мои познания в программировании. Я из ваших примеров узнал про существование прерываний и экспериментировал с ними, потом самостоятельно разобрался с OCR, но сегодня добавилось EICR и некоторые прочие "вкусности".
Дайте мне немного времени и я разберусь, задавая возможно некорректные вопросы. :) Продолжаю разбирать скетчь.
-
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 ?