Счетчик нажатий на кнопку

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Добрый вечер. Подскажите как сделать счетчик нажатий на кнопку(без вывода на дисплей и т.п.). А то я не представляю даже как это сделать.Желательно с кодом.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

На чем сделать? Микроконтроллер, логика? Тоже контрольная?
Все будет только лучше, в крайнем случае - хуже.
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Мк авр. Си.
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

А куда выводить это количество нажатий, что вообще менятся должно значение в регистре, состояние порта ввода-вывода?
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

подсказываю:
1) подключить кнопку, замыкающуюся на землю к ножке микроконтроллера
2) настроить ножку в качестве входа с подтяжкой к +
3) подключить параллельно кнопке конденсатор 0,1 - 1,0 мкФ
4) завести переменную в программе, которая будет выступать в качестве счетчика
5) в бесконечном цикле проверять нажата ли кнопка (проверять логический уровень на выводе кнопки)
подсказка: т.к. кнопка замыкает ножку на землю, то при нажатой кнопке на выводе микроконтроллера будет логический ноль. После детектирования нажатия прибавлять к переменной (Вашему счетчику) единицу.
Будут вопросы - пишите.
Ставим плюсы: )
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение 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;
   }
   }
   }
Не работает. Что неправильно?
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Должна изменяться частота мигания светодиода, но при таком раскладе ничего не происходит.
Провепил все по отдельности. Условия выполняются, счетчик нажатий кнопки не работает.
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение 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;
			}
		}
	}	
}
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Спасибо!
Встал на лапы
Аватара пользователя
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов

Сообщение Кефир »

MAndrey90 писал(а):Подскажите как сделать счетчик нажатий на кнопку(без вывода на дисплей и т.п.)
Ну как же, с индикатором поинтереснее будет :)

Счетчик импульсов на Atmega16 :)
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Подскажите как исправить. На ножки pb0-pb7 у меня повешены светодиоды. На ножку INTO0-кнопка. Все работает. но кнопка срабатывает только на ножке PB0(вроде когда на ней есть 0), на других ножка не срабатывает.
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Ну что никто не зает что ли? Подскажите пожалуйста.
Может я как-то порты неправильно насторил?

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

PORTB=0x00;  
   DDRB=0xFF; 
   DDRD=0;
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

MAndrey90 писал(а):Ну что никто не зает что ли? Подскажите пожалуйста.
А где код, на что смотреть?
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение 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 присутсвует.)
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

DDRB=0xFF; //Все пины Порта B на выход
PORTB=0x00; //Все пины в 0
DDRD = 0x00;//Все пины Порта D на ввод
PORTD = 0xFF;//Все пины в 1, при DDRD = 0x00 - получается внутренняя подтяжка
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Я так уже пробовал. Вот у меня бегущий огонек сделан. так кнопка(переключение режима) срабатывает только на PB0.А мне надо, чтобы она срабатывала на любой порт pb.
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Не, ну что никто не знает в чем проблема? Просто я на этом зациклился уже.
Кнопка просто срабатывает с десятого раза..
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Разобрался немного. Кнопка срабатывает у меня только на том месте где заканчивается цикл. Возникает вопрос! Как тогда мне сделать чтобы по нажатию кнопки цикл прерывался, а не доходил до конца?
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

Использовать внешние прерывания INT0, INT1.
Открыл глаза
Сообщения: 43
Зарегистрирован: Пт мар 29, 2013 13:07:03

Сообщение MAndrey90 »

Пробовал вешать на них кнопку, читал про регистры, но внятно мало что понял. Можете хоть код примерный сделать?Пытался настроить этот порт, но у меня програ компилилась постоянно с ошибками, поэтому прошу вашей помощи.
Последний раз редактировалось MAndrey90 Сб май 11, 2013 15:19:54, всего редактировалось 1 раз.
Ответить

Вернуться в «AVR»