roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 16:51

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 20:05 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 20:57 
Не в сети
Аватара пользователя

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

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

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

Весь этот алгоритм - это один бесконечный цикл, внутри несколько ифов и элзе. Удачи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 21:22 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
alek4322 писал(а):
я согласен с тем что при первом нажатии кнопки включается бесконечный цикл мигания светодиода, но как выйти из него не при следующем нажатии на кнопку

Никак. На-то он и бесконечный.
Не надо применять бесконечный цикл, применяй цикл с условием. Как условие исполнилось - цикл остановился.

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 21:37 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 21:55 
Не в сети
Аватара пользователя

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

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

ЗЫ. Предложенный алгоритм не является единственно верным, но он прост.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 22:34 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 23:46 
Не в сети
Аватара пользователя

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

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

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

ЗЫ. Желательно написать: я понял так то и так, а вот это не понял. Очень хотелось бы чтобы вопросы не были рассчитаны на телепатов, чтобы не было в вопросе неоднозначности. Ведь правильно сформулированный вопрос уже содержит в себе половину ответа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 09 авг 2010, 23:54 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
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ß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 10 авг 2010, 00:04 
Не в сети
отсылающий читать курс
Аватара пользователя

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

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 12 авг 2010, 00:27 
Не в сети

Зарегистрирован: 19 мар 2010, 20:11
Сообщения: 468
какие же все зануды

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

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

ну и в функциях time_x - бесконечные циклы не нужны, если у вас прерывания не обрабатываются
(радисту легко-он не пишет на этом остром как лезвие бритвы языке :) )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 15 авг 2010, 08:18 
Не в сети

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 15 авг 2010, 08:48 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
есть тег CODE !

И за чем do while а не просо while ?

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
СообщениеДобавлено: 15 авг 2010, 13:24 
Не в сети

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO