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

-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
По факту достаточно ОДНОГО защелкивания. Ведь в процессе дребезга на момент защелкивания может быть считано только одно из двух 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. Ни в одном из случаев нет разрыва последовательности, которая могла бы привести к дребезгу.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Обработка нажатия кнопки в AVR...
КРАМ писал(а):Нет, уважаемый, код Вы будете писать сами.
....
Вот в обработчике этого прерывания читаете состояние порта к которому подключена кнопка. Это состояние вдвигаете справа на лево в некую переменную и тут же маскируете у нее все разряды кроме двух младших. Если значение этой переменной = 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.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
А какой смысл ждать, пока переменная наберёт число 50 ? Ваш вариант - это обычный опрос ПИНа - как поймали "лог 0" на выводе - кнопка нажата. Просто ещё появилась задержка на 50 мс.Если кнопка нажата - переменная KeyUpCnt=50.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Обработка нажатия кнопки в AVR...
Пока дребезг она обнуляется.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
KeyUpCnt=50 это тоже самое, что KEY_UP=0, только через 50 Мс. Можно просто опросить KEY_UP и узнать нажата кнопка или нет, на выводе всё равно "0" сам по себе не появится, а ловите Вы всего одно состояние - "кнопка нажата".
По поводу "хотелось бы кусочек кода" - смотрите в соседней ветке про кнопки.
По поводу "хотелось бы кусочек кода" - смотрите в соседней ветке про кнопки.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
Нет смысла городить огород с обнулением переменной от дребезга. Делай просто счетчик до 10 и каждое 10-е прерывание фиксируй состояние кнопок. Дребезг не будет беспокоить(если он длиться меньше 10мс).
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Обработка нажатия кнопки в AVR...
Нарисовал:
- IM1
- Грызет канифоль
- Сообщения: 268
- Зарегистрирован: Вт фев 16, 2010 12:10:38
- Откуда: Воронеж, Россия
Re: Обработка нажатия кнопки в AVR...
Нет там ничего сложного, у меня так:oleg110592 писал(а):А все таки, для особо тупых хотелось бы кусочек кода.
Код: Выделить всё
// Проверка кнопки
klava1 <<= 1; // Сдвиг буфф. влево
if (PINB & (1<<butt)) // Проверяем кнопку
{
klava1 |=(1<<0); // Мл. разряд =1
}
else
{
klava1 &= ~(1<<0); // Мл. разряд = 0
}
klava1 &= 3; // Маскируем
// Далее обработка по вкусу
switch (klava1)
{Гениально!, за что ему и ПЛЮСУЮ.Alexeyslav писал(а):По факту достаточно ОДНОГО защелкивания.

- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Обработка нажатия кнопки в AVR...
Спасибо - понял. Останусь на своем варианте, тем более подобное применяет и ut1wpr тут: http://kazus.ru/forums/showthread.php?t=104049
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
Я пользовался этой buttons.rar Библиотека для опроса кнопок. немного изменив под себя
работа с библ. примерно такая же как описывал КРАМ.
работа с библ. примерно такая же как описывал КРАМ.
Спойлер
Код: Выделить всё
#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...
Всем привет! Пишу программу гирлянды ,для ATtiny2313,в CodeVisionAVR. Есть несколько световых эффектов(управление PORTB) и кнопка PIND.0. Вопрос в том как реализовать переключение между режимами световых эффектов,нажатием этой кнопки. Что-то в этом роде:нажал-1эфект,еще раз нажал-2 эффект и т.д.,а последнее нажатие - вызывает почередное включение всех эффектов.
Программировать только учусь,поэтому прошу сильно не пинать,и буду признателен любой информации.
Спасибо!
Программировать только учусь,поэтому прошу сильно не пинать,и буду признателен любой информации.
Спасибо!
Re: Обработка нажатия кнопки в AVR...
Здравствуйте. Перешел с CVAVR na atmel studio 6.
К порту D подключены светодиод (PD0) и кнопка (PD1)но светодиод никак не реагирует на кнопку. Как можно проверить нажата ли кнопка? Почему не работает if (PIND1 == 0) ?
К порту 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);
}
}
Re: Обработка нажатия кнопки в AVR...
ibiza11 писал(а):вместо PIND1 == 0 напишите
BitIsClear(PIND, 1)
Не работает
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
Порт D0 и D1 заняты UART-ом, убедись что UART у тебя отключен ибо он перекрывает управление этими выводами когда включен.
Re: Обработка нажатия кнопки в AVR...
Alexeyslav писал(а):Порт D0 и D1 заняты UART-ом, убедись что UART у тебя отключен ибо он перекрывает управление этими выводами когда включен.
Огромное спасибо, подключил к другим выводам-заработало.