Да извините опечатка произошла, исправил, но всё равно всё равно всё осталось по прежнему, а антидребезг вообще в коде не осуществлял, это задержки для мигания светодиода, я согласен с тем что при первом нажатии кнопки включается бесконечный цикл мигания светодиода, но как выйти из него не при следующем нажатии на кнопку, а через нажатие то есть на второй раз нажатия, было тру - стало фолс - включили бесконечный цикл быстрого мигания светодиода, было фолс - стало тру - оставляем бесконечный цикл быстрого мигания светодиода, и только при повторном было тру - стало фолс - включили бесконечный цикл медленного мигания светодиода. Может мне стоит больше поучиться и тогда смогу решить задачу, но я уже перелопатил много материала и не встречал подобного примера и его решения.
Сейчас я несколько перефразирую алгоритм, чтобы стало понятнее.
Задача: мигать светодиодом, подключенным к С0. Если нажата кнопка В5, то перестать мигать светодиодом С0, начать мигать светодиодом С1. Если снова нажата кнопка В5, то перестать мигать светодиодом С1, мигать светодиодом С0. Во всех случаях частота мигания 1 Гц.
Попробуем обойтись без доп. функций и прерываний. Введем дополнительную переменную Light = 0 типа чар, байт.
Алгоритм. 1. Настройка портов С и В (у вас правильная) 2. Начало цикла вайл 1 3. В5 ==1?, нет - переход к 10, да - переход к 4 4. кнопка не нажата 5. лайт ==0?, нет - переход к 8, да - переход к 6 6. включить С0, пауза 500, выключить С0, пауза 500 7. переход к 2 8. включить С1, пауза 500, выключить С1, пауза 500 9. переход к 2 10. антидребезговая пауза 11. В5==1?, нет - переход к 12, да - переход к 2 12. Кнопка нажата. лайт==0? нет - переход к 14, да - переход к 13 13. лайт=1, переход к 15 14. лайт=0 15. пауза 500 (для гарантированного отжатия кнопки) 16. Переход к 2
Во время нажатий светолиоды мигать не будут, но это не баг - это фича
Весь этот алгоритм - это один бесконечный цикл, внутри несколько ифов и элзе. Удачи.
alek4322 писал(а):я согласен с тем что при первом нажатии кнопки включается бесконечный цикл мигания светодиода, но как выйти из него не при следующем нажатии на кнопку
Никак. На-то он и бесконечный. Не надо применять бесконечный цикл, применяй цикл с условием. Как условие исполнилось - цикл остановился.
Согласен, но здесь с помощью ифов и элзе вы переключаете одну и туже функцию между двумя портами выходами, вернее даже не функцию переключаете, а просто заставляете при каждом нажатии кнопки одинаково мигать разные светодиоды на разных выходах, а я хочу уметь переключать именно разные функции при каждом нажатии кнопки, причём это ведь могут быть не обязательно функции мигания, а и другие и более сложные функции и их может быть и не две, а три или сколько угодно. Может я слишком много хочу, но в любом случае спасибо и я обязательно попробую ваш алгоритм.
в данном случае есть две функции: мигнуть одним светодиодом, мигнуть другим светодиодом. Поэтому переменная лайт принимает только два значения (0/1). Но функций можно и добавить, и диапазон значений переменной увеличится. Можно будет применять конструкцию селект кейс. Важно что: пока функция выполняется - кнопку игнорируем. Но появляется опасность не успеть нажать на кнопку (если функция очень долгая по времени, в случае мигания надо держать кнопку более секунды, но не более 1,5 секунд - это недостаток). Но если кнопку повесить на вход внешнего прерывания - недостаток исчезнет.
А вообще принцип обучения программированию прост: пишем простую прогу, добиваемся чтоб заработала, делаем копию. Усложняем код и так далее. Копии всегда работают, если полный затык с кодом - делаем шаг назад, а потом снова вперед.
ЗЫ. Предложенный алгоритм не является единственно верным, но он прост.
Извините я только начинаюший, ещё вот только чуть чуть начинающий программист, что то я плохо разобрался в алгоритме, если не сложно можно написать код с коментариями, и - а что будет происходить во время не нажатия, а отжатия кнопки, важно что бы изменения происходили только при нажатии, а при отжатии ни чего не происходило, еще раз извините если за не удобство.
Код я написать не могу - не умею на Си программировать. Тут как с английским - читать могу, а говорить - нет. Сам то я на асемблере пишу. Наловчился на нем еще в студенчестве, ну а старую собаку новым шуткам не научишь . Так что извините. Могу откаментить алгоритм. Вам нужен бесконечный цикл, но не простой, а чтобы можно было его выполнять не полностью. В Си вроде бы 3 вида циклов: фор (со счетчиком), вайл (выполнять пока условие истинно) и ду антил (выполнять пока условие не станет истинным). Вроде вайл подходит, нужно только обязательно дойти до конца цикла.
Комметарий к алгоритму (глобальный) - сперва проверяется, нажата ли кнопка - если кнопка не нажата, то проверяется переменная (каким светодиодом будем моргать) - моргание светодиодом (каким - зависит от переменной) - все - а если кнопка была нажата, то меняется значение переменной(0>1, 1>0) - пауза, за которую надо успеть отпустить кнопку - все
Если кнопку не нажимать - будет моргать один светодиод, если ее держать, то светодиоды моргать не будут, будет меняться переменная, но мы этого не увидим. Если кнопку нажать и отпустить во время моргания - программа этого не почувствует и это нажатие ни к чему не приведет. Это из-за больших пауз (500). Если чтото надо еще подробнее расписать - жду конкретный вопрос.
ЗЫ. Желательно написать: я понял так то и так, а вот это не понял. Очень хотелось бы чтобы вопросы не были рассчитаны на телепатов, чтобы не было в вопросе неоднозначности. Ведь правильно сформулированный вопрос уже содержит в себе половину ответа.
alek4322 писал(а):Извините я только начинаюший, ещё вот только чуть чуть начинающий программист, что то я плохо разобрался в алгоритме, если не сложно можно написать код с коментариями, и - а что будет происходить во время не нажатия, а отжатия кнопки, важно что бы изменения происходили только при нажатии, а при отжатии ни чего не происходило, еще раз извините если за не удобство.
как можно учиться чему-либо, прося чтоб за вас написали код? надо самому писать, и если уж совсем не получается, то спрашивать.
alek4322, у тебя программа заканчивается не упев начаться, бесконечный цикл while(1) должен стоять в конце main. а он стоит только в программе от 14:44 то есть так:
void main(void){ инициализация while(1){ обработка ваших кнопок }// end while }// end main
ну и в функциях time_x - бесконечные циклы не нужны, если у вас прерывания не обрабатываются (радисту легко-он не пишет на этом остром как лезвие бритвы языке )
Наконец решил задачу сам, конечно не без вашей помощи, за что очень благодарен, две недели парился, но решил, оказывается не чего особенно сложного, сейчас выложу код, если возможно поделитесь своими соображениями, может можно решить эту задачу по другому.
Project : Version : Date : 11.08.2010 Author : Freeware, for evaluation and non-commercial use only Company : Comments:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
Работать не будет если есть протеус то попробуйте, там что то не понятное происходит просто долго описывать, при разных условаях по разному но всегда не правильно