включение нагрузки 1 кнопкой без фиксации, на МК
-
wxwu
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Пн мар 11, 2013 22:53:45
- Откуда: Солнечный Магадан
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Да прошивка, я подумал в архиве hex под 200 мсек. Ещё проект хотел открыть в авр студии посмотреть какие порты под что назначены да чего то так и не понял как. Я не программист, нужда была в одном проекте поменять под свои нужды границы диапазонов да ещё некоторые параметры вот и поставил авр студию, но там на ассамблее был всего один файл с кодом, а тут ох как все это сложно для железячника
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
На будущее, в заголовочных файлах принято определять, что будет входом, что выходом. Я намеренно не приложил схему, хотел вас проверить.
МК ATTINY13A. Открываете даташит, и смотрите соответствие порта ножке МК.
В файле kbd_drv.h определение входа.
Определение временных задержек, подавление дребезга. В миллисекундах.
В файле proc_device.h определение выхода.
Определение задержки включения выхода. В миллисекундах.
Архив, скомпилированный под ваш запрос. Проект можно просимулировать в AVR-Studio. В папке есть файл для студии. one_key_one_out_dbg.aps
МК 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 КБ) 170 скачиваний
-
wxwu
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Пн мар 11, 2013 22:53:45
- Откуда: Солнечный Магадан
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Запустил в протеусе. Работает, но как-то наоборот и несразу. При старте ничего не происходит, далее если нажать кнопку, вторая нога МК, PB3 замыкается на землю ничего не происходит, при отпускании кнопки, на 5 ноге МК, PB0 появляется с задержкой высокий уровень, при нажатии разу становится низкий, при отпускании снова с задержкой высокий.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Доброго времени суток!
В теме несколько вариантов кода включения нагрузки по нажатию кнопки, а можно сделать чтобы при нажатии кнопки высокий уровень появлялся не сразу а с задержкой 0.2 сек а при отпускании сразу переключался на низкий.
В теме несколько вариантов кода включения нагрузки по нажатию кнопки, а можно сделать чтобы при нажатии кнопки высокий уровень появлялся не сразу а с задержкой 0.2 сек а при отпускании сразу переключался на низкий.
И что не так? После включения схема в состоянии ожидания нажатия кнопки. У входа кнопки активный уровень единица. Подаем единицу, через 230 мс (30 мс подавление дребезга контактов кнопки + 200 мс) на выходе будет единица. Отпускаем кнопку, через 30 мс (подавление дребезга) на выходе ноль, и схема опять в ждущем режиме (ждем нажатия кнопки).
И какая, спрашивается, сволочь, постоянно новичков заставляет протеусом пользоваться?
Добавлено after 13 minutes 34 seconds:
-
wxwu
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Пн мар 11, 2013 22:53:45
- Откуда: Солнечный Магадан
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Спасибо большое, разобрался) протеус глючит если порт резистором не подтянуть. Все работает
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Я так понимаю кнопку подключили к порту сразу? Это не протеус глючит ) Это он еще идеально эту ситуацию просимулировал, оставив порт в неопределенном состоянии. Как же МК поймет в каком состоянии будет порт, когда кнопка отжата, если фактически нога "в воздухе" повисает? Подтяжки нужны всегда к кнопкам. И лучше именно внешним резистором, а не внутренним в МК.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Я сразу понял, что у него пин не подтянуть. Интересно было, разберётся или нет.
Если вы можете представить схему с одной кнопкой и одним выходом, то способны удержать в уме и гораздо большие схемы. Представим схему микроконтроллер. Сдвиговые регистры 74hc165, 74hc595. У меня был проект, состав которого МК, 3 входных сдвиговых регистра, 2 выходных. 24 входа, 16 выходов. Символьный дисплей 20х4, матричная клавиатура 4х4. Несколько входов МК.
Весь этот проект был у меня в голове. Паял на макетной плате. Схема была нарисована только после того, как эта макетка отработала несколько дней на станке. И от начала до конца проект был отлажен и просимулирован в AVR-Studio. Скрипач протеус не нужен.
Если вы можете представить схему с одной кнопкой и одним выходом, то способны удержать в уме и гораздо большие схемы. Представим схему микроконтроллер. Сдвиговые регистры 74hc165, 74hc595. У меня был проект, состав которого МК, 3 входных сдвиговых регистра, 2 выходных. 24 входа, 16 выходов. Символьный дисплей 20х4, матричная клавиатура 4х4. Несколько входов МК.
Весь этот проект был у меня в голове. Паял на макетной плате. Схема была нарисована только после того, как эта макетка отработала несколько дней на станке. И от начала до конца проект был отлажен и просимулирован в AVR-Studio. Скрипач протеус не нужен.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Я сразу понял, что у него пин не подтянуть. Интересно было, разберётся или нет.
Скрипач протеус не нужен.
Скрипач протеус не нужен.
категорически не согласен: протеус очень сильно помогает! только это такой же точно инструмент, как и любой другой - им надо уметь пользоваться. даже молотком можно покалечиться, и при помощи станка ЧПУ не суметь заточить карандаш - проблема не в инструменте, а в "пользователе".
кому скрипач не нужен, тому просто медведь на ухо наступил
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Инструменты тоже разные бывают. Задача инструмента облегчать труд. Для меня протеус эту задачу не выполняет. Вот и все.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
так я и говорю: вы не умеете им пользоваться, вот и не облегчает. австралийскому аборигену дай экскаватор, разве он яму быстрее выкопает, чем своей привычной палкой-копалкой?Demiurg писал(а):Для меня протеус эту задачу не выполняет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- sergo80zxc
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Пт апр 04, 2014 09:34:08
- Откуда: Санкт-Петербург
Re: включение нагрузки 1 кнопкой без фиксации, на МК
что то не работает код
Код: Выделить всё
//тини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 кнопкой без фиксации, на МК
Если ты хочешь стать счастливым - будь им. Хочешь научиться программировать - создавай проекты.
Правило номер 1 - "В начале было слово" - нет. В начале был проект. С этого момента любая ваша программа, даже самая примитивная, кнопочку опросить, светодиодик зажечь - проект. Именно так. Не письку на заборе нарисовать, а Проект. Проектирование снизу вверх, начинаешь с мелочей и тонешь в них. Проектирование сверху вниз. Устройство и последующая декомпозиция на модули, до атомов. Разделяй и властвуй.
Резюме: Проект, проектирование. Проработка всех этапов, идем сверху (устройство (на самом деле есть еще один верхний уровень, взаимодействие и влияние вашего устройства)) вниз (примитивы).
Правило номер 2 - когда проработан проект, начинается планирование ваших дальнейших действий. И планомерное уничтожение пунктов плана. Анализ результатов на каждом этапе, пункте.
Не получается? Не торопитесь бежать за помощью. Есть пословица: танцевать от печки. На каком этапе перестало работать? После чего? Если потребуется, начните весь проект с самого начала, и на каждом этапе смотрите, где перестало работать.
Декомпозиция, анализ, синтез.
Правило номер 1 - "В начале было слово" - нет. В начале был проект. С этого момента любая ваша программа, даже самая примитивная, кнопочку опросить, светодиодик зажечь - проект. Именно так. Не письку на заборе нарисовать, а Проект. Проектирование снизу вверх, начинаешь с мелочей и тонешь в них. Проектирование сверху вниз. Устройство и последующая декомпозиция на модули, до атомов. Разделяй и властвуй.
Резюме: Проект, проектирование. Проработка всех этапов, идем сверху (устройство (на самом деле есть еще один верхний уровень, взаимодействие и влияние вашего устройства)) вниз (примитивы).
Правило номер 2 - когда проработан проект, начинается планирование ваших дальнейших действий. И планомерное уничтожение пунктов плана. Анализ результатов на каждом этапе, пункте.
Не получается? Не торопитесь бежать за помощью. Есть пословица: танцевать от печки. На каком этапе перестало работать? После чего? Если потребуется, начните весь проект с самого начала, и на каждом этапе смотрите, где перестало работать.
Декомпозиция, анализ, синтез.
- sergo80zxc
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Пт апр 04, 2014 09:34:08
- Откуда: Санкт-Петербург
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Demiurg работало без использования указателей ( на переменных аккумуляторах) , мне объяснили , что это не есть хорошо, надо на указателях, NStorm написал свой код, я его прогнал в железе и протеусе, светодиоды не переключаются, нашел информацию по указателям вроде все правильно, в функции принимаем с и d как указатели, при вызове передаем адреса переменных i, k,m, n
глаза боятся, а руки что то не делают))
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: включение нагрузки 1 кнопкой без фиксации, на МК
1 - Забудьте ассемблерные привычки.
2 - Вы пишете программы для космических агрегатов? Нет? Вот и не особо слушайте тех, кто запрещает вам использовать указатели.
2 - Вы пишете программы для космических агрегатов? Нет? Вот и не особо слушайте тех, кто запрещает вам использовать указатели.
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Покажите вашу реализацию программных таймеров. Здесь моя реализация.
Мне особо точные задержки не нужны, по этому сделал такой http://we.easyelectronics.ru/Soft/samyy ... aymer.html
Re: включение нагрузки 1 кнопкой без фиксации, на МК
sergo80zxc, я посмотрю что не так может быть. Как время будет. С виду всё норм вроде. А что, до того как появились указатели всё работало?
- sergo80zxc
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Пт апр 04, 2014 09:34:08
- Откуда: Санкт-Петербург
Re: включение нагрузки 1 кнопкой без фиксации, на МК
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 кнопкой без фиксации, на МК
Вы на меня обиделись, к моим советам не прислушались. Также вы не стали слушать советы других.
Выше, на этой странице я выложил рабочий пример. Не поленитесь, скачайте, посмотрите.
Ваш код сложный, сложнопереносимый, сложноредактируемый. Магические числа, переменные, пины МК не определены. Вырвиглазный.
Вы предпочли оскорбиться, включить бесполезную гордость и пойти своим путем. Вперёд. С песней. Флаг вам в руки. Продолжайте морозить уши назло бабушке. Отписываюсь. Ваш ник запомню.
Выше, на этой странице я выложил рабочий пример. Не поленитесь, скачайте, посмотрите.
Ваш код сложный, сложнопереносимый, сложноредактируемый. Магические числа, переменные, пины МК не определены. Вырвиглазный.
Вы предпочли оскорбиться, включить бесполезную гордость и пойти своим путем. Вперёд. С песней. Флаг вам в руки. Продолжайте морозить уши назло бабушке. Отписываюсь. Ваш ник запомню.
- sergo80zxc
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Пт апр 04, 2014 09:34:08
- Откуда: Санкт-Петербург
Re: включение нагрузки 1 кнопкой без фиксации, на МК
Demiurg, я просто хотел разобраться для начала с той версией кода так как сам ее написал) а потом перейти к другим вариантам решений, а ваш метод я обязательно поизучаю, и авр хорошие мысли подкинул.
глаза боятся, а руки что то не делают))
Re: включение нагрузки 1 кнопкой без фиксации, на МК
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); //вызываем процедуру обработки кнопки
}