Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

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

Вт янв 17, 2012 10:10:42

BerZerK-ku писал(а):Ну при таком включении ничего и не будет ) Замените строчку в цикле на:
Код:
if ( (PIND & 0x1F) != 0x1F )
    PORTB = (1 << PORTB7);
else
    PORTB = 0;


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

перепаять как надо не проблема )

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

Вт янв 17, 2012 22:31:22

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

вот так:
Изображение
Вложения
ledline1.JPG
(235.23 KiB) Скачиваний: 751

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

Вт янв 17, 2012 23:10:15

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

BerZerK-ku писал(а):Ну при таком включении ничего и не будет ) Замените строчку в цикле на:
Код:
if ( (PIND & 0x1F) != 0x1F )
    PORTB = (1 << PORTB7);
else
    PORTB = 0;



или так
Код:
  while(1)
  {
    PORTB = ~PIND;
  }

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

Ср янв 18, 2012 05:10:25

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

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

Ср янв 18, 2012 06:27:29

BerZerK-ku писал(а):
Код:
// Тактовая частота
#define CPU_CLK_Hz 16000000
надо писать 16000000UL

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

Ср янв 18, 2012 07:21:18

Зачем? И так все работает :dont_know:

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

Ср янв 18, 2012 09:47:32

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

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

BerZerK-ku, вы же великий знаток Си - неужели не знаете этих элементарных вещей?!

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

Ср янв 18, 2012 10:32:30

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

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

Ср янв 18, 2012 10:38:38

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

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

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

кстати, в WinAVR есть функции _delay_cycles() и подобные :)))
Последний раз редактировалось Мастер Ломастер Ср янв 18, 2012 10:51:13, всего редактировалось 1 раз.

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

Ср янв 18, 2012 10:48:21

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

В двух стандартных библиотеках delay.h и delay_basic.h подобного нет. Да и ни в одной из стандартных такого нет. Где же она распологается?
Последний раз редактировалось BerZerK-ku Ср янв 18, 2012 11:00:17, всего редактировалось 1 раз.

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

Ср янв 18, 2012 10:56:15

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

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

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

P.S. я подправил свой пост - по поводу _delay_cycles(), перепрочтите и удивитесь :)))

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

Ср янв 18, 2012 11:02:08

Может еще подскажите в какой из библиотек?

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

Ср янв 18, 2012 11:11:34

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

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

Код:
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;
}

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

Ср янв 18, 2012 11:18:45

Скорее всего происходит следующее:
При нажатии на кнопку, цикл с eff= 0, eff = 1 проскакивает практически мгновенно, включается eff = 2. Идет мигание. Вы нажимаете на кнопку и см. сначала. Шанс остановки не на eff= 2 есть, но очень мал. Необходимо увеличить период опроса кнопки, например добавить задержки в eff 0 и 1. Посмотрите пример выше, я там для исключения подобного поставил задержку 1с в конце цикла.
На практике обычно реализую опрос кнопок на таймере: после первого определения кнопки, следующее нажатие фиксирую где-то через 2 секунды и если кнопка до сих пор нажата, перехожу в ускоренный режим с фиксацией раз в 0.5с.

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

Ср янв 18, 2012 11:24:11

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

а смысл? гуру учить - только себе проблем нажить :)))

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

Ср янв 18, 2012 11:28:03

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

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

Ср янв 18, 2012 11:29:45

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


а сколько раз надо опрашивать? я делал так как вы писали, но у меня не получилось

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

Ср янв 18, 2012 11:33:11

я не увидел ни строчки кода, где бы вы делали и у вас не получилось. к тому же вам только что еще раз намекнул местный гуру, что цикл пролетает ОЧЕНЬ БЫСТРО и, может быть, у вас все и работает, но вы этого не успеваете замечать. поэтому перед тем, как делать очередной опрос кода кнопки надо дождаться, когда ее отпустят - ну, по ситуации, конечно.

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

Ср янв 18, 2012 11:36:46

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

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

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

Ср янв 18, 2012 11:39:21

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

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

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