| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Несколько функций на одной кнопке
24.12.2013, 16:35
|
|
|
Временная регистрация
Регистрация: 04.02.2013
Сообщений: 78
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Несколько функций на одной кнопке
Всем добрый день!!! Прошу помощи в разъяснении моей проблемы.
При нажатии на кнопку (длительность менее 3 сек.) должна изменяться выводимая информация на LCD. При нажатии и удержании кнопки определенная информация должна сохраняться в EEPROM. Для этих целей я использую таймер (может и неправильно, я не знаю). Проверяю продолжительность фронта путем изменения состояния порта подключенного к осциллографу. Каждый раз, когда я нажимаю продолжительность фронта разная. Я сделал при нажатии на кнопку запускался таймер, а при отпускании кнопки таймер останавливался. Все равно фронт плывет. Что делать?
procedure T0_start_stop (init: byte);
begin
SREG_I_bit := 1; // Interrupt enable
TOIE0_bit := 1; // Timer0 overflow interrupt enable
TCCR0 := init; // Start timer with 1024 prescaler
end;
procedure Timer0Overflow_ISR(); org IVT_ADDR_TIMER0_OVF ;
var count_nastr, count_vibor, count_save: byte;
begin
if button_vibor = 0 then
begin
if count_save ›= Delay_save then
begin
PORTC:= not PORTC;
count_save:= 0;
end
else inc (count_save);
end
else
begin
T0_start_stop (0);
count_save:= 0;
end;
end;
While true do
begin
if button_vibor = 0 then T0_start_stop (5)
else T0_start_stop (0);
end;
|
|
|
|
24.12.2013, 17:49
|
|
|
Вид на жительство
Регистрация: 13.05.2005
Сообщений: 384
Сказал спасибо: 9
Сказали Спасибо 44 раз(а) в 37 сообщении(ях)
|
Re: несколько функций на одной кнопке
Что такое "продолжительность фронта"? И куда она плывет?
Для начала нужно понять на какие события от кнопки: нажатие/отпускание в определенный период вы собираетесь реагировать... не забудьте отфильтровать антидребезг.
__________________
В технике главное - кувалда. (с)
|
|
|
|
24.12.2013, 19:09
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,440
Сказал спасибо: 375
Сказали Спасибо 1,052 раз(а) в 621 сообщении(ях)
|
Re: несколько функций на одной кнопке
Сообщение от ua3rad
|
|
Что делать?
|
Пусть таймер постоянно молотит в каждом прерывании по переполнению инкментирует глобальную (или статическую) переменную.
Посмотрели, если нащелкало больше чем умещается в 3 сек, одно действие, меньше - другое.
Все просто.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
24.12.2013, 20:56
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Делал так:
Как написал gary2007, постоянно работает таймер по совпадению (вроде режим СТС), период срабатывания примерно каждые 0,2..0,4 с.
Нажал кнопку взводиться Start=1 - программный счетчик запустился ; следующее срабатывание - проверяем состяние кнопки: если все еще нажата инкремент счетчика, если уже отжата , Start=0 - прверяем сколько натикало:
больше 3сек - одно действие, меньше - другое.
Как приемущество - ненадо дополнительно вводить операцию антидребезг ,т.к. период проверки 0,2с.
|
|
|
|
24.12.2013, 22:12
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: Несколько функций на одной кнопке
А это разве не антидребезг?
Только недоношенный - при отпускании нет фильтрации дребезга. Будут проскакивать короткие "нажатия".
|
|
|
|
Сказали "Спасибо" omercury
|
|
|
25.12.2013, 12:17
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от omercury
|
|
при отпускании нет фильтрации дребезга. Будут проскакивать короткие "нажатия".
|
как показали эксперименты на определенных кнопках , дребезг по отжатию не происходит. Специально ставил счетчики срабатывания контактов по нажатию и отпусканию кнопки.
|
|
|
|
25.12.2013, 13:43
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Сообщение от MaxiMuz79
|
|
дребезг по отжатию не происходит. Специально ставил счетчики срабатывания контактов по нажатию и отпусканию кнопки.
|
Незафиксированный вашими счетчиками еще не означает "не происходит". Не обольщайтесь.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
06.01.2014, 14:36
|
|
|
Временная регистрация
Регистрация: 08.02.2011
Сообщений: 74
Сказал спасибо: 8
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Несколько функций на одной кнопке
|
PHP код:
|
void TIM4_IRQHandler(void)
{
if(push_butt‹0xFFFFFFF0)push_butt++;
}
unsigned int power_butt_ms(void)
{
unsigned int tmp;
tmp = push_butt/20;
//printf("push_butt %i , %u , %u\n",push_butt,push_butt,tmp);
push_butt=0;
return tmp;
}
void EXTI15_10_IRQHandler(void)
{
if((EXTI-›PR&(1‹‹10))!=0)
{
delay_us(100);// антидребезг
if((GPIOB-›IDR&power_butt)==0)
{
GPIOB-›BSRR=power_sw;
butt_hold_off();
}
else
{
GPIOB-›BRR=power_sw;
butt_hold_on();
}
EXTI-›PR |= (1‹‹10);
}
EXTI-›PR = EXTI-›PR ;
}
void butt_hold_on(void)
{
//printf("push\n");
power_butt_ms();
}
void butt_hold_off(void)
{
int tmp = power_butt_ms();
printf("push %i\n",tmp);
if(tmp›8000)power_off();
}
|
как-то так у меня реализовано
таймер накручивает счетчик
при изменении состояния считывание и сброс
Последний раз редактировалось andrey9806; 06.01.2014 в 14:39.
|
|
|
|
06.01.2014, 14:42
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Антидребезг у вас мощный, andrey9806!
Я делаю иначе. По перепаду фронта по кнопке запускается прерывание, которое запускает таймер. Таймер вызывает прерывание и инкременирует счетчик. Прерывание смотрит, нажата ли кнопка и инкременирует второй счетчик, если нажата и третий, если не нажата. Если третий переполнился - кнопка отпущена. Тормозим таймер. Измеряем второй счетчик. Сколько в нем значений, столько долго держали кнопку нажатой. И не важно, было ли случайное срабатывание или нет.
|
|
|
|
09.01.2014, 08:34
|
|
|
Временная регистрация
Регистрация: 04.02.2013
Сообщений: 78
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Несколько функций на одной кнопке
Мне бы пока реализовать и без антидребезга, попроще. На данный момент вообще не работает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:16.
|
|