включение нагрузки 1 кнопкой без фиксации, на МК
Да прошивка, я подумал в архиве hex под 200 мсек. Ещё проект хотел открыть в авр студии посмотреть какие порты под что назначены да чего то так и не понял как. Я не программист, нужда была в одном проекте поменять под свои нужды границы диапазонов да ещё некоторые параметры вот и поставил авр студию, но там на ассамблее был всего один файл с кодом, а тут ох как все это сложно для железячника
- Реклама
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
На будущее, в заголовочных файлах принято определять, что будет входом, что выходом. Я намеренно не приложил схему, хотел вас проверить.
МК 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
//==================
Код: Выделить всё
//==================
#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
//==================
- Вложения
-
- One_Key_One_Out.rar
- (313.13 КБ) 172 скачивания
Запустил в протеусе. Работает, но как-то наоборот и несразу. При старте ничего не происходит, далее если нажать кнопку, вторая нога МК, PB3 замыкается на землю ничего не происходит, при отпускании кнопки, на 5 ноге МК, PB0 появляется с задержкой высокий уровень, при нажатии разу становится низкий, при отпускании снова с задержкой высокий.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
[uquote="wxwu",url="/forum/viewtopic.php?p=3834247#p3834247"]Доброго времени суток!
В теме несколько вариантов кода включения нагрузки по нажатию кнопки, а можно сделать чтобы при нажатии кнопки высокий уровень появлялся не сразу а с задержкой 0.2 сек а при отпускании сразу переключался на низкий.[/uquote]
И что не так? После включения схема в состоянии ожидания нажатия кнопки. У входа кнопки активный уровень единица. Подаем единицу, через 230 мс (30 мс подавление дребезга контактов кнопки + 200 мс) на выходе будет единица. Отпускаем кнопку, через 30 мс (подавление дребезга) на выходе ноль, и схема опять в ждущем режиме (ждем нажатия кнопки).
И какая, спрашивается, сволочь, постоянно новичков заставляет протеусом пользоваться?
Добавлено after 13 minutes 34 seconds:

В теме несколько вариантов кода включения нагрузки по нажатию кнопки, а можно сделать чтобы при нажатии кнопки высокий уровень появлялся не сразу а с задержкой 0.2 сек а при отпускании сразу переключался на низкий.[/uquote]
И что не так? После включения схема в состоянии ожидания нажатия кнопки. У входа кнопки активный уровень единица. Подаем единицу, через 230 мс (30 мс подавление дребезга контактов кнопки + 200 мс) на выходе будет единица. Отпускаем кнопку, через 30 мс (подавление дребезга) на выходе ноль, и схема опять в ждущем режиме (ждем нажатия кнопки).
И какая, спрашивается, сволочь, постоянно новичков заставляет протеусом пользоваться?
Добавлено after 13 minutes 34 seconds:
Спасибо большое, разобрался) протеус глючит если порт резистором не подтянуть. Все работает
- Реклама
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Я так понимаю кнопку подключили к порту сразу? Это не протеус глючит ) Это он еще идеально эту ситуацию просимулировал, оставив порт в неопределенном состоянии. Как же МК поймет в каком состоянии будет порт, когда кнопка отжата, если фактически нога "в воздухе" повисает? Подтяжки нужны всегда к кнопкам. И лучше именно внешним резистором, а не внутренним в МК.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Я сразу понял, что у него пин не подтянуть. Интересно было, разберётся или нет.
Если вы можете представить схему с одной кнопкой и одним выходом, то способны удержать в уме и гораздо большие схемы. Представим схему микроконтроллер. Сдвиговые регистры 74hc165, 74hc595. У меня был проект, состав которого МК, 3 входных сдвиговых регистра, 2 выходных. 24 входа, 16 выходов. Символьный дисплей 20х4, матричная клавиатура 4х4. Несколько входов МК.
Весь этот проект был у меня в голове. Паял на макетной плате. Схема была нарисована только после того, как эта макетка отработала несколько дней на станке. И от начала до конца проект был отлажен и просимулирован в AVR-Studio. Скрипач протеус не нужен.
Если вы можете представить схему с одной кнопкой и одним выходом, то способны удержать в уме и гораздо большие схемы. Представим схему микроконтроллер. Сдвиговые регистры 74hc165, 74hc595. У меня был проект, состав которого МК, 3 входных сдвиговых регистра, 2 выходных. 24 входа, 16 выходов. Символьный дисплей 20х4, матричная клавиатура 4х4. Несколько входов МК.
Весь этот проект был у меня в голове. Паял на макетной плате. Схема была нарисована только после того, как эта макетка отработала несколько дней на станке. И от начала до конца проект был отлажен и просимулирован в AVR-Studio. Скрипач протеус не нужен.
[uquote="Demiurg",url="/forum/viewtopic.php?p=3834776#p3834776"]Я сразу понял, что у него пин не подтянуть. Интересно было, разберётся или нет.
Скрипач протеус не нужен.[/uquote]
категорически не согласен: протеус очень сильно помогает! только это такой же точно инструмент, как и любой другой - им надо уметь пользоваться. даже молотком можно покалечиться, и при помощи станка ЧПУ не суметь заточить карандаш - проблема не в инструменте, а в "пользователе".
кому скрипач не нужен, тому просто медведь на ухо наступил
Скрипач протеус не нужен.[/uquote]
категорически не согласен: протеус очень сильно помогает! только это такой же точно инструмент, как и любой другой - им надо уметь пользоваться. даже молотком можно покалечиться, и при помощи станка ЧПУ не суметь заточить карандаш - проблема не в инструменте, а в "пользователе".
кому скрипач не нужен, тому просто медведь на ухо наступил
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Инструменты тоже разные бывают. Задача инструмента облегчать труд. Для меня протеус эту задачу не выполняет. Вот и все.
так я и говорю: вы не умеете им пользоваться, вот и не облегчает. австралийскому аборигену дай экскаватор, разве он яму быстрее выкопает, чем своей привычной палкой-копалкой?Demiurg писал(а):Для меня протеус эту задачу не выполняет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
что то не работает код
Код: Выделить всё
//тини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); //вызываем процедуру обработки кнопки
}
глаза боятся, а руки что то не делают))
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Если ты хочешь стать счастливым - будь им. Хочешь научиться программировать - создавай проекты.
Правило номер 1 - "В начале было слово" - нет. В начале был проект. С этого момента любая ваша программа, даже самая примитивная, кнопочку опросить, светодиодик зажечь - проект. Именно так. Не письку на заборе нарисовать, а Проект. Проектирование снизу вверх, начинаешь с мелочей и тонешь в них. Проектирование сверху вниз. Устройство и последующая декомпозиция на модули, до атомов. Разделяй и властвуй.
Резюме: Проект, проектирование. Проработка всех этапов, идем сверху (устройство (на самом деле есть еще один верхний уровень, взаимодействие и влияние вашего устройства)) вниз (примитивы).
Правило номер 2 - когда проработан проект, начинается планирование ваших дальнейших действий. И планомерное уничтожение пунктов плана. Анализ результатов на каждом этапе, пункте.
Не получается? Не торопитесь бежать за помощью. Есть пословица: танцевать от печки. На каком этапе перестало работать? После чего? Если потребуется, начните весь проект с самого начала, и на каждом этапе смотрите, где перестало работать.
Декомпозиция, анализ, синтез.
Правило номер 1 - "В начале было слово" - нет. В начале был проект. С этого момента любая ваша программа, даже самая примитивная, кнопочку опросить, светодиодик зажечь - проект. Именно так. Не письку на заборе нарисовать, а Проект. Проектирование снизу вверх, начинаешь с мелочей и тонешь в них. Проектирование сверху вниз. Устройство и последующая декомпозиция на модули, до атомов. Разделяй и властвуй.
Резюме: Проект, проектирование. Проработка всех этапов, идем сверху (устройство (на самом деле есть еще один верхний уровень, взаимодействие и влияние вашего устройства)) вниз (примитивы).
Правило номер 2 - когда проработан проект, начинается планирование ваших дальнейших действий. И планомерное уничтожение пунктов плана. Анализ результатов на каждом этапе, пункте.
Не получается? Не торопитесь бежать за помощью. Есть пословица: танцевать от печки. На каком этапе перестало работать? После чего? Если потребуется, начните весь проект с самого начала, и на каждом этапе смотрите, где перестало работать.
Декомпозиция, анализ, синтез.
Demiurg работало без использования указателей ( на переменных аккумуляторах) , мне объяснили , что это не есть хорошо, надо на указателях, NStorm написал свой код, я его прогнал в железе и протеусе, светодиоды не переключаются, нашел информацию по указателям вроде все правильно, в функции принимаем с и d как указатели, при вызове передаем адреса переменных i, k,m, n
глаза боятся, а руки что то не делают))
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
1 - Забудьте ассемблерные привычки.
2 - Вы пишете программы для космических агрегатов? Нет? Вот и не особо слушайте тех, кто запрещает вам использовать указатели.
2 - Вы пишете программы для космических агрегатов? Нет? Вот и не особо слушайте тех, кто запрещает вам использовать указатели.
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
[uquote="Demiurg",url="/forum/viewtopic.php?p=3833594#p3833594"]Покажите вашу реализацию программных таймеров. Здесь моя реализация.[/uquote]
Мне особо точные задержки не нужны, по этому сделал такой http://we.easyelectronics.ru/Soft/samyy ... aymer.html
Мне особо точные задержки не нужны, по этому сделал такой http://we.easyelectronics.ru/Soft/samyy ... aymer.html
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
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; // иначе при выходе из функции обработаные данные сотрутся
}глаза боятся, а руки что то не делают))
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Вы на меня обиделись, к моим советам не прислушались. Также вы не стали слушать советы других.
Выше, на этой странице я выложил рабочий пример. Не поленитесь, скачайте, посмотрите.
Ваш код сложный, сложнопереносимый, сложноредактируемый. Магические числа, переменные, пины МК не определены. Вырвиглазный.
Вы предпочли оскорбиться, включить бесполезную гордость и пойти своим путем. Вперёд. С песней. Флаг вам в руки. Продолжайте морозить уши назло бабушке. Отписываюсь. Ваш ник запомню.
Выше, на этой странице я выложил рабочий пример. Не поленитесь, скачайте, посмотрите.
Ваш код сложный, сложнопереносимый, сложноредактируемый. Магические числа, переменные, пины МК не определены. Вырвиглазный.
Вы предпочли оскорбиться, включить бесполезную гордость и пойти своим путем. Вперёд. С песней. Флаг вам в руки. Продолжайте морозить уши назло бабушке. Отписываюсь. Ваш ник запомню.
Demiurg, я просто хотел разобраться для начала с той версией кода так как сам ее написал) а потом перейти к другим вариантам решений, а ваш метод я обязательно поизучаю, и авр хорошие мысли подкинул.
глаза боятся, а руки что то не делают))
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
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); //вызываем процедуру обработки кнопки
}


