включение нагрузки 1 кнопкой без фиксации, на МК

Обсуждаем контроллеры компании Atmel.
wxwu
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 11, 2013 22:53:45
Откуда: Солнечный Магадан

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение wxwu »

Да прошивка, я подумал в архиве hex под 200 мсек. Ещё проект хотел открыть в авр студии посмотреть какие порты под что назначены да чего то так и не понял как. Я не программист, нужда была в одном проекте поменять под свои нужды границы диапазонов да ещё некоторые параметры вот и поставил авр студию, но там на ассамблее был всего один файл с кодом, а тут ох как все это сложно для железячника
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

На будущее, в заголовочных файлах принято определять, что будет входом, что выходом. Я намеренно не приложил схему, хотел вас проверить.

МК ATTINY13A. Открываете даташит, и смотрите соответствие порта ножке МК.

В файле kbd_drv.h определение входа.

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

//==================
#define KEY_PIN PINB
#define KEY     3
//==================


Определение временных задержек, подавление дребезга. В миллисекундах.

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

//==================
#ifdef __PROJECT_MODE_WORK__
#define DEBOUNCE_DELAY 30
#endif

#ifdef __PROJECT_MODE_DEBUG__
#define DEBOUNCE_DELAY 3
#endif
//==================


В файле proc_device.h определение выхода.

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

//==================
#define OUT_1_DDR  DDRB
#define OUT_1_PORT PORTB

#define OUT_1 0
//==================


Определение задержки включения выхода. В миллисекундах.

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

//==================
#ifdef __PROJECT_MODE_WORK__
#define TIME_1 200
#endif

#ifdef __PROJECT_MODE_DEBUG__
#define TIME_1 3
#endif
//==================


Архив, скомпилированный под ваш запрос. Проект можно просимулировать в AVR-Studio. В папке есть файл для студии. one_key_one_out_dbg.aps
Вложения
One_Key_One_Out.rar
(313.13 КБ) 171 скачивание
wxwu
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 11, 2013 22:53:45
Откуда: Солнечный Магадан

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение wxwu »

Запустил в протеусе. Работает, но как-то наоборот и несразу. При старте ничего не происходит, далее если нажать кнопку, вторая нога МК, PB3 замыкается на землю ничего не происходит, при отпускании кнопки, на 5 ноге МК, PB0 появляется с задержкой высокий уровень, при нажатии разу становится низкий, при отпускании снова с задержкой высокий.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

[uquote="wxwu",url="/forum/viewtopic.php?p=3834247#p3834247"]Доброго времени суток!
В теме несколько вариантов кода включения нагрузки по нажатию кнопки, а можно сделать чтобы при нажатии кнопки высокий уровень появлялся не сразу а с задержкой 0.2 сек а при отпускании сразу переключался на низкий.[/uquote]
И что не так? После включения схема в состоянии ожидания нажатия кнопки. У входа кнопки активный уровень единица. Подаем единицу, через 230 мс (30 мс подавление дребезга контактов кнопки + 200 мс) на выходе будет единица. Отпускаем кнопку, через 30 мс (подавление дребезга) на выходе ноль, и схема опять в ждущем режиме (ждем нажатия кнопки).
И какая, спрашивается, сволочь, постоянно новичков заставляет протеусом пользоваться?

Добавлено after 13 minutes 34 seconds:
Изображение Изображение Изображение Изображение
wxwu
Встал на лапы
Сообщения: 101
Зарегистрирован: Пн мар 11, 2013 22:53:45
Откуда: Солнечный Магадан

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение wxwu »

Спасибо большое, разобрался) протеус глючит если порт резистором не подтянуть. Все работает
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение NStorm »

Я так понимаю кнопку подключили к порту сразу? Это не протеус глючит ) Это он еще идеально эту ситуацию просимулировал, оставив порт в неопределенном состоянии. Как же МК поймет в каком состоянии будет порт, когда кнопка отжата, если фактически нога "в воздухе" повисает? Подтяжки нужны всегда к кнопкам. И лучше именно внешним резистором, а не внутренним в МК.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

Я сразу понял, что у него пин не подтянуть. Интересно было, разберётся или нет.

Если вы можете представить схему с одной кнопкой и одним выходом, то способны удержать в уме и гораздо большие схемы. Представим схему микроконтроллер. Сдвиговые регистры 74hc165, 74hc595. У меня был проект, состав которого МК, 3 входных сдвиговых регистра, 2 выходных. 24 входа, 16 выходов. Символьный дисплей 20х4, матричная клавиатура 4х4. Несколько входов МК.

Весь этот проект был у меня в голове. Паял на макетной плате. Схема была нарисована только после того, как эта макетка отработала несколько дней на станке. И от начала до конца проект был отлажен и просимулирован в AVR-Studio. Скрипач протеус не нужен.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение ARV »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3834776#p3834776"]Я сразу понял, что у него пин не подтянуть. Интересно было, разберётся или нет.
Скрипач протеус не нужен.[/uquote]
категорически не согласен: протеус очень сильно помогает! только это такой же точно инструмент, как и любой другой - им надо уметь пользоваться. даже молотком можно покалечиться, и при помощи станка ЧПУ не суметь заточить карандаш - проблема не в инструменте, а в "пользователе".

кому скрипач не нужен, тому просто медведь на ухо наступил :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

Инструменты тоже разные бывают. Задача инструмента облегчать труд. Для меня протеус эту задачу не выполняет. Вот и все.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение sergo80zxc »

что то не работает код

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

//тини13
//
// НЕ РАБОТАЕТ,  надо разобратся
//
//обработка кнопки выведена в процедуру (button_processing), обработка кнопки повесили на таймер, как срабатывает таймер вызывается
//обработчик прерывания, который в свою очередь вызывает процедуру обработки кнопки (button_processing). в процедуре используются глобальные
//переменные, объявленые перед функцией майн как (volatile) (если переменные оббъявить локальными то каждый раз при выходе из функции
//они будут обнулятся)
//биты используемые в процедуре обзавем через дефайны  своими именами( дабы не править потом сам код при изменении битов или всего мк)
//
//

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1200000 UL

#define KEY1 PB0      // пин В0 теперь зовется key1
#define LED1 PB1      // пин В1 порта В зовется LED1

#define KEY2 PB4     // пин В4 теперь зовется key2
#define LED2 PB3     // пин В3 порта В зовется LED2




volatile unsigned char i= 0, k= 0,m= 0, n= 0; //объявляем восьмибитные переменные счеткики.

void static inline button_processing(unsigned char key, unsigned char led, volatile unsigned char *c, volatile unsigned char *d)  // объявим процедуру (button_processing),
{
                                     

  if (~PINB & (1 << key))              // Если нулевой разряд порта В сброшен (т.е. кнопка нажата, на пине лог. 0) выполняется КОД1.
  {
    if (*c < 254)                       // КОД1. И ЕСЛИ i меньше 254, то увеличиваем i на 1 (i++) (это условие от переполнения счетчика i )
   {
      *c++;
    }                                  // то есть счетчик может доходить до 254. (i < 254) то есть  253 максимальное число возможное в
  }                                    // этом условии и постинкремент +1 = 254

   if (*c >= 5)                        // если счетчик  равен 5 то,  кнопка нажата  была при всех опросах, то ловим отпускание
  {
      if (PINB & (1 << key))          // ---------- Проверка разряда на наличие логической единицы (установки) с if
     {                                // Если 0 разряд порта  PВ установлен (единица), то выполняется Код1, если нет , то Код2
          if (*d < 254)                // И ЕСЛИ k меньше 254, то увеличиваем k на 1 (i++) (это условие от переполнения счетчика k )
         {
             *d++;                     // (Код1) пин PB0 установлен(кнопка не нажата) прибавим 1 к переменной счетчику
             if (*d > 5)              // если насчитали больше 5 не нажатых состояний, то считаем , что кнопку отпустили
             {
               PORTB ^= (1 << led);   // инвертируем состояние пина PB1
               *c = 0;                 // обнуляем счетчик
               *d = 0;                 // обнуляем счетчик
             }
         }
     }
  }
}


//----------

int main(void)
{
  DDRB = ~((1 << KEY1) | (1 << KEY2));     // бит РВ0 конфигурируем как вход
  PORTB = (1 << KEY1) | (1 << KEY2);    // входы подтянем

  TIMSK0 = 0b00000010;   // бит РВ1(TOIE0) устанавливаем в 1, разрешения прерывания по переполнению таймера /счетчика Т0
  TCCR0A = 0b00000000;   // биты РВ0(WGM00) и РВ1(WGM01) сбрасываем в 0,  настройка режима Normal
  TCCR0B = 0b00000011;   // настраиваем предделитель на 64 (биты  CS02=0,CS01=1,CS00=1),бит В3(WGM02) сбрасываем в 0,режим Normal
  GTCCR = 0b00000001;    // бит РВ0(PSR10) устанавливаем в 1, Сброс предделителя TO (сбрасываем пред. в конце настроек)

  sei();                 // Разрешить прерывания

    while (1)
   {                     // Основной цикл программы, он пуст, так как вся работа в прерывании
   }

}

//----------

ISR(TIM0_OVF_vect)                     // обработчик прерывания по таймеру Т0
{
   button_processing (KEY1,LED1,&i,&k);                //вызываем процедуру обработки кнопки
   button_processing (KEY2,LED2,&m,&n);              //вызываем процедуру обработки кнопки
}

глаза боятся, а руки что то не делают))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

Если ты хочешь стать счастливым - будь им. Хочешь научиться программировать - создавай проекты.
Правило номер 1 - "В начале было слово" - нет. В начале был проект. С этого момента любая ваша программа, даже самая примитивная, кнопочку опросить, светодиодик зажечь - проект. Именно так. Не письку на заборе нарисовать, а Проект. Проектирование снизу вверх, начинаешь с мелочей и тонешь в них. Проектирование сверху вниз. Устройство и последующая декомпозиция на модули, до атомов. Разделяй и властвуй.
Резюме: Проект, проектирование. Проработка всех этапов, идем сверху (устройство (на самом деле есть еще один верхний уровень, взаимодействие и влияние вашего устройства)) вниз (примитивы).
Правило номер 2 - когда проработан проект, начинается планирование ваших дальнейших действий. И планомерное уничтожение пунктов плана. Анализ результатов на каждом этапе, пункте.
Не получается? Не торопитесь бежать за помощью. Есть пословица: танцевать от печки. На каком этапе перестало работать? После чего? Если потребуется, начните весь проект с самого начала, и на каждом этапе смотрите, где перестало работать.

Декомпозиция, анализ, синтез.
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение sergo80zxc »

Demiurg работало без использования указателей ( на переменных аккумуляторах) , мне объяснили , что это не есть хорошо, надо на указателях, NStorm написал свой код, я его прогнал в железе и протеусе, светодиоды не переключаются, нашел информацию по указателям вроде все правильно, в функции принимаем с и d как указатели, при вызове передаем адреса переменных i, k,m, n
глаза боятся, а руки что то не делают))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

1 - Забудьте ассемблерные привычки.
2 - Вы пишете программы для космических агрегатов? Нет? Вот и не особо слушайте тех, кто запрещает вам использовать указатели.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение pokk »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3833594#p3833594"]Покажите вашу реализацию программных таймеров. Здесь моя реализация.[/uquote]
Мне особо точные задержки не нужны, по этому сделал такой http://we.easyelectronics.ru/Soft/samyy ... aymer.html
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение NStorm »

sergo80zxc, я посмотрю что не так может быть. Как время будет. С виду всё норм вроде. А что, до того как появились указатели всё работало?
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение sergo80zxc »

NStorm, такая реализация работает


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

//
//обработка кнопки выведена в процедуру (button_processing), обработка кнопки повесили на таймер, как срабатывает таймер вызывается
//обработчик прерывания, который в свою очередь вызывает процедуру обработки кнопки (button_processing). в процедуре используются глобальные
//переменные, объявленые перед функцией майн как (volatile) (если переменные оббъявить локальными то каждый раз при выходе из функции
//они будут обнулятся)
//биты используемые в процедуре обзавем через дефайны  своими именами( дабы не править потом сам код при изменении битов или всего мк)
//
//прога работает, но на радиокоте ругают геморно понавешал кода)

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1200000 UL

#define KEY1 PB0      // пин В0 теперь зовется key1
#define LED1 PB1      // пин В1 порта В зовется LED1

#define KEY2 PB4     // пин В4 теперь зовется key2
#define LED2 PB3     // пин В3 порта В зовется LED2




volatile uint8_t i= 0, k= 0,m= 0, n= 0; //объявляем восьмибитные переменные счеткики.

volatile uint8_t x= 0, y= 0;            //объявляем восьмибитные переменные. промежуточные аккумуляторы

//----------

void button_processing(uint8_t key,uint8_t led,uint8_t c,uint8_t d )  // объявим процедуру (button_processing),
{                                                                                           
                                     //обработчик кнопки. Следом за именем функции в скобках, пишут типы и количество аргументов
                                     //(параметров) функции. Т.е. значения которые передаются в функцию .
                                     // а---отслеживаемый пин, b---управляемый пин, с---счетчик нажатой кнопки,d---счетчик отпущеной кнопки

  if (~PINB & (1 << key))              // Если нулевой разряд порта В сброшен (т.е. кнопка нажата, на пине лог. 0) выполняется КОД1.
  {
    if (c < 254)                       // КОД1. И ЕСЛИ i меньше 254, то увеличиваем i на 1 (i++) (это условие от переполнения счетчика i )
   {
      c++;
    }                                  // то есть счетчик может доходить до 254. (i < 254) то есть  253 максимальное число возможное в
  }                                    // этом условии и постинкремент +1 = 254




   if (c >= 5)                        // если счетчик  равен 5 то,  кнопка нажата  была при всех опросах, то ловим отпускание
  {
      if (PINB & (1 << key))          // ---------- Проверка разряда на наличие логической единицы (установки) с if
     {                                // Если 0 разряд порта  PВ установлен (единица), то выполняется Код1, если нет , то Код2

          if (d < 254)                // И ЕСЛИ k меньше 254, то увеличиваем k на 1 (i++) (это условие от переполнения счетчика k )
         {
             d++;                     // (Код1) пин PB0 установлен(кнопка не нажата) прибавим 1 к переменной счетчику 
                  
              if (d > 5)              // если насчитали больше 5 не нажатых состояний, то считаем , что кнопку отпустили
            {

               PORTB ^= (1 << led);   // инвертируем состояние пина PB1
               c = 0;                 // обнуляем счетчик
               d = 0;                 // обнуляем счетчик
             }
         }
     }
  }

               x = c;                 // считываем значение счетчика (c) и заносим его в аккумулятор (x)
               y = d;                 // считываем значение счетчика (d) и заносим его в аккумулятор (y)



}


//----------

int main(void)
{
  DDRB = ~((1 << KEY1) | (1 << KEY2));     // бит РВ0 и РВ4 конфигурируем как вход
  PORTB = (1 << KEY1) | (1 << KEY2);    // входы подтянем

  TIMSK0 = 0b00000010;   // бит РВ1(TOIE0) устанавливаем в 1, разрешения прерывания по переполнению таймера /счетчика Т0
  TCCR0A = 0b00000000;   // биты РВ0(WGM00) и РВ1(WGM01) сбрасываем в 0,  настройка режима Normal
  TCCR0B = 0b00000011;   // настраиваем предделитель на 64 (биты  CS02=0,CS01=1,CS00=1),бит В3(WGM02) сбрасываем в 0,режим Normal
  GTCCR = 0b00000001;    // бит РВ0(PSR10) устанавливаем в 1, Сброс предделителя TO (сбрасываем пред. в конце настроек)

  sei();                 // Разрешить прерывания

    while (1)
   {                     // Основной цикл программы, он пуст, так как вся работа в прерывании
   }

}

//----------

ISR(TIM0_OVF_vect)                     // обработчик прерывания по таймеру Т0
{                                       
   button_processing (KEY1,LED1,i,k);                //вызываем процедуру обработки кнопки
     
               i = x;                 // пишем значения из аккумуляторов обратно в глобальные переменные
               k = y;                 // иначе при выходе из функции обработаные данные сотрутся

   button_processing (KEY2,LED2,m,n);              //вызываем процедуру обработки кнопки

               m = x;                 // пишем значения из аккумуляторов обратно в глобальные переменные
               n = y;                 // иначе при выходе из функции обработаные данные сотрутся
}
глаза боятся, а руки что то не делают))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение Demiurg »

Вы на меня обиделись, к моим советам не прислушались. Также вы не стали слушать советы других.
Выше, на этой странице я выложил рабочий пример. Не поленитесь, скачайте, посмотрите.
Ваш код сложный, сложнопереносимый, сложноредактируемый. Магические числа, переменные, пины МК не определены. Вырвиглазный.
Вы предпочли оскорбиться, включить бесполезную гордость и пойти своим путем. Вперёд. С песней. Флаг вам в руки. Продолжайте морозить уши назло бабушке. Отписываюсь. Ваш ник запомню.
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение sergo80zxc »

Demiurg, я просто хотел разобраться для начала с той версией кода так как сам ее написал) а потом перейти к другим вариантам решений, а ваш метод я обязательно поизучаю, и авр хорошие мысли подкинул.
глаза боятся, а руки что то не делают))
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: включение нагрузки 1 кнопкой без фиксации, на МК

Сообщение NStorm »

sergo80zxc, посмотрел код, увидел где я ошибся. Там где операции ++, надо *var в скобки заключать. Иначе увеличивается не переменная, а адрес указателя.
Попробуйте так:

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

//обработка кнопки выведена в процедуру (button_processing), обработка кнопки повесили на таймер, как срабатывает таймер вызывается
//обработчик прерывания, который в свою очередь вызывает процедуру обработки кнопки (button_processing). в процедуре используются глобальные
//переменные, объявленые перед функцией майн как (volatile) (если переменные оббъявить локальными то каждый раз при выходе из функции
//они будут обнулятся)
//биты используемые в процедуре обзавем через дефайны  своими именами( дабы не править потом сам код при изменении битов или всего мк)
//
//прога работает, но на радиокоте ругают геморно понавешал кода)

#include <avr/io.h>
#include <avr/interrupt.h>
// #define F_CPU 1200000 UL

#define KEY1 PB0      // пин В0 теперь зовется key1
#define LED1 PB1      // пин В1 порта В зовется LED1

#define KEY2 PB4     // пин В4 теперь зовется key2
#define LED2 PB3     // пин В3 порта В зовется LED2

volatile uint8_t i, k, m, n; //объявляем восьмибитные переменные счеткики.

//----------

void button_processing(uint8_t key, uint8_t led, volatile uint8_t *c, volatile uint8_t *d)  // объявим процедуру (button_processing),
{                                                                                           
                                     //обработчик кнопки. Следом за именем функции в скобках, пишут типы и количество аргументов
                                     //(параметров) функции. Т.е. значения которые передаются в функцию .
                                     // а---отслеживаемый пин, b---управляемый пин, с---счетчик нажатой кнопки,d---счетчик отпущеной кнопки

  if (~PINB & (1 << key))              // Если нулевой разряд порта В сброшен (т.е. кнопка нажата, на пине лог. 0) выполняется КОД1.
  {
    if (*c < 254)                       // КОД1. И ЕСЛИ i меньше 254, то увеличиваем i на 1 (i++) (это условие от переполнения счетчика i )
   {
      (*c)++;
    }                                  // то есть счетчик может доходить до 254. (i < 254) то есть  253 максимальное число возможное в
  }                                    // этом условии и постинкремент +1 = 254




   if (*c >= 5)                        // если счетчик  равен 5 то,  кнопка нажата  была при всех опросах, то ловим отпускание
  {
      if (PINB & (1 << key))          // ---------- Проверка разряда на наличие логической единицы (установки) с if
     {                                // Если 0 разряд порта  PВ установлен (единица), то выполняется Код1, если нет , то Код2

          if (*d < 254)                // И ЕСЛИ k меньше 254, то увеличиваем k на 1 (i++) (это условие от переполнения счетчика k )
         {
             (*d)++;                     // (Код1) пин PB0 установлен(кнопка не нажата) прибавим 1 к переменной счетчику
                 
              if (*d > 5)              // если насчитали больше 5 не нажатых состояний, то считаем , что кнопку отпустили
            {

               PORTB ^= (1 << led);   // инвертируем состояние пина PB1
               *c = 0;                 // обнуляем счетчик
               *d = 0;                 // обнуляем счетчик
             }
         }
     }
  }
}


//----------

int main(void)
{
  DDRB = ~((1 << KEY1) | (1 << KEY2));     // бит РВ0 и РВ4 конфигурируем как вход
  PORTB = (1 << KEY1) | (1 << KEY2);    // входы подтянем

  TIMSK0 = 0b00000010;   // бит РВ1(TOIE0) устанавливаем в 1, разрешения прерывания по переполнению таймера /счетчика Т0
  TCCR0A = 0b00000000;   // биты РВ0(WGM00) и РВ1(WGM01) сбрасываем в 0,  настройка режима Normal
  TCCR0B = 0b00000011;   // настраиваем предделитель на 64 (биты  CS02=0,CS01=1,CS00=1),бит В3(WGM02) сбрасываем в 0,режим Normal
  GTCCR = 0b00000001;    // бит РВ0(PSR10) устанавливаем в 1, Сброс предделителя TO (сбрасываем пред. в конце настроек)

  sei();                 // Разрешить прерывания

    while (1)
   {                     // Основной цикл программы, он пуст, так как вся работа в прерывании
   }

}

//----------

ISR(TIM0_OVF_vect)                     // обработчик прерывания по таймеру Т0
{                                       
   button_processing (KEY1,LED1,&i,&k);                //вызываем процедуру обработки кнопки
   button_processing (KEY2,LED2,&m,&n);              //вызываем процедуру обработки кнопки
}
Ответить

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