Страница 1 из 3
Счетчик нажатий на кнопку
Добавлено: Чт май 09, 2013 19:49:19
MAndrey90
Добрый вечер. Подскажите как сделать счетчик нажатий на кнопку(без вывода на дисплей и т.п.). А то я не представляю даже как это сделать.Желательно с кодом.
Re: Счетчик нажатий на кнопку
Добавлено: Чт май 09, 2013 20:11:40
coredumped
На чем сделать? Микроконтроллер, логика? Тоже контрольная?
Re: Счетчик нажатий на кнопку
Добавлено: Чт май 09, 2013 20:18:25
MAndrey90
Мк авр. Си.
Re: Счетчик нажатий на кнопку
Добавлено: Чт май 09, 2013 23:26:18
Antifritz
А куда выводить это количество нажатий, что вообще менятся должно значение в регистре, состояние порта ввода-вывода?
Re: Счетчик нажатий на кнопку
Добавлено: Чт май 09, 2013 23:44:55
ibiza11
подсказываю:
1) подключить кнопку, замыкающуюся на землю к ножке микроконтроллера
2) настроить ножку в качестве входа с подтяжкой к +
3) подключить параллельно кнопке конденсатор 0,1 - 1,0 мкФ
4) завести переменную в программе, которая будет выступать в качестве счетчика
5) в бесконечном цикле проверять нажата ли кнопка (проверять логический уровень на выводе кнопки)
подсказка: т.к. кнопка замыкает ножку на землю, то при нажатой кнопке на выводе микроконтроллера будет логический ноль. После детектирования нажатия прибавлять к переменной (Вашему счетчику) единицу.
Будут вопросы - пишите.
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 08:12:54
MAndrey90
Код: Выделить всё
void main(void)
{
int i=0;
PORTB=0x00; //устанавливаем высокий уровень
DDRB=0xFF; //устанавливаем порт для вывода
DDRD = 0;
PORTD = 0xFF;
while(1)
{
if (PORTD.2==0){
i=i+1;
}
if (i==1){
PORTB.0=0;
delay_ms(100);
PORTB.0=1;
delay_ms(100);
break;
}
if (i==2){
PORTB.0=0;
delay_ms(10);
PORTB.0=1;
delay_ms(10);
break;
}
if (i>3){
i=0;
}
}
}
Не работает. Что неправильно?
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 08:31:58
MAndrey90
Должна изменяться частота мигания светодиода, но при таком раскладе ничего не происходит.
Провепил все по отдельности. Условия выполняются, счетчик нажатий кнопки не работает.
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 10:22:58
Antifritz
Чтобы прочитать логический уровень на порте ввода нужно использовать регистр PIND.
Замените
на
Работающий код для AVR-GCC (WinAVR, AtmelStudio):
Спойлер
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
PORTB=0x00;
DDRB=0xFF;
DDRD = 0x00;
PORTD = 0xFF;
int i=0;
while(1)
{
if (bit_is_clear(PIND, 2)) //проверяем нажата ли кнопка
{
i++; //увеличиваем счетчик
_delay_ms(500); //задержка для подавления дребезга
}
while(bit_is_clear(PIND, 2)) //ждем пока кнопка будет отпущена
{}
switch(i)
{
case 0: //i=0
{
PORTB=0;
break;
}
case 1: //i=1
{
PORTB=0;
_delay_ms(100);
PORTB=1;
_delay_ms(100);
break;
}
case 2: //i=2
{
PORTB=0;
_delay_ms(10);
PORTB=1;
_delay_ms(10);
break;
}
default: //если i не равно 0, 1, 2 - присваиваем i=0
{
i=0;
}
}
}
}
Добавлено: Пт май 10, 2013 11:07:51
MAndrey90
Спасибо!
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 11:18:41
Кефир
MAndrey90 писал(а):Подскажите как сделать счетчик нажатий на кнопку(без вывода на дисплей и т.п.)
Ну как же, с индикатором поинтереснее будет
Счетчик импульсов на Atmega16 
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 13:14:56
MAndrey90
Подскажите как исправить. На ножки pb0-pb7 у меня повешены светодиоды. На ножку INTO0-кнопка. Все работает. но кнопка срабатывает только на ножке PB0(вроде когда на ней есть 0), на других ножка не срабатывает.
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 16:24:47
MAndrey90
Ну что никто не зает что ли? Подскажите пожалуйста.
Может я как-то порты неправильно насторил?
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 18:46:36
Antifritz
MAndrey90 писал(а):Ну что никто не зает что ли? Подскажите пожалуйста.
А где код, на что смотреть?
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 18:51:13
MAndrey90
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
void main( void )
{
int i=0;
PORTB=0x00;
DDRB=0xFF;
while(1)
{
if (PIND.2==0){
i=i+1;
delay_ms(50);
}
while(PIND.2==0)
{}
switch(i){
case 1:
{
Бла бла бла...
break;
}
case 2:
{
Бла бла бла...
break;
}
case 3:
{
Бла бла бла...
break;
}
default:
i=1;
}
}
}
Я уже по всякому порты пытался настроить. но кнопка срабатывает только на ПБ0(когда там лог. 0 присутсвует.)
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 19:04:45
Antifritz
DDRB=0xFF; //Все пины Порта B на выход
PORTB=0x00; //Все пины в 0
DDRD = 0x00;//Все пины Порта D на ввод
PORTD = 0xFF;//Все пины в 1, при DDRD = 0x00 - получается внутренняя подтяжка
Re: Счетчик нажатий на кнопку
Добавлено: Пт май 10, 2013 19:08:28
MAndrey90
Я так уже пробовал. Вот у меня бегущий огонек сделан. так кнопка(переключение режима) срабатывает только на PB0.А мне надо, чтобы она срабатывала на любой порт pb.
Re: Счетчик нажатий на кнопку
Добавлено: Сб май 11, 2013 07:09:20
MAndrey90
Не, ну что никто не знает в чем проблема? Просто я на этом зациклился уже.
Кнопка просто срабатывает с десятого раза..
Re: Счетчик нажатий на кнопку
Добавлено: Сб май 11, 2013 10:16:38
MAndrey90
Разобрался немного. Кнопка срабатывает у меня только на том месте где заканчивается цикл. Возникает вопрос! Как тогда мне сделать чтобы по нажатию кнопки цикл прерывался, а не доходил до конца?
Re: Счетчик нажатий на кнопку
Добавлено: Сб май 11, 2013 15:04:26
Antifritz
Использовать внешние прерывания INT0, INT1.
Re: Счетчик нажатий на кнопку
Добавлено: Сб май 11, 2013 15:07:27
MAndrey90
Пробовал вешать на них кнопку, читал про регистры, но внятно мало что понял. Можете хоть код примерный сделать?Пытался настроить этот порт, но у меня програ компилилась постоянно с ошибками, поэтому прошу вашей помощи.