Не могу понять...
- Войдите на сайт для отправки комментариев
Ср, 25/04/2018 - 21:41
void loop() { mode = 0; while ( (PINB&(1<<2)) == (1<<2) ) {}; while ( (PINB&(1<<2)) == 0b00000000 ) {}; _delay_us(1200); if ( (PINB&(1<<2)) == (1<<2) ) mode++ ; _delay_us(200); if ( (PINB&(1<<2)) == (1<<2) ) mode++ ; _delay_us(200); if ( (PINB&(1<<2)) == (1<<2) ) mode++ ; if (mode == 0 && analogRead(2)<150) { off(); } else flag=0; if ( mode == 1 ) doubleflash(); if ( mode == 2 ) siren(); if ( mode == 3 ) always(); if ( analogRead(2)<150 && flag==0) { always(); flag1=1; } } }
Коллеги, подскажите где ошибка? Смысл такой, с RC приемника идет сигнал, когда уровень меньше 150 то выполняется условие OFF()(подсветка выключена), и когда пропал сигнал управления с пульта, т.е сигнал будет тот же 150, должно выполняться условие always()., а это условие не выполняется.Понимаю что ошибка кроется в 15 и 24 строках т.к выполняется одновременно одно условие.Режим mode=0 тоже соответствует условию <150
что-то мне 5ая строчка мозг сломала.
Смотрите, нчало бесконечного цикла попадает на произвольный момент в этом сигнале. Сначала идет цикл while ( (PINB&(1<<2)) == (1<<2) ) {}; Если начало программы совпало с высоким уровнем, то цикл останавливает программу пока не придет низкий уровень. Либо (если попало на момент низкого уровня) он просто не заходит ни разу в тело цикла.
Далее, циклом while ( (PINB&(1<<2)) == 0b00000000 ) {}; программа останавливается на все время, пока на входе логический ноль.
В итоге, после этих двух действий, программа убеждается, что "нащупала" именно фронт импульса. А дальше уже просто по пороговым значениям проверяется длительность импульса. То есть я привязываюсь именно к длительности активной части периода.
Попробовал через PulsenIn, тоже самое, ничего не получается.
Смотрите, нчало бесконечного цикла попадает на произвольный момент в этом сигнале. Сначала идет цикл while ( (PINB&(1<<2)) == (1<<2) ) {}; Если начало программы совпало с высоким уровнем, то цикл останавливает программу пока не придет низкий уровень. Либо (если попало на момент низкого уровня) он просто не заходит ни разу в тело цикла.
Далее, циклом while ( (PINB&(1<<2)) == 0b00000000 ) {}; программа останавливается на все время, пока на входе логический ноль.
В итоге, после этих двух действий, программа убеждается, что "нащупала" именно фронт импульса. А дальше уже просто по пороговым значениям проверяется длительность импульса. То есть я привязываюсь именно к длительности активной части периода.
Я приверженец магических чисел, и плохо понимаю все эти навороты. Я правильно понял, в переводе на нубовский язык, что выражение while ( (PINB&(1<<2)) == (1<<2)) {}; равносильно while( digitalRead(портВ пин 4) == 4); ? :)))
Что-то подсказывает мне, что надо было написать просто
while ( (PINB&(1<<2)));
забейте на этот код, я чуть выше написал через PulsenIn, может там понятней будет?
Мне надо чтобы при выключенном передатчике( поступает сигнал <150) на 1 и 4 пине была лог.1, но и при включенном передатчике при уровне <150( крутилка пульта установлена в крайнее левое положение) был логический 0.
строчка 5 правильно пишется
while ( (PINB&(1<<2)));
строчка 6 -
while (!(PINB&(1<<2)));
забейте на этот код,
понял
Мне надо чтобы
Принял к сведению
есть мысли?)
есть мысли?)
А как же! :)
Заждался...еще раз поясню.Мне надо чтобы при выключенном передатчике( поступает сигнал <150) на 1 и 4 пине была лог.1, но и при включенном передатчике при уровне <150( крутилка пульта установлена в крайнее левое положение) был логический 0.
ну и где тут критерий включенности передатчика?
Вот и я не могу понять где...по одному каналу идет сигнал <150 при включенном передатчике, и по этому же каналу идет сигнал <150 при выключенном предатчике...
Вот и я не могу понять где...по одному каналу идет сигнал <150 при включенном передатчике, и по этому же каналу идет сигнал <150 при выключенном предатчике...
ну это вы зря
ашыпка - в неумении составить правильный лагаритм.
Согласен, поэтому и обратился на форум, чтобы разобраться, а ни одного дельного совета так и не пооучил.
ни одного дельного совета так и не пооучил.
нерадивые сотрудники понижены в должности и переведены в сургутский филиал форума.
спасибо за сигнал, товагисчь. О_О
Согласен, поэтому и обратился на форум, чтобы разобраться, а ни одного дельного совета так и не пооучил.
Вы нормально, словами, распишите весь алгоритм что должна делать Ваша программа, а там либо сами додумаетесь, либо кто-нить подскажет. А то алгоритма нет, а код уже написан, и , что странно, не работает. :))
Делаю подсветку для квадрокоптера. Мне надо чтобы при выключенном передатчике, т.е квадр улетел за пределы зоны действия радиоуправления(в приемник поступает сигнал <150) на 1 и 4 пине была лог.1(т.е загорается LED сигнализирующая о потере радиосвязи), а при включенном передатчике при таком же уровне сигнала <150( крутилка пульта установлена в крайнее левое положение) был логический 0, те подсветка выключена.
Вот алгоритм
Считывание сигнала идет с пина 2 Attiny13 функцией AnalogRead(2)
mode=0 -крутилка в крайнем левом положении, т.е сигнал <150 и ПРД включен.
ПРД выключен- сигнал <150
Вот как определить что если режим mode=0(т.е сигнал <150 и ПРД включен) и ПРД включен?
мда.
Только по уровню RSSI Ваш контроллер не узнает включен передатчик или выключен, все что он может мониторить - это уровень сигнала . Все. Вам не хватает еще одного входного параметра: передатчик деактивирован на пульте. Как вариант - возьмите PWM с пятого канала, если коптер переводится в режим АП командой, а не только выключением передатчика. Правда, тогда если коптер выйдет из зоны действия передатчика в режиме АП, Вы об этом не узнаете. А какой смысл отключать передатчик?
ПС. Ну, теоретически, можно еще мониторить скорость изменения RSSI, и если изменение вниз резкое и больше не увеличивается, то значит передатчик выключен с земли. Но это так себе решение. Интерференционные минимумы/максимумы могут сыграть злую шутку.
Ладно, подключил я с приемника еще один провод на тиьку для определения признака включенного состояния передатчика. А как теперь считать уровень сигнала, pulsenIn слишком много жрет, памяти не хватает.Да и работает почему то только в vod loop, в int main(void) не работает..
работает почему то только в vod loop, в int main(void) не работает..
потому что настоящий main() неявно вызывает init() перед loop(), а перенаписанный этого не делает.
Ладно, подключил я с приемника еще один провод на тиьку для определения признака включенного состояния передатчика. А как теперь считать уровень сигнала, pulsenIn слишком много жрет, памяти не хватает.Да и работает почему то только в vod loop, в int main(void) не работает..
Только я не совсем понимаю что это Вам даст: если передатчик на пульте деактивирован, то и команда по каналу не придет, и RSSI соответственно не покажет наличие сигнала.
Еще раз: А какой смысл отключать передатчик?
Не отключать рередатчик, а если пропадет радиосигнал управления, то я хочу чтобы на коптере зажигалась подсветка чтобы было видночто потеряна радиосвязь.