цикл while
- Войдите на сайт для отправки комментариев
Пт, 07/10/2016 - 22:18
в скетче используется цикл while хотелось бы узнать можно ли одновременно считать и с других входов пока выполняется цикл while
uint32_t p_start;
void loop() {
if(PINE & (1<<PE4))//вход Пин-2 на ардуино мега
{
p_start = millis();
PORTE &=~(1<<PE5);}//выход пин-3
while(PINE & (1<<PE4)) {
p_start=millis()-p_start;
delayMicroseconds(p_start*WIDTH_MUL);
PORTE |=(1<<PE5);
}
}
заранее спасибо!
Не навижу циклы. Циклы это "эгоисты". Пока крутится цикл, все остальное стоит. Единственный приемлемый цикл это loop(){}
спасибо за ответ а есть другие варианты при пропадании импульса выставлял выход на high как это делает while
Вы тут уж почти год, поа бы и научиться код вствалять.
Можно-то оно, конечно, можно. Вопрос для чего? Что именно делать-то надо?
спасибо за ответ а есть другие варианты при пропадании импульса выставлял выход на high как это делает while
Хочу заметить, что while ничего не делает, кроме проверки условия и ветвления программы в зависимости от результата. Все остальные действия пишете вы. Для ветвления можно использовать оператор if ... else. И тоже придётся написать самому те действия, которые вам нужны. В данном случае цикл while будет пинать пятый пин каждые p_start*WIDTH_MUL микросекунд, пока на четвёртой ноге будет единица. Сакральный смысл этого повторяющегося действия не понятен. Как и присутствие оператора while именно в этом месте программы. Считывать другие ноги я надеюсь Клапауций разрешит, если вы вставите операторы считывания внутрь цикла while.
скетч использовал для управления газовыми форсунками,ардуино берет сигналы с 2,3,4,5,6,7 входов и выдает с выходов 8,9,10,11,12,13
все отлично работает кроме одного нюанса при резком нажатии на газ педаля ардуино не успевает выдавать точно такие сигналы что на входе из за этого двигатель сильно просаживается.Вот здесь на графике синий сигнал с ECU желтый с ардуино
Чтобы отзекалить порт нужно сдвинуть на 6, а не на 2. Это раз.
Вы добавляете к длительности импульса 10 процентов микросекунд. А можно 12% ? Мне кажется, если вместо
delayMicroseconds(p_start * WIDTH_MUL);
Написать
delayMicroseconds(p_start >> 8);
всё будет успевать отработать.
оператор while и delay не задерживает цикл программы когда сразу на все 6 входов подается импулс с большой частотой скажем как на графике 20Гц и больше
Я сморю на программу и вижу задержку в строке 52. Она есть всегда. В независимости от скорости прихода импульсов. Судя по осцилограмме задержка реакции программы около 37 мс. Это ни как не соответствует приведенному алгоритму. Единственное место, где может тормозить программа - дробное умножение( но не верю что на столько). Поэтому предлагаю заменить на целочисленгое деление на 8 - сдвигом на 3 в право. Или просто целочисленным делением на 10. И посмотреть на осцилограмму изменится чтото или нет.
Спасибо за совет я вообще убрал delayMicroseconds на 52 строке по пробую так запустит двигатель может повлияет
Правильно заметили как убрал delayMicroseconds ардуино успевает обработать сигнал и выдавать на выходе точно так же
Зеркалится там не порт, а входы/выходы -- это два.
Вам не правильно кажется.