Страница 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.
Замените

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

 if (PORTD.2==0)
на

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

 if (PIND.2==0)
Работающий код для 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
Ну что никто не зает что ли? Подскажите пожалуйста.
Может я как-то порты неправильно насторил?

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

PORTB=0x00;  
   DDRB=0xFF; 
   DDRD=0;

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
Пробовал вешать на них кнопку, читал про регистры, но внятно мало что понял. Можете хоть код примерный сделать?Пытался настроить этот порт, но у меня програ компилилась постоянно с ошибками, поэтому прошу вашей помощи.