Опрос кнопок микроконтроллером

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Опрос кнопок микроконтроллером

Сообщение pokk »

Делаю опрос кнопок всё работает нормально но код получился достаточно объёмным. Можно как-нибудь его ужать не изменяя его ? Просто когда дальше делать заполнять действиями по всем клавишам чёрти что получится единственный вариант видел вынести как функцию в общем как и сделал.
Хотя вот пока писал на ум пришла не большая мысль. Вынести код который должен исполнятся при нажатии на кнопку в другой файл т.е на 4 кнопки 4 дополнительных листинга =)
Спойлер

Код: Выделить всё

             switch (PIND)   {
                case start: {
                            delay_ms(delay);      // ждём пока установится напряжение(антидребезг)   
                            if (PIND==start){        // если все нормально переключаем
                                LCD_SECOND_STR();    // что-то делаем
                            }
                            while(PIND==start) {};    // ждем отпускания кнопки
                            delay_ms(delay);       // антидребезг
                            break;               //выход
                }
                case stop: {
                            delay_ms(delay);
                            if (PIND==stop){ 
                                z=0;
                            }
                            while(PIND==stop) {};
                            delay_ms(delay);
                            break;
                }
                case next:{
                            delay_ms(delay);
                            if (PIND==next){ 
                                LCDdat(0x33);
                            }
                            while(PIND==next) {};
                            delay_ms(delay);
                            break;
                }
                case clear:{
                            delay_ms(delay);
                            if (PIND==clear){ 
                                LCD_clear();
                            }
                            while(PIND==clear) {};
                            delay_ms(delay);
                            break;
                }
            default:break;
            }
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Делайте один антидребезг до обработки в switch и одно ожидание отпускания после обработки.Тогда и код станет короче и визуально будет лучше выглядеть.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: CodeVision AVR в вопросах и ответах

Сообщение pokk »

На ум приходит только одинаковый кусок кода вынести, а как ? :dont_know:

Видел где-то там было по флагам всё реализовано примерно такой же код только внутри изменяется какой-то флаг а после ещё раз та же структура. Мне вот там и не понравилось что два раза switch вызывать.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

вот простой алгоритм
Считали порт (!PIND&BUTTONMASK),
пауза
считали еще раз порт
если два значения совпали,
то делаем switch
после switch тупим, пока любая кнопка нажата (!PIND&BUTTONMASK)
если не совпали ничего не делаем

PS можно так и мультинажатие отрабатывать.
nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение nikityan »

#include <ioavr.h>
#include <intrinsics.h>
#define KEY1 (0<<4)
#define KEY2 (1<<5)
#define ANY_KEY (KEY1 | KEY2)
#define NO_KEY 0
int main( void )
{
DDRC=255;
DDRA=0;

while (1) //Организовываем бесконечный цикл
{
if (PINA==KEY1)
PORTC|=(1<<4);

}

}

Кнопка подключена к земле. Не реагирует. За то прикасаюсь пальцем к микросхеме и светодиод загорается. Как заставить работать кнопку относительно земли?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ploop »

А где подтяжка?
nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение nikityan »

Простите, всмысле подтяжка?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Помогите опросить кнопку

Сообщение ploop »

Тогда ответьте на вопрос: когда отпущена кнопка, что у вас на входе? Какой потенциал?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Помогите опросить кнопку

Сообщение nikityan »

Всё, я понял, только какое примерно сопротивление поставить?
ПС я забыл поставить подтягиваюший резистор)
Пока кнопка не нажата потенциал 1,6 вольт, тоесть лог 0, а при нажатии её относительно земли вообше ничего.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Интересные дела... а как ты замерил эти 1.6В? вход порта у контролера устроен так что он не может поддерживать какой-то уровень напряжения - это просто затвор полевого транзистора. Напряжение на нем меняется от электрического(наведенная статика от одежды например) поля наведенного человеком на расстоянии десятков сантиметров если его не подтянуть. Неизвестно что намерял там прибор.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Помогите опросить кнопку

Сообщение ploop »

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

Просто производители контроллеров сделали очень удобную вещь - внутренний подтягивающий резистор, и новички, видя схемы, где есть контроллер, кнопка и больше ничего, наивно думают, что так и должно быть. Но кто работал с цифровой техникой до прихода контроллеров прекрасно понимает, что если вход логического элемента висит в воздухе - его состояние не определено до тех пор, пока явно не задано (пока он куда-нибудь не подключен).
nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Помогите опросить кнопку

Сообщение nikityan »

Спасибо, я понял, но как включить внутренний подтягиваюший резистор? Работаю в IAR, и нужен пример для него. Тоесть хочу включить подтягиваюший резистор для определённой ноги)
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Прочитать даташит. Включается точно так же как изменяется направление вывода. Но в дополнение к тому что указать для какого вывода используется подтяжка, надо еще их разрешить глобально.
nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Помогите опросить кнопку

Сообщение nikityan »

PORTA=0xFF; вот так я разрешаю глобально?
nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Помогите опросить кнопку

Сообщение nikityan »

Не, ну перечитал уже всё... Не знаю как у порта A4 включить подтягивающий резистор на Atmega32. Для IAR ничего не нахожу. Для других компиляторов что то есть, но они хотябы хавают код а не плються ошибками.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

Лучше почитай даташит, там найдешь еще очень много полезного.

Конкретно там есть табличка "PortPin Configurations". Чтобы включить подтяжку надо: перевести порт на ввод, установить там "1" и установить бит PUD в регистре SFIOR, иначе порт будет просто в высокоимпендансном состоянии.
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: Помогите опросить кнопку

Сообщение VanyaSV »

Я тоже долго парился с линиями портов ввода/вывода... Но мой знакомый программист объяснил мне, как надо юзать их)
pin* port*
0 0 нога вход
0 1 нога вход +резистор на +питания
1 0 нога выход +лог. 0 на выходе
1 1 нога выход +лог. 1 на выходе
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Помогите опросить кнопку

Сообщение Alexeyslav »

В даташите черным по английски нарисована именно такая же табличка. Так что не обязательно слушатся знакомого программиста - иногда быстрее и точнее найти это в даташите.
nikityan
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Re: Помогите опросить кнопку

Сообщение nikityan »

#include <ioavr.h>
#include <intrinsics.h>

int main( void )
{
DDRC=255; //Все порты C как выход (для светодиода)
DDRA=0; //Все порты A как вход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.

while (1) //Организовываем бесконечный цикл
{
if (PINA==(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
{
PORTC&=(~(1<<4));
}
}


}


Это всё работает при нажатии кнопки только когда я подношу к микроконтроллеру вплотную палец, после чего убирая палец я фиксирую состояние светодиода и он не реагирует на кнопку. Может накрылся внутренний генератор 8 мГц? И стартует только при поднесении пальца?
Ответить

Вернуться в «Периферия»