Управление нагрузками одной кнопкой.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Прорезались зубы
Сообщения: 217
Зарегистрирован: Сб янв 16, 2010 15:14:57

Сообщение serega-29 »

В контроллерах я мягко говоря не очень, посему прошу помощи. Устройство должно одной кнопкой без фиксации управлять двумя нагрузками и иметь третье, неактивное состояние. Т.е при нажатии и удержании кнопки (2-3 сек) подключается одна нагрузка, при обычном, кратковременном нажатии, нагрузки должны переключаться неограниченое количество раз. И опять же при нажатии и удержании устройство должно отключиться, т.е ни одна нагрузка не должна быть подключена... Как то так...
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Сообщение mixon46 »

я бы написал но я не знаю программирования. никак научится не могу))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

А контроллер обязательно? Можно взять RC-цепочку, заряжаемую кнопкой, напряжение с нее подавать на 2 компаратора с разными порогами, выходы компараторов на 2 счетных триггера. Один триггер включает/выключает нагрузку, второй переключает. Хотя на контроллере конечно схема попроще будет.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

mixon46, вы просто шедевр! :)

serega-29, что конкретно не получается?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Если с длительным нажатием более-менее понятно(и то, какая из двух?), то вот это:
serega-29 писал(а):при обычном, кратковременном нажатии, нагрузки должны переключаться неограниченое количество раз.
совершенно невсасываемо.
Docendo discimus
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Сб янв 16, 2010 15:14:57

Сообщение serega-29 »

pyzhman писал(а):Если с длительным нажатием более-менее понятно(и то, какая из двух?)
без разницы, но при первоначальном включении всегда одна и та же
pyzhman писал(а): то вот это:
serega-29 писал(а):при обычном, кратковременном нажатии, нагрузки должны переключаться неограниченое количество раз.
совершенно невсасываемо.
а что тут не всасываемо? сколько раз кратковременно не нажимал бы, что б состояние нагрузок поочередно изменялось - 1-я вкл 2-я выкл, кнопочку нажал - наоборот 1-я выкл 2-я вкл и т.д.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Да ладно, нормально написано, я же понял :)))
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Вы здесь известный экстрасенс, я уже не удивляюсь. :) :beer:
Docendo discimus
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 451
Зарегистрирован: Сб фев 26, 2011 14:38:42
Откуда: Новочеркасск

Сообщение Reloader »

Если мне не изменяет память - DIHALT разрабатывал управление одной кнопкой...
Гляньте у него..
Выпрямите спину и уберите левую руку от лица.
Мой Youtube канал
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да, без DIHALTа тут никак не разобраться....
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 317
Зарегистрирован: Чт июл 15, 2010 13:47:09
Откуда: Лютый Питер

Сообщение dr.faust »

Сударь хочет код или совет?
Господа, [url=http://google.ru/][b]это[/b][/url] - не стыдно.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

ТС хочет, судя по затравке, устройство. Т.е. ящик с клеммами.
Docendo discimus
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Сб янв 16, 2010 15:14:57

Сообщение serega-29 »

Прошивку под конкретный контроллер хотелось бы...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 317
Зарегистрирован: Чт июл 15, 2010 13:47:09
Откуда: Лютый Питер

Сообщение dr.faust »

Закажите фрилансерам, сделают цивильно и быстро, но за деньги.
Могу гору костылей написать, но не думаю, что это хорошая идея.
Господа, [url=http://google.ru/][b]это[/b][/url] - не стыдно.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

serega-29 писал(а):Прошивку под конкретный контроллер хотелось бы...
Жаль.. Могу написать, только под тот, для которого смогу написать :write:
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Сб янв 16, 2010 15:14:57

Сообщение serega-29 »

Аlex писал(а):Жаль.. Могу написать, только под тот, для которого смогу написать :write:
Ты немного не правильно понял - мне все равно под какой контроллер, лишь бы попроще и понадежнее...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

лишь бы попроще
Проще кому ?
Могу для PIC32 написать, я как раз их изучаю :)) Боюсь, другие МК не потянут такую задачу :))
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Сб янв 16, 2010 15:14:57

Сообщение serega-29 »

Аlex писал(а):
лишь бы попроще
Проще кому ?
Могу для PIC32 написать, я как раз их изучаю :)) Боюсь, другие МК не потянут такую задачу :))
Так сложно? Может ну его... Старый добрый механический переключатель и проблема решена. Не так эстетично и технологично, зато дешево и практично, как говаривал небезызвестный персонаж...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ну вот, видите, и решение сразу само пришло :)))
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

serega-29 писал(а):Может ну его... Старый добрый механический переключатель и проблема решена.
НЕ ШАГУ НАЗАД!
Никаких тебе переключателей..... Только вперед! К светлому будущему!
Внедрим в ближайшую пятилетку в каждый коробок по ATtiny13A !!!!!
Изображение

тем более и код уже испечен (кстати времени потратил столько же, сколько на прочтение данной страницы.....)
Спойлер

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

//#######################################################################################################################
//#######################################################################################################################
//##
//## УПРАВЛЕНИЕ 2-МЯ НАГРУЗКАМИ С ПОМОЩЬЮ ОДНОЙ КНОПКИ    
//##
//-----------------------------------------------------------------------------------------------------------------------
// включаемые файлы
#define F_CPU 9600000
#include <util/delay.h>
#include <avr/io.h>

//дефайны
#define BtnPIN     PINB                            /*порт подключения кнопки*/
#define BtnLine (1<<0)                            /*пин подключения кнопки*/

#define LedPORT PORTB                            /*порт подключения светодиода*/
#define LedLine1 (1<<1)                            /*пин подключения светодиода*/
#define LedLine2 (1<<2)                            /*пин подключения светодиода*/

#define BtnShort (1<<0)                            /*бит короткого нажатия*/
#define BtnLong  (1<<1)                            /*бит длинного нажатия*/

//прототипы функций    
char BtnGet (void);                                //ф-ция опроса кнопки


//-----------------------------------------------------------------------------------------------------------------------
//Главная функция
int main (void)
{
    DDRB =     (LedLine1| LedLine2);                //включение линий порта на вывод
    PORTB = BtnLine;                            //включит подтяжку на кнопке

    while(1)                                    //бесконечный цикл
    {
        char BtnMask = BtnGet();                //опрос кнопки

        if (BtnMask & BtnShort){                //проверка на короткое нажатие

            if (LedPORT & LedLine1)            
                LedPORT = LedLine2;                //если светик 1 был включен, выключить его и включить 2-й
            else
                LedPORT = LedLine1;                //если светик 2 был включен, выключить его и включить 1-й
        }

        if (BtnMask & BtnLong){                    //проверка на длинное нажатие

            if (LedPORT & (LedLine1| LedLine2))            
                LedPORT = 0;                    //если хоть какой-то светик был включен, выключить все    
            else
                LedPORT = LedLine1;                //если оба светика были выключены, включить 1-й 
        }
    }
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ОБРАБОТКИ НАЖАТИЯ КНОПКИ
//ЗНАЧЕНИЕ - маска нажатой кнопки (короткое\ длинное нажатия)
char BtnGet (void)
{    
    //задержки обработки событий кнопки
    #define BtnLockTime 30                        /*время обработки дребезга в милисекундах (10-100)*/
    #define BtnLongPressTime 1000                /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/

    static unsigned char BtnLockBit;            //защелка (защита от дребезга)
    static unsigned char BtnLockCoun;            //счетчик защелки (защита от дребезга)
    static unsigned char BtnLongCoun;            //счетчик длинного нажатия
    char BtnFlags = 0;                            //байт флагов нажатых кнопок

    _delay_ms (10);                                //задержка для организации частоты опроса 100Гц

    if (!(BtnPIN & BtnLine)){                    //клавиша нажата
        if (BtnLockCoun < (BtnLockTime/10)){
            BtnLockCoun++;
            goto m1;
        }

        BtnLockBit=1;                            //нажатие зафиксировано                
        if (BtnLongCoun == (BtnLongPressTime/10))                                
            goto m1;

        BtnLongCoun ++;
        if (BtnLongCoun == (BtnLongPressTime/10)){
            BtnFlags |= BtnLong;                //установка бита длинного нажатия (старшие 4 бита флагов ButtonByte)
        }
    }
                
    else{                                        //клавиша отжата            
        if (BtnLockCoun != 0){
            BtnLockCoun --;
            goto m1;
        }

        if (! (BtnLockBit))                        //отжатие зафиксировано
            goto m1;

        BtnLockBit =0;
        if (BtnLongCoun < (BtnLongPressTime/10))
            BtnFlags |= BtnShort;                //установка бита короткого нажатия (младшие 4 бита флагов ButtonByte)
        BtnLongCoun = 0;
    }
m1:    return BtnFlags;
}


//#######################################################################################################################
//#######################################################################################################################    
Вложения
sh.gif
(15.35 КБ) 3982 скачивания
Ответить

Вернуться в «Разные вопросы по МК»