Например TDA7294

Форум РадиоКот • Просмотр темы - Обработка нажатия кнопки в AVR...
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 20:29:45

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


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 294 ]     ... , , , 8, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Пн июн 11, 2012 18:03:35 
Открыл глаза

Зарегистрирован: Пт мар 23, 2012 17:11:00
Сообщений: 46
Рейтинг сообщения: 0
То есть все время работы мк он будет прерываться и проверять имело ли место нажатия кнопки? а это разве не повлияет на производительность? или на высокой частоте это не значительно?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Пн июн 11, 2012 18:44:19 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21837
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Пример.
Время одного машцикла при тактовой частоте 8 МГц - 125 нс (для Меги).
Для исполнения обработчика прерывания с обозначенным выше алгоритмом потребуется порядка 15 машциклов, включая латентность самого прерывания. Т.е. примерно 2...2,5 мкс. Они следуют с частотой 65 мс. Скважность процесса - 30 000 минимум. Т.е. потеря производительности составит 0,003%...
Если учесть, что любимый цикл для Вас - пустой, то о чем тут речь?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Пн мар 18, 2013 12:03:11 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Вт фев 16, 2010 12:10:38
Сообщений: 268
Откуда: Воронеж, Россия
Рейтинг сообщения: 0
КРАМ писал(а):
А вот алгоритм я Вам опишу.
Спасибо. То, что надо. Работает замечательно. :beer:


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 16:10:38 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Цитата:
Программное состояние кнопки фиксируется только тогда, когда два защелкнутых состояния подряд одинаковы.
По факту достаточно ОДНОГО защелкивания. Ведь в процессе дребезга на момент защелкивания может быть считано только одно из двух 1 или 0. Но поскольку конкретно этот момент считывания обрамляют разные уровни 1 и 0 либо 0 и 1 то каким бы ни было считывание в момент дребезга оно лишь приведет к отставанию считывания реального состояния кнопки максимум на время одного опроса.

т.е. что получается в момент дребезга при нажатии кнопки : 0-0-"1"-1-1 или 0-0-"0"-1-1 в момент отпускания: 1-1-"1"-0-0 или 1-1-"0"-0-0. Ни в одном из случаев нет разрыва последовательности, которая могла бы привести к дребезгу.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 17:43:59 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
КРАМ писал(а):
Нет, уважаемый, код Вы будете писать сами.
....
Вот в обработчике этого прерывания читаете состояние порта к которому подключена кнопка. Это состояние вдвигаете справа на лево в некую переменную и тут же маскируете у нее все разряды кроме двух младших. Если значение этой переменной = 0, то пишите в программное состояние кнопки 0, если значение этой переменной = 3, то программное состояние кнопки 1, а если переменная равна 1 или 2, то изменять значение программной кнопки нельзя - оно останется прежним...

А все таки, для особо тупых хотелось бы кусочек кода. Я опрос кнопок делаю по другому - таймер настроен на прерывания с частотой 1 мс (там же в прерывании и опрос кнопок и индикация семисегментная):
Код:
#define KEY_UP   PINB_Bit5
volatile unsigned char KeyUpCnt;
.....
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf (void)
{
    TCNT0 = 0x83; //set count
    if(KEY_UP==0){if(KeyUpCnt<50) KeyUpCnt++;}
    else KeyUpCnt=0;
    .....
}

Если кнопка нажата - переменная KeyUpCnt=50.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 20:34:08 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: -1
Медали: 1
Получил миской по аватаре (1)
Цитата:
Если кнопка нажата - переменная KeyUpCnt=50.
А какой смысл ждать, пока переменная наберёт число 50 ? Ваш вариант - это обычный опрос ПИНа - как поймали "лог 0" на выводе - кнопка нажата. Просто ещё появилась задержка на 50 мс.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 20:37:46 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Пока дребезг она обнуляется.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 20:59:32 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: -1
Медали: 1
Получил миской по аватаре (1)
KeyUpCnt=50 это тоже самое, что KEY_UP=0, только через 50 Мс. Можно просто опросить KEY_UP и узнать нажата кнопка или нет, на выводе всё равно "0" сам по себе не появится, а ловите Вы всего одно состояние - "кнопка нажата".
По поводу "хотелось бы кусочек кода" - смотрите в соседней ветке про кнопки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 21:12:40 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Нет смысла городить огород с обнулением переменной от дребезга. Делай просто счетчик до 10 и каждое 10-е прерывание фиксируй состояние кнопок. Дребезг не будет беспокоить(если он длиться меньше 10мс).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вт мар 19, 2013 21:17:01 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Нарисовал:
Вложение:
KeYp.png [4.82 KiB]
Скачиваний: 447


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Ср мар 20, 2013 12:16:39 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Вт фев 16, 2010 12:10:38
Сообщений: 268
Откуда: Воронеж, Россия
Рейтинг сообщения: 0
oleg110592 писал(а):
А все таки, для особо тупых хотелось бы кусочек кода.
Нет там ничего сложного, у меня так:
Код:
// Проверка кнопки
    klava1 <<= 1;                           //  Сдвиг буфф. влево
    if (PINB & (1<<butt))                   // Проверяем кнопку
    {
       klava1 |=(1<<0);                    // Мл. разряд =1
    }
    else
    {
       klava1 &= ~(1<<0);                // Мл. разряд = 0 
    }
    klava1 &= 3;                           // Маскируем 
// Далее обработка по вкусу
    switch (klava1)
    {
Но в этом нет особого смысла в свете сообщения Alexeyslav
Alexeyslav писал(а):
По факту достаточно ОДНОГО защелкивания.
Гениально!, за что ему и ПЛЮСУЮ. :beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Ср мар 20, 2013 13:16:01 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Спасибо - понял. Останусь на своем варианте, тем более подобное применяет и ut1wpr тут: http://kazus.ru/forums/showthread.php?t=104049


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Чт мар 21, 2013 20:57:28 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Я пользовался этой buttons.rar Библиотека для опроса кнопок. немного изменив под себя
Вложение:
BUTTON.rar [1.55 KiB]
Скачиваний: 298

работа с библ. примерно такая же как описывал КРАМ.
Спойлер
Код:

#include "buttons.h"
#define F_CPU 8000000
#define time_msec    10 //интервал времени возникновения прерывания
#define Time_dev    (unsigned char)((((F_CPU*time_msec)/1024000))-1)// для регистра OCR2
unsigned char   flag_timer;

void main(void)
{

BUT_Init();
//=== Timer T0 ===// Таймер реального времени.
       OCR0 =   Time_dev;                          // записать в регистр заранее подготовленоого значения 10 msec
 

 
       TIMSK  = (0<< OCIE2)|(0<< TOIE2)|           // маска разрешения прерываний по таймерам
                (0<<TICIE1)|(0<<OCIE1A)|
                (0<<OCIE1B)|(0<< TOIE1)|
                (1<< OCIE0)|(0<< TOIE0);
     
       TCCR0  = (0<< FOC0)|(0<<WGM00)|           // разрешить работу и прерывание  таймер0
                (0<<COM01)|(0<<COM00)|
                (1<<WGM01)|(1<< CS02)|
                (1<< CS01)|(1<< CS00);
asm("sei");
while(1)
      {
      if(flag_timer)//проверка флага был ли опрос кнопок
        {
        flag_timer = 0;
        unsigned char key = BUT_GetKey();//получение кода нажатой кнопки
        switch(key){
                  case (KEY_NULL) : /*дейсттвие*/    ;  break; 
                  case (KEY_ENTER) : /*дейсттвие*/    ;  break; 
                  case (KEY_CANCEL) : /*дейсттвие*/    ;  break; 
                   case (KEY_UP) :/*дейсттвие*/     ;  break; 
                   case (KEY_DOWN) :/*дейсттвие*/     ;  break; 
                   case (KEY_RIGHT) :/*дейсттвие*/     ;  break; 
                    case (KEY_LEFT)  :/*дейсттвие*/     ;  break; 
                    default                   :/*дейсттвие*/     ; 
                         };
         };
     
      };

};


#pragma vector = TIMER0_COMP_vect //прерывание
__interrupt void TIMER0_COMP (void)
{
  BUT_Debrief(); // опрос кнопок
  flag_timer =1; // флаг опросили
   
};


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Чт июн 06, 2013 20:16:40 
Встал на лапы

Зарегистрирован: Вт дек 28, 2010 18:25:31
Сообщений: 102
Рейтинг сообщения: 0
Всем привет! Пишу программу гирлянды ,для ATtiny2313,в CodeVisionAVR. Есть несколько световых эффектов(управление PORTB) и кнопка PIND.0. Вопрос в том как реализовать переключение между режимами световых эффектов,нажатием этой кнопки. Что-то в этом роде:нажал-1эфект,еще раз нажал-2 эффект и т.д.,а последнее нажатие - вызывает почередное включение всех эффектов.
Программировать только учусь,поэтому прошу сильно не пинать,и буду признателен любой информации.
Спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Пт июн 07, 2013 09:11:39 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Вот тут было такое.
viewtopic.php?f=20&t=90155&p=1691343#p1691343


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вс июн 23, 2013 14:19:48 
Открыл глаза

Карма: 2
Рейтинг сообщений: 5
Зарегистрирован: Вт мар 12, 2013 09:13:16
Сообщений: 71
Рейтинг сообщения: 0
Здравствуйте. Перешел с CVAVR na atmel studio 6.
К порту D подключены светодиод (PD0) и кнопка (PD1)
Код:
#define Bit(bit)  (1<<(bit))
#define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
//пример: ClearBit(PORTB, 1); //сбросить 1-й бит PORTB

#define SetBit(reg, bit)          reg |= (1<<(bit))
//пример: SetBit(PORTB, 3); //установить 3-й бит PORTB

#define SetBitVal(reg, bit, val) do{if ((val&1)==0) reg &= (~(1<<(bit)));\
else reg |= (1<<(bit));}while(0)
//пример: SetBitVal(PORTB, 3, 1); //установить 3-й бит PORTB
//     SetBitVal(PORTB, 2, 0); //сбросить 2-й бит PORTB

#define BitIsClear(reg, bit)    ((reg & (1<<(bit))) == 0)
//пример: if (BitIsClear(PORTB,1)) {...} //если бит очищен

#define BitIsSet(reg, bit)       ((reg & (1<<(bit))) != 0)
//пример: if(BitIsSet(PORTB,2)) {...} //если бит установлен

#define InvBit(reg, bit)     reg ^= (1<<(bit))
//пример: InvBit(PORTB, 1); //инвертировать 1-й бит PORTB


int main()
{
DDRD =0b00000001;
PORTD=0b11111111;
   
while (1){

if (PIND1 == 0) {SetBit(PORTD, 0);
} else {
ClearBit(PORTD, 0);
}
}
но светодиод никак не реагирует на кнопку. Как можно проверить нажата ли кнопка? Почему не работает if (PIND1 == 0) ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вс июн 23, 2013 14:57:26 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: -1
вместо PIND1 == 0 напишите
BitIsClear(PIND, 1)

_________________
Ставим плюсы: )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вс июн 23, 2013 15:42:42 
Открыл глаза

Карма: 2
Рейтинг сообщений: 5
Зарегистрирован: Вт мар 12, 2013 09:13:16
Сообщений: 71
Рейтинг сообщения: 0
ibiza11 писал(а):
вместо PIND1 == 0 напишите
BitIsClear(PIND, 1)

Не работает :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вс июн 23, 2013 17:31:15 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Порт D0 и D1 заняты UART-ом, убедись что UART у тебя отключен ибо он перекрывает управление этими выводами когда включен.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Вс июн 23, 2013 21:10:20 
Открыл глаза

Карма: 2
Рейтинг сообщений: 5
Зарегистрирован: Вт мар 12, 2013 09:13:16
Сообщений: 71
Рейтинг сообщения: 0
Alexeyslav писал(а):
Порт D0 и D1 заняты UART-ом, убедись что UART у тебя отключен ибо он перекрывает управление этими выводами когда включен.

Огромное спасибо, подключил к другим выводам-заработало.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 294 ]     ... , , , 8, , , ...  

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


Кто сейчас на форуме

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


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y