Учитывание нажатия кнопки [Робо-Сумо]

Автомат, адаптивный автомат ... разум

Учитывание нажатия кнопки [Робо-Сумо]

Сообщение magdanoz » 06 фев 2010, 22:47

Доброе время суток, коллеги! :)

Мне нужен алгоритм на Bascom-e, где нужно учитывать нажата ли кнопка или нет. Буду использовать алгоритм в целях нажатия кнопки "Старт" в роботе-сумоисте. Логика операций такова:

1. Робот не деляет ничего (На всех выводов двигателей - лог. 0).
2. Кнопка "Старт" нажата.
3. После команды "Старт", кнопка "Старт" опускается.
4. Робот ждет 5 секунд (5000мс).
5. Робот начинает выполнять последующие операции (Начинает двигаться вперед).

Подключение кнопки таково: PB2 (ATmega644) -> Кнопка -> Земля (GND).

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

Алгоритмы операций:
- Робот не делает ничего:
Код: Выделить всё
Leftmotora = 0
Leftmotorb = 0
Rightmotora = 0
Rightmotorb = 0


- Робот начинает двигаться вперед:
Код: Выделить всё
Leftmotora = 1
Leftmotorb = 0
Rightmotora = 1
Rightmotorb = 0


Заранее благодарю всех, кто прочли эту тему и благодарю за помощь! :)
С уважением,
Борислав
if (AVR>PIC) {
ILoveAVR = true;
} else {
ILovePIC = false;
}
Аватара пользователя
magdanoz
 
Сообщения: 35
Зарегистрирован: 16 ноя 2006, 17:54
Откуда: г.София, Р. Болгария
прог. языки: Atmel C, C++, Pascal, Arduino, PHP, MySQL и др.
ФИО: Марчовски Борислав

Re: Учитывание нажатия кнопки [Робо-Сумо]

Сообщение MiBBiM » 06 фев 2010, 23:38

а на псевдокоде? :wink:
Код: Выделить всё
сконфигурировать кнопку и выходные ножки, задать режим "ничегонеделание"
выполнять     ' ждем нажатия кнопки
   пока кнопка не нажата выполнять
     ожидание 1мс
   кц
   ожидание 60мс   ' избегаем дребезга
пока кнопка не нажата

выполнять    ' ждем отпускания
   ожидание 1мс
пока кнопка нажата

ожидание 5с

задать режим "движение вперед"

P.S. обучалка бейсику http://www.decada.org.ru/project/lessons/bascom_avr/
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Учитывание нажатия кнопки [Робо-Сумо]

Сообщение vadinator » 07 фев 2010, 03:57

magdanoz, лучше сразу пробуйте организовать некоторое количество таймеров в программе. Это могут быть простые переменные, которые увеличивают своё значение при вызове подпрограммы обслуживающей прерывание от таймера-счётчика или используют функции чтения времени от начала работы программы. Тогда задержки в программе, не будут мешать анализировать входа микропроцессора...а в основной программе, можно проверять состояние таймера...Таким примерно образом, программируются технологические ПЛК (Программируемые Логические Контроллеры)...
например так:
инициализация программы;
остановить_все_моторы;
tmr[1] = 0;
...
основной цикл;
если (кнопка нажата) то запустить_таймер1;
если (таймер1 > 5сек) то вперёд;
...
если...то...//обработка других входов и переменных...
если...то...//обработка других входов и переменных...

...
-----------------------------------------------------------------------------
:процедура вперёд;
выключить_таймер1;
Leftmotora = 1
Leftmotorb = 0
Rightmotora = 1
Rightmotorb = 0
....
:процедура остановить_все_моторы;
Leftmotora = 0
Leftmotorb = 0
Rightmotora = 0
Rightmotorb = 0
...
:процедура запустить_таймер1// возможно просто менять состояние
//регистра с 0 на 1 в основном цикле
tmr[1] = 1;
...
:процедура выключить_таймер1//возможно просто устанавливать
//регистр в 0, в основном цикле
tmr[1] = 0;
...
:обработчик прерываний от таймера счётчика (1сек или 0.1сек...по выбору)
если (tmr[1]> 0 и tmr[1]<макс. для типа ) то tmr[1] = tmr[1]+ 1//пересчёт таймера

сори за псевдокод, но я не очень помню все операторы баском-бэйсика...но помню, что обрабатывать прерывания там не сложно...надо только назначить подпрограмму в которую передаётся управление...
Роботы, уже среди нас...
Прошу прощения за аватар, никак схему динамической индикации не могу настроить :)
Аватара пользователя
vadinator
 
Сообщения: 979
Зарегистрирован: 19 янв 2010, 14:51
Откуда: Петрозаводск
прог. языки: C, FBD, Wiring-Processimg,,,LD, SFC, ST...
ФИО: Вадим

Re: Учитывание нажатия кнопки [Робо-Сумо]

Сообщение magdanoz » 11 фев 2010, 01:14

Всем огромное спасибо за помощь!
В конце концов я решил написать программу на С. Вот что с кнопкой получилось. Я убрал while(1) { ... } функцию, в которой находился основной цикл программы. Вот что у меня получилось на сегодняшний день:
Код: Выделить всё
oldstat=PINB;

while(1) {
  newstat=PINB;
  res=newstat^oldstat;
  if ((res&)_BV(PB2))&&(newstat&_BV(PB2))) break;
}


Логика такова: Мы ищем состояние кнопки. Так как она подключена к Земли (GND), ее активное состояние - лог. 1. Если она нажата, то состояние ее меняеться на лог. 0. Последующий алгоритм начинает работать если снова на PB2 (где кнопка) попадет сигнал высокого уровня. Если это действие не совершено - то программа останавливается после цикла (ф-я break). После этого while-a, ждем 5 секунд и продолжаем алгоритм. Пока это все. :) Буду писать опять, может кому-то интересно. :D
С уважением,
Борислав
if (AVR>PIC) {
ILoveAVR = true;
} else {
ILovePIC = false;
}
Аватара пользователя
magdanoz
 
Сообщения: 35
Зарегистрирован: 16 ноя 2006, 17:54
Откуда: г.София, Р. Болгария
прог. языки: Atmel C, C++, Pascal, Arduino, PHP, MySQL и др.
ФИО: Марчовски Борислав


Вернуться в Алгоритмы

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

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

cron