Выход из цикла по нажатию кнопки

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Сильно не ругайтесь, я дикий новичок) 

Подскажите, как в функции int main(void) сделать в самом начале бесконечный цикл, чтобы по нажатию кнопки на пульте можно были выйти из него, и программа начала выпонять основной код? То есть пока я не нажму определенную кнопку на пульте, программа не начнет работать. Основной код в int main(void) статичный, то есть после выполнения всего кода, контроллер будет ждать, пока я еще раз не нажду кнопку, чтобы заново запустить процесс.

step962
Offline
Зарегистрирован: 23.05.2011
buttonPressed=FALSE;
while (!buttonPressed) {
  ...
  if(BUTTON_PIN==HIGH) buttonPressed=TRUE;
}

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Что то не хочет работать. Вот код:


#include <IRremote.h>
#include <IRremoteInt.h>
#include <util/delay.h>

int RECV_PIN = 8;


#define POP              0X40BF18E7   //значение кнопки
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
 
void setup()
{
  irrecv.enableIRIn(); // Inicializamos el receptor
}

int main(void)
{
  unsigned char i;
  int a;
  int buttonPressed = 0;
  DDRC=0xFF;
  {
while (buttonPressed == 0) {
  if (irrecv.decode(&results)) {
  if(results.value == POP) buttonPressed = 1;
}
irrecv.resume();
}}
{
      for (a=0;a<7;a++)
  {
     {
	 PORTC=0x00;
	 i=10; while(--i) _delay_ms(100);
	 }
   	 {
	 PORTC=0xFF;
	 i=10; while(--i) _delay_ms(100);      
	 }
   }
 }
}
step962
Offline
Зарегистрирован: 23.05.2011

Это скетч для Arduino?

Тогда оставайтесь в рамках схемы setup()+loop().

Или хотя бы добавьте в setup() вызов main(). И назовите-таки эту функцию как-нибудь по другому - ведь у препроцессора Arduino IDE может происходить заворот мозгов.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Я уже 3 дня пытаюсь сделать что мне нужно - но безрезультатно. Как я только не пробывал, итог один - программа компилится, но работает не так как надо.

Я пытался сделать, как ты мне предложил, но тогда основнйо код нужно запихивать в loop, и после окончания он опять начнет выполнение этой же программы, что недопустимо. 

Можно сделать, чтобы он в loop все время проверял порт с фотоприемника, и по нажатию кнопки запускал функцию отдельную с программой. Вот только я так и не смог это сделать

Помоги перебрать тот код, который я кинул, чтобы он заработал

ites
Offline
Зарегистрирован: 26.12.2013

я таки думаю, что сначала надо осилить урок "мигаем светодиодом без delay", затем научиться опрашивать кнопки без использования delay. а если за тебя программу напишут -- чему ты научишься? хоть через loop(), хоть через main() -- результат можно получить один и тот же.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Мне не просто надо помигать, а прописать последовательный код с обязательным использованием delay, который будет отвечать на паузы между командами. 

Я пересел с ATMega8 на Arduino Mega R3. Код почти полностью подходит и компилится. Но суть то не delay. Отдельно кнопки могу читать, отдельно свою прогу могу запустить без кнопки, а объеденить не получается.

Вот я и прошу помощи

step962
Offline
Зарегистрирован: 23.05.2011

CEBKACooler пишет:

Вот я и прошу помощи

Для начала попробуйте объяснить форумчанам (но в первую очередь - себе), каковы глубинные причины использования функции main в скетче Arduino.

Затем удалите все лишние скобки в блоках типа 
      for (a=0;a<7;a++)
  {
     {
     PORTC=0x00;
     i=10; while(--i) _delay_ms(100);
     }
     {
     PORTC=0xFF;
     i=10; while(--i) _delay_ms(100);     
     }
   }

Наконец, попробуйте сделать стандартное форматирование исходника (отступы там всякие). И не говорите, что представленный вариант вам удобнее - в конце концов, вы его не дома за рюмкой чая рассматриваете, а выкладываете на суд (и совет) Arduino-сообщества.

В общем, "как справедливо указывали выступавшие до меня товарищи" - "помигайте диодиком". 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Расскажу по порядку. Я занимаюсь создание световых шоу путем программирования неоновых костюмов. Как я уже говорил, раньше у меня была Atmega8, и на ней фотоприемник присоеденялся к ножке reset. Это было удобно в плане сброса, но очень сильно не надежно. Программа костюма сбрасывалась на начало при нажатие любой клавиши, волн от аппаратуры или просто от вспышки фотоаппарата.

Сейчас я решил полностью переделать всю электронику и заменой на ардуино. Но от проблемы я решил избавить путем прописывания сброса с определенной кнопки. Если раньше программа статично выполнялась в функции main, дохдила до конца и останавливалась, то сейчас нужно сделать тоже самое, только чтобы параллельно все время опрашивался порт фотоприемника и ждал, пока я не нажму нужную кнопку на пульте и не сброшу контроллер.

Как я понял, если я опять  буду использовать delay, то параллельно еще опрашивать контроллер не получился, потому что он заморозит контроллер. Как же бы тогда?

ivan_admin
Offline
Зарегистрирован: 09.01.2014
ites
Offline
Зарегистрирован: 26.12.2013

CEBKACooler пишет:

Расскажу по порядку. Я занимаюсь создание световых шоу путем программирования неоновых костюмов. Как я уже говорил, раньше у меня была Atmega8, и на ней фотоприемник присоеденялся к ножке reset. Это было удобно в плане сброса, но очень сильно не надежно. Программа костюма сбрасывалась на начало при нажатие любой клавиши, волн от аппаратуры или просто от вспышки фотоаппарата.

Сейчас я решил полностью переделать всю электронику и заменой на ардуино. Но от проблемы я решил избавить путем прописывания сброса с определенной кнопки. Если раньше программа статично выполнялась в функции main, дохдила до конца и останавливалась, то сейчас нужно сделать тоже самое, только чтобы параллельно все время опрашивался порт фотоприемника и ждал, пока я не нажму нужную кнопку на пульте и не сброшу контроллер.

Как я понял, если я опять  буду использовать delay, то параллельно еще опрашивать контроллер не получился, потому что он заморозит контроллер. Как же бы тогда?

Расскажу по порядку. Санта-Клаус на 25 декабря 2013 принёс мне Ардуино. Собрал я макетный стенд и начал на нём "уроки" делать, что были в прилагаемой книжечке с картинками. Потом нашёл этот форум, вопросов особо не задавал -- у меня хорошо развиты навыки понимания прочитанного из того, что находит гугл. Обработку кнопок я сделал пятым уроком и результат расписал в этой вот теме: http://arduino.ru/forum/programmirovanie/pyatoe-uprazhnenie-po-arduino-shift-out-click-button-digitalreadwritefast . Функция main() у меня нужна в тексте программы, поскольку я не пользуюсь средой Arduino, стандартно ардуниская среда сама добавляет её. Признаюсь, конечно, я не просто примеры откудато набивал, я их придумывал сам по мотивам известных уроков, добавляя себе упражнения по интересу. Вопросы управления светодиодами, программами моргания и реакций на кнопки у меня в этом упражнении как раз пройдены.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Отличный пример) Вот только все никак не могу сделать так, как мне нужно.

Если я сделаю по твоему примеру и вызову фунцию с основным кодом в loop, то по завершению программа начнет работать заново.

Как можно реализовать следующее: чтобы постоянно работал loop и в нем опрашивался фотоприемник и параллельно с ним работала основная программа, по завершению которой она бы не начала работать заново? Причем основная программа должна приходить в начало ,когда бы я не нажал кнопку сброса на пульте

ites
Offline
Зарегистрирован: 26.12.2013

CEBKACooler пишет:

Отличный пример) Вот только все никак не могу сделать так, как мне нужно.

Если я сделаю по твоему примеру и вызову фунцию с основным кодом в loop, то по завершению программа начнет работать заново.

Как можно реализовать следующее: чтобы постоянно работал loop и в нем опрашивался фотоприемник и параллельно с ним работала основная программа, по завершению которой она бы не начала работать заново? Причем основная программа должна приходить в начало ,когда бы я не нажал кнопку сброса на пульте

Пойми одну вешь: программа должна работать "вечно". Поэтому её зацикливают в loop(). Представь, что у тебя есть набор состояний, которые должны по тобой написанным алгоритмам меняться. Между вызовами loop() состояния запоминаются в глобальных или статических (тоже глобальные, но с ограниченной областью видимости) переменных. Если ты вчитаешься в мой пример, то там есть выполнение програм по свечению светодиодов _и_ опрос состояний кнопок, ничто не мешает на том же принципе, что и кнопки, добавить опрос состояний фотоприёмника.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

У тебя прописаны функции с программой, и в loop ты их вызываешь в зависимости от нажатия кнопки. Пока все круто - все мне подходит. Но дальше загвостка - функция, которую ты вызвал в своем примере - мотается по кругу до тех пор, пока не нажмется еще раз кнопка. Мне же нужно, чтобы по звершению вызванной функции программа вернулась в обработчик фотоприемника и ждала очередной сигнал, а не запускала еще раз эту же функцию.

ites
Offline
Зарегистрирован: 26.12.2013

CEBKACooler пишет:

У тебя прописаны функции с программой, и в loop ты их вызываешь в зависимости от нажатия кнопки. Пока все круто - все мне подходит. Но дальше загвостка - функция, которую ты вызвал в своем примере - мотается по кругу до тех пор, пока не нажмется еще раз кнопка. Мне же нужно, чтобы по звершению вызванной функции программа вернулась в обработчик фотоприемника и ждала очередной сигнал, а не запускала еще раз эту же функцию.

Это ж не примерка костюма в магазине, это ателье "умелые руки" -- ты должен сам пошить свой алгоритм, а не ждать, пока тебе сошьют подходящий костюмчик. В моём примере мотается по кругу, поскольку мне так было нужно. Если какой-то алгоритм, а у них у всех в моём примере есть счётчики номеров состояний, дошёл до логического конца, и мне было бы нужно, чтобы он остановился, я бы поставил признак "не вызывайте меня больше из loop()", а при нажатии на кнопку сбрасывал бы его.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Получится так его остановить:

в конце своей функции пропишу a=1, и когда он еще раз захочет запустить, то я поставлю условие, что запуск функции в том случае, если a=0. При этом назначу еще одно условие, что при совпанение нужной кнопки с пульта переменной "a" присваивался 0.

Получится так сделать или есть более простое решение?

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

или вот еще нашел полезную штуку 

resetFunc();

тоже вставлю ее в конец, и контроллер начнет работу с начала

ites
Offline
Зарегистрирован: 26.12.2013

CEBKACooler пишет:

или вот еще нашел полезную штуку 

resetFunc();

тоже вставлю ее в конец, и контроллер начнет работу с начала

Я, в общем, сказал уже всё, что мог и хотел. Решение о способе пошива за тобой.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

CEBKACooler 

А ты случайно не из Казани ?

zid
Offline
Зарегистрирован: 22.01.2014

CEBKACooler ты еще тут?

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Да, я тут. У тебя есть предложение, чем мне помочь?

Я из Хабаровска кстати

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Тс, про do..while ничего не слыхал ?
А в свой цикл включал пустой цикл for, с выходом из него по прерыванию ?

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Тс, про do..while ничего не слыхал ?

на даты не смотрим :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Нет конечно. Он же не указал, что проблему решил. Мучается бедняга :-)

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Нет конечно. Он же не указал, что проблему решил. Мучается бедняга :-)

4 года? - пристрелите его кто-нибудь :)

bwn
Offline
Зарегистрирован: 25.08.2014

Внимание всем. На форум произведена атака нэкрофилов. Мне чудится или это не первый топик разрытый из небытия за последние одну-две недели?))))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

отчасти мы сами виноваты отправляя новичков  в гугл, тут выскачила ссылка на нэкрофильскую тему на этом форуме, несмотря на даты пошли вопросы комменты, дальше поняслось.

vk007
Offline
Зарегистрирован: 16.06.2015

Да, но в данном случае не спрашивают, а пытаются отвечать на древний вопрос. От безделия ищут нерешенные проблемы и решают их?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

х.з.