реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос новичка по C
Jagupop
сообщение May 17 2007, 18:10
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Тренируюсь на ATTINY 2313. Повесил кнопку на PD0, другой конец - на землю. Как проверить ее нажатие? Я сделал так:

while(PIND == 0xFF)

перед этим, естественно, было в программе:

DDRD = 0x00;
PORTD = 0xFF;

но реакции на нажатие кнопки нет. Поставьте на путь истинный!!

Спасибо.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 17 2007, 18:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Зачем весь порт если надо тебе один бит?

Примерно так
if((PING & (1<<SYNH_START_BIT))!=0) TekTime=0; // Инициализация TekTime для SLAVE
if((PINE & (1<<SYNH_READY))==0){ // Инициализация кадра для SLAVE
Go to the top of the page
 
+Quote Post
defunct
сообщение May 17 2007, 18:45
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



А какой реакции Вы ждете?

давайте по-другому.
Давайте подключим кнопку к PD0, а к PB0 - светодиод (тоже между пином порта и землей, ну резистор не забудем есстессно).

пишем
Код
int main(void)
{
   DDRD = 0x00;
   PORTD = (1 << PD0);

   DDRB = (1 << PB0);
   for(;;)
   {
      // в цикле читаем значене кнопки, инвертируем и выводим на светодиод
      if ( PIND & (1 <<  PD0))  // кнопка отжата?
          PORTB &= ~(1 << PB0); // потушить светодиод
      else // нажата?
          PORTB |= (1 << PB0); // зажечь
   }
}


Если удерживать кнопку нажатой - светодиод будет светиться.
Go to the top of the page
 
+Quote Post
wodya
сообщение May 17 2007, 18:50
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 27-03-07
Пользователь №: 26 549



Чего-то я про PINE и PING не понял

Я бы написал так

void PressKey(void)
{
// Нажатие кнопки
}

void main(void)
{
PORTD = 0x01;
DDRD = 0x00;
while(1)
{
if((PIND&0x01) == 0) PressKey();
}
}

Хотя, в реальном приложении это неправильно. Лучше использовать INT0 для детектирования нажатия. Но это если нужно однократное нажатие. Если нужно например инкрементировать величину, то лучше использовать алгоритм антидребезга.
Go to the top of the page
 
+Quote Post
Jagupop
сообщение May 17 2007, 20:13
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Спасибо! Буду продолжать "играться". А вот насчет алгоритма антидребезга - можно попоробнее? Ужасно интересно!!!
Go to the top of the page
 
+Quote Post
smk
сообщение May 17 2007, 20:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Алгоритм антидребезга подразумевает выдержку после нажатия кнопки. Так чтобы обеспечивался принцип: одно нажатие - одно действие. Так, например, если не противостоять дребезгу, то при простом подсчете нажатий можно получить намного большее число срабатываний.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
CSB
сообщение May 17 2007, 21:08
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



устранения дребезга см. тут 1
см. тут 2
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 14:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016