Помогите разобраться с простенькой задачей про кнопки

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

Re: Помгите разобраться с простенькой задчей

Сообщение alek4322 » 09 авг 2010, 20:05

Да извините опечатка произошла, исправил, но всё равно всё равно всё осталось по прежнему, а антидребезг вообще в коде не осуществлял, это задержки для мигания светодиода, я согласен с тем что при первом нажатии кнопки включается бесконечный цикл мигания светодиода, но как выйти из него не при следующем нажатии на кнопку, а через нажатие то есть на второй раз нажатия, было тру - стало фолс - включили бесконечный цикл быстрого мигания светодиода, было фолс - стало тру - оставляем бесконечный цикл быстрого мигания светодиода, и только при повторном было тру - стало фолс - включили бесконечный цикл медленного мигания светодиода. Может мне стоит больше поучиться и тогда смогу решить задачу, но я уже перелопатил много материала и не встречал подобного примера и его решения.
alek4322
 
Сообщения: 11
Зарегистрирован: 08 авг 2010, 13:51

Re: Помгите разобраться с простенькой задчей

Сообщение Radist » 09 авг 2010, 20:57

Сейчас я несколько перефразирую алгоритм, чтобы стало понятнее.

Задача: мигать светодиодом, подключенным к С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

Во время нажатий светолиоды мигать не будут, но это не баг - это фича :)

Весь этот алгоритм - это один бесконечный цикл, внутри несколько ифов и элзе. Удачи.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Помгите разобраться с простенькой задчей

Сообщение yak-40 » 09 авг 2010, 21:22

alek4322 писал(а):я согласен с тем что при первом нажатии кнопки включается бесконечный цикл мигания светодиода, но как выйти из него не при следующем нажатии на кнопку

Никак. На-то он и бесконечный.
Не надо применять бесконечный цикл, применяй цикл с условием. Как условие исполнилось - цикл остановился.
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: Помгите разобраться с простенькой задчей

Сообщение alek4322 » 09 авг 2010, 21:37

Согласен, но здесь с помощью ифов и элзе вы переключаете одну и туже функцию между двумя портами выходами, вернее даже не функцию переключаете, а просто заставляете при каждом нажатии кнопки одинаково мигать разные светодиоды на разных выходах, а я хочу уметь переключать именно разные функции при каждом нажатии кнопки, причём это ведь могут быть не обязательно функции мигания, а и другие и более сложные функции и их может быть и не две, а три или сколько угодно. Может я слишком много хочу, но в любом случае спасибо и я обязательно попробую ваш алгоритм.
alek4322
 
Сообщения: 11
Зарегистрирован: 08 авг 2010, 13:51

Re: Помгите разобраться с простенькой задчей

Сообщение Radist » 09 авг 2010, 21:55

в данном случае есть две функции: мигнуть одним светодиодом, мигнуть другим светодиодом. Поэтому переменная лайт принимает только два значения (0/1). Но функций можно и добавить, и диапазон значений переменной увеличится. Можно будет применять конструкцию селект кейс. Важно что: пока функция выполняется - кнопку игнорируем. Но появляется опасность не успеть нажать на кнопку (если функция очень долгая по времени, в случае мигания надо держать кнопку более секунды, но не более 1,5 секунд - это недостаток). Но если кнопку повесить на вход внешнего прерывания - недостаток исчезнет.

А вообще принцип обучения программированию прост: пишем простую прогу, добиваемся чтоб заработала, делаем копию. Усложняем код и так далее. Копии всегда работают, если полный затык с кодом - делаем шаг назад, а потом снова вперед.

ЗЫ. Предложенный алгоритм не является единственно верным, но он прост.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Помгите разобраться с простенькой задчей

Сообщение alek4322 » 09 авг 2010, 22:34

Извините я только начинаюший, ещё вот только чуть чуть начинающий программист, что то я плохо разобрался в алгоритме, если не сложно можно написать код с коментариями, и - а что будет происходить во время не нажатия, а отжатия кнопки, важно что бы изменения происходили только при нажатии, а при отжатии ни чего не происходило, еще раз извините если за не удобство.
alek4322
 
Сообщения: 11
Зарегистрирован: 08 авг 2010, 13:51

Re: Помгите разобраться с простенькой задчей

Сообщение Radist » 09 авг 2010, 23:46

Код я написать не могу - не умею на Си программировать. :oops: Тут как с английским - читать могу, а говорить - нет. Сам то я на асемблере пишу. Наловчился на нем еще в студенчестве, ну а старую собаку новым шуткам не научишь :) . Так что извините.
Могу откаментить алгоритм.
Вам нужен бесконечный цикл, но не простой, а чтобы можно было его выполнять не полностью. В Си вроде бы 3 вида циклов: фор (со счетчиком), вайл (выполнять пока условие истинно) и ду антил (выполнять пока условие не станет истинным). Вроде вайл подходит, нужно только обязательно дойти до конца цикла.

Комметарий к алгоритму (глобальный)
- сперва проверяется, нажата ли кнопка
- если кнопка не нажата, то проверяется переменная (каким светодиодом будем моргать)
- моргание светодиодом (каким - зависит от переменной)
- все
- а если кнопка была нажата, то меняется значение переменной(0>1, 1>0)
- пауза, за которую надо успеть отпустить кнопку
- все

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

ЗЫ. Желательно написать: я понял так то и так, а вот это не понял. Очень хотелось бы чтобы вопросы не были рассчитаны на телепатов, чтобы не было в вопросе неоднозначности. Ведь правильно сформулированный вопрос уже содержит в себе половину ответа.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Помгите разобраться с простенькой задчей

Сообщение Grem » 09 авг 2010, 23:54

alek4322 писал(а):Извините я только начинаюший, ещё вот только чуть чуть начинающий программист, что то я плохо разобрался в алгоритме, если не сложно можно написать код с коментариями, и - а что будет происходить во время не нажатия, а отжатия кнопки, важно что бы изменения происходили только при нажатии, а при отжатии ни чего не происходило, еще раз извините если за не удобство.

как можно учиться чему-либо, прося чтоб за вас написали код?
надо самому писать, и если уж совсем не получается, то спрашивать.
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: Помгите разобраться с простенькой задчей

Сообщение avr123.nm.ru » 10 авг 2010, 00:04

Попытка написать прогу на Си не читая про Си. Прикольно ! :ROFL:
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Помгите разобраться с простенькой задчей

Сообщение cjA » 12 авг 2010, 00:27

какие же все зануды

alek4322, у тебя программа заканчивается не упев начаться, бесконечный цикл while(1) должен стоять в конце main. а он стоит только в программе от 14:44
то есть так:

void main(void){
инициализация
while(1){
обработка ваших кнопок
}// end while
}// end main

ну и в функциях time_x - бесконечные циклы не нужны, если у вас прерывания не обрабатываются
(радисту легко-он не пишет на этом остром как лезвие бритвы языке :) )
cjA
 
Сообщения: 468
Зарегистрирован: 19 мар 2010, 20:11

Re: Помгите разобраться с простенькой задчей

Сообщение alek4322 » 15 авг 2010, 08:18

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


/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.8 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

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
*****************************************************/

#include <mega8.h>
#include <delay.h>

void time_1 ();
void time_2 ();

void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=P State4=P State3=P State2=P State1=P State0=P
PORTB=0x3F;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTC=0x00;
DDRC=0x03;

while (1)
{
if (PINB.5==1)
{
PORTC.1=0;
}
else
{
time_1 ();
delay_ms(50);
time_2 ();
delay_ms(50);
}

}
}


void time_1 ()
{
do
{
PORTC.1=1; //зажигаем светодиод
delay_ms(100); //пусть горит 100 милисекунд
PORTC.1=0; //гасим светодиод
delay_ms(100); //теперь не горит 100 милисекунд
}
while (PINB.5==0);
do
{
PORTC.1=1; //зажигаем светодиод
delay_ms(100); //пусть горит 100 милисекунд
PORTC.1=0; //гасим светодиод
delay_ms(100); //теперь не горит 100 милисекунд
}
while (PINB.5==1);
return;
}



void time_2 ()
{
do
{
PORTC.0=1; //зажигаем светодиод
delay_ms(30); //пусть горит 30 милисекунд
PORTC.0=0; //гасим светодиод
delay_ms(30); //теперь не горит 30 милисекунд
}
while (PINB.5==0);
do
{
PORTC.0=1; //зажигаем светодиод
delay_ms(30); //пусть горит 30 милисекунд
PORTC.0=0; //гасим светодиод
delay_ms(30); //теперь не горит 30 милисекунд
}
while (PINB.5==1);
return;
}
alek4322
 
Сообщения: 11
Зарегистрирован: 08 авг 2010, 13:51

Re: Помгите разобраться с простенькой задчей

Сообщение avr123.nm.ru » 15 авг 2010, 08:48

есть тег CODE !

И за чем do while а не просо while ?
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Помгите разобраться с простенькой задчей

Сообщение alek4322 » 15 авг 2010, 13:24

Работать не будет если есть протеус то попробуйте, там что то не понятное происходит просто долго описывать, при разных условаях по разному но всегда не правильно
alek4322
 
Сообщения: 11
Зарегистрирован: 08 авг 2010, 13:51

Пред.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3