Обработка нажатия кнопки в AVR...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

BerZerK-ku писал(а):Ну при таком включении ничего и не будет ) Замените строчку в цикле на:

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

if ( (PIND & 0x1F) != 0x1F ) 
    PORTB = (1 << PORTB7);
else
    PORTB = 0;


а как надо включать чтоб было правильно? :oops:

перепаять как надо не проблема )
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

допаял резисторы на кнопки, и все равно не горит как надо

вот так:
Изображение
Вложения
ledline1.JPG
(235.23 КБ) 812 скачиваний
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

работает только так:

BerZerK-ku писал(а):Ну при таком включении ничего и не будет ) Замените строчку в цикле на:

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

if ( (PIND & 0x1F) != 0x1F ) 
    PORTB = (1 << PORTB7);
else
    PORTB = 0;



или так

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

  while(1)
  {
    PORTB = ~PIND;
  }
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

К схеме претензий нет, вполне рабочая, я имел ввиду что предыдущий пример не подходит под нее ) Резисторы в данном случае не есть необходимость, т.к. включены подтяжки в МК.
Если последний пример заработал, и по нажатию на любую из кнопок светодиод загорается, можно идти дальше. Теперь попробуйте переключать эффекты:

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

char ef = 0;
while(1)
{
    if ( !(PIND & (1 << PIND4)) )
    {
        ef = !ef;
    }
   
    if (ef)
        PORTB |= (1 << PORTB7);
    else
        PORTB ^= (1 << PORTB7);

    _delay_ms(1000);
}
Задержка формируется так:

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

// Тактовая частота
#define CPU_CLK_Hz 16000000   
// Задержка в мс
#define _delay_ms(x) __delay_cycles(x*(CPU_CLK_Hz/1000))
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):

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

// Тактовая частота
#define CPU_CLK_Hz 16000000
надо писать 16000000UL
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

Зачем? И так все работает :dont_know:
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):Зачем? И так все работает :dont_know:

PORTB.1 тоже работает кое где, но это не означает, что такая запись правильная. WinAVR, например, следуя стандарту, все числовые константы ПО УМОЛЧАНИЮ считает типа int, а значит запись 16000000 фактически превратится в 9216. поэтому указание суффикса UL обязательно. и уж во всяком случае одинаково сработает ВО ВСЕХ КОМПИЛЯТОРАХ без исключения.

BerZerK-ku, вы же великий знаток Си - неужели не знаете этих элементарных вещей?!
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

При чем тут WinAVR? В WinAVR вообще нет подобной встроенной функции, да и ВО ВСЕХ КОМПИЛЯТОРАХ вряд-ли найдется. Так какой смысл думать о переносимости, а особенно в такой программе?
В отличие от ваших возвеличиваний, я не употреблял в свою сторону "великий" и вроде никогда не говорил как надо делать, а всего-лишь как можно делать. Ну не люблю я правила, а особенно неписанные :)))
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):При чем тут WinAVR? В WinAVR вообще нет подобной встроенной функции, да и ВО ВСЕХ КОМПИЛЯТОРАХ вряд-ли найдется. Так какой смысл думать о переносимости?
В отличие от ваших возвеличиваний, я не употреблял в свою сторону "великий" и вроде никогда не говорил как надо делать, а всего-лишь как можно делать :)))

если у вас температура - пейте аспирин: о какой функции идет речь?! константу без суффикса вы указали при помощи обычного дефайна! при чем тут функция?! я про функцию даже слова не сказал. дефайн сделан с ошибкой. ну или, если вам так приятнее, то с упором на специфические особенности какого-то конкретного компилятора. а программа на Си, как известно, должна быть переносимой по определению, не так ли?

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

кстати, в WinAVR есть функции _delay_cycles() и подобные :)))
Последний раз редактировалось Мастер Ломастер Ср янв 18, 2012 10:51:13, всего редактировалось 1 раз.
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

:dont_know: Объясняю на пальцах: данная программа уже не переносима, ввиду использования внутренней функции IAR __delay_cycles(). Если мыслить по вашему, данная программа уже является ошибкой природы, т.к. не заработает в используемом вами WinAVR.
А для тех кто в танке, если вы проследите все вышесказанное, то разговор шел именно о использовании IAR. И код был приведен именно для этой среды.

В двух стандартных библиотеках delay.h и delay_basic.h подобного нет. Да и ни в одной из стандартных такого нет. Где же она распологается?
Последний раз редактировалось BerZerK-ku Ср янв 18, 2012 11:00:17, всего редактировалось 1 раз.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):А для тех кто в танке, если вы проследите все вышесказанное, то разговор шел именно о использовании IAR. И код был приведен именно для этой среды.

похоже, в танке именно вы... пора вылазить: правила описания констант в дефайнах - НЕ ЗАВИСЯТ ОТ КОМПИЛЯТОРА. правильные правила из стандарта, а не их вариации КОНКРЕТНОЙ РЕАЛИЗАЦИИ компилятора. если в танке можно смело ехать на красный свет, плюя на правила, это не означает, что проезд на красный свет - это правильно.

давайте советы правильные, и я вам ни слова не скажу.

P.S. я подправил свой пост - по поводу _delay_cycles(), перепрочтите и удивитесь :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

Может еще подскажите в какой из библиотек?
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

Извините что прерываю Вашу полемику )

почему вот такой код не работает?
вроде все правильно, а после первого нажатия кнопки, диод моргает и не реагирует ни на что...

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

int main( void )
{
  PORTB = 0xFF;
  DDRB = 0xFF;
 
  DDRD = 0x00;
  PORTD = 0x00;
 
  char ef = 0;
 
  while(1)
  {
    if ( !(PIND & (1 << PIND4)) )
    {
      ef++;
      if (ef > 2) ef = 0;
    }
   
    if (ef==2)
    {
      PORTB = 0;
      delay(200);
      PORTB = 1;
      delay(200);
    }
    if (ef==1)
      PORTB = 1;
    if (ef==0)
      PORTB = 0;
  }
  return 0;
}
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Обработка нажатия кнопки в AVR...

Сообщение BerZerK-ku »

Скорее всего происходит следующее:
При нажатии на кнопку, цикл с eff= 0, eff = 1 проскакивает практически мгновенно, включается eff = 2. Идет мигание. Вы нажимаете на кнопку и см. сначала. Шанс остановки не на eff= 2 есть, но очень мал. Необходимо увеличить период опроса кнопки, например добавить задержки в eff 0 и 1. Посмотрите пример выше, я там для исключения подобного поставил задержку 1с в конце цикла.
На практике обычно реализую опрос кнопок на таймере: после первого определения кнопки, следующее нажатие фиксирую где-то через 2 секунды и если кнопка до сих пор нажата, перехожу в ускоренный режим с фиксацией раз в 0.5с.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):Может еще подскажите в какой из библиотек?

а смысл? гуру учить - только себе проблем нажить :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

AR_AROV писал(а):почему вот такой код не работает?
как минимум потому, что вы не читали, как надо опрашивать кнопку - а я для вас подробно все описывал. категорически недопустимо работать с кнопкаи, опрашивая 1 раз пин порта! сколько раз еще надо повторить?!
битва с дураками проиграна, победители торжествуют. слава победителям!
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: Обработка нажатия кнопки в AVR...

Сообщение AR_AROV »

Мастер Ломастер писал(а):
AR_AROV писал(а):почему вот такой код не работает?
как минимум потому, что вы не читали, как надо опрашивать кнопку - а я для вас подробно все описывал. категорически недопустимо работать с кнопкаи, опрашивая 1 раз пин порта! сколько раз еще надо повторить?!


а сколько раз надо опрашивать? я делал так как вы писали, но у меня не получилось
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

я не увидел ни строчки кода, где бы вы делали и у вас не получилось. к тому же вам только что еще раз намекнул местный гуру, что цикл пролетает ОЧЕНЬ БЫСТРО и, может быть, у вас все и работает, но вы этого не успеваете замечать. поэтому перед тем, как делать очередной опрос кода кнопки надо дождаться, когда ее отпустят - ну, по ситуации, конечно.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Обработка нажатия кнопки в AVR...

Сообщение ploop »

категорически недопустимо работать с кнопкаи, опрашивая 1 раз пин порта!

Вполне допустимо, чтобы понять, как это работает.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Мастер Ломастер »

ploop писал(а):
категорически недопустимо работать с кнопкаи, опрашивая 1 раз пин порта!

Вполне допустимо, чтобы понять, как это работает.

ну, если чтобы убедиться, что так делать нельзя - согласен. понял, как это работает (плохо) и стал делать по-другому - вы это имели ввиду?
битва с дураками проиграна, победители торжествуют. слава победителям!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»