Всем доброго времени суток. Господа нужна помощ в логике работы таймера для PIC, в упор не могу разобраться как оно работает и как мне правильно все сделать под свой код.... Суть вопроса в том, как сделать так, что бы при нажатии кнопки у меня начинался отчёт таймера, при этом если нажать ещё раз программа завершиться и перейдёт в ожидание, но если не была нажата кнопка и таймер досчитал до определенного момента происходит завершение программы и снова переход в ожидания
У меня есть готовый и полностью работающий код именно для кнопок, т.е кнопку нажал программа начала своё выполнение, ещё раз нажал программа завершилась и ушла в ожидание
Кто может подсказать, у кого будут какие либо мысли??
Воть такое "устройство" (открытый исходник)... https://radiokot.ru/forum/viewtopic.php ... 8#p3153788 Ежли одновременно и динамическая индикация на светодиодных 7-сегментниках на одном и том же МК - там другое решение потребуется. А ежли любой тип дисплея с собственным мозгом (хоть ЖКИ, хоть светики) тогда просто заменить обработчик связи с дисплеем на соответствующий.
Воть такое "устройство" (открытый исходник)... https://radiokot.ru/forum/viewtopic.php ... 8#p3153788 Ежли одновременно и динамическая индикация на светодиодных 7-сегментниках на одном и том же МК - там другое решение потребуется. А ежли любой тип дисплея с собственным мозгом (хоть ЖКИ, хоть светики) тогда просто заменить обработчик связи с дисплеем на соответствующий.
Это немного не то :C Есть возможность подсказать как сделать в поем случае? Щас пытаюсь добиться хотя бы задержку адекватную сделать, но при этом, что бы и кнопки работали
char es1 (void); // Программа кнопи char es2 (void); // Программа кнопи char es3 (void); // Программа кнопи char es4 (void); // Программа кнопи char es5 (void); // Программа кнопи char es9 (void); // Программа кнопи void es8 (void); // Программа щуп
bit h1DOUN, h2DOUN, h3DOUN, h4DOUN, h5DOUN; char timerpovtor01,timerpovtor02,timerpovtor03, timerpovtor04,timerpovtor05;
bit NAG; int counter;
void main (void) { TRISA = 0b00000000; // направление работы ножек порта А TRISB = 0b11111111; // направление работы ножек порта В CMCON = 0b11111111; // отключение компараторов PORTA = 0b00000011; // очищаем порт А PORTB = 0b11111111; // очищаем порт Б RBPU = 0; // подтягивающие R (0-вкл, 1-выкл) while(1) { if(es1()==1) // Если присвоили "1" то { flap = 1; // Включается Клапан группы // Запускается клапан группы (Порт RA3 = 1) pump1 = 1; //Включается Помпа // Запускается помпа (Порт RA0 = 1) //exitmk2 = 0; } else if(es1()==2) // Если присвоили "2" то { flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1) } if(es2()==1) { flap = 1; // Включается Клапан группы pump1 = 1; //Включается Помпа } else if(es2()==2) // Если присвоили "2" то { flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1) } if(es3()==1) { flap = 1; // Включается Клапан группы pump1 = 1; //Включается Помпа } else if(es3()==2) // Если присвоили "2" то { flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1) } if(es4()==1) { flap = 1; // Включается Клапан группы pump1 = 1; //Включается Помпа } else if(es4()==2) // Если присвоили "2" то { flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1) } if(es5()==1) { flapvalve = 1; // Включается Клапан группы pump1 = 1; //Включается Помпа } else if(es5()==2) // Если присвоили "2" то { flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1) } es8 (); // Функция Клапана горячий воды } }
char es1 (void) // Программа 1 кнопки { if (h1==0) // проверяем, кнопка нажата? уровень низкий? { _delay(10000); // подождем 10 мСек. задержка для устранения "дребезга" if (h1==0) // и еще раз проверим, кнопка нажата { if (!timerpovtor01&&!h1DOUN) // проверяем бит, кнопка была нажата до этого? { timerpovtor01=DLITUD; // таймер задежки на время удержание клавиши return 1; // одно нажатие, присваиваем "1" для "if es1" } else if (h1==0) // Иначе { timerpovtor01--; // if(!timerpovtor01) // { timerpovtor01=DLITUD; // h1DOUN=1; // return 2; // удержание кнопки, присваиваем "2" для "else if es1" } return 0; // ожидание отработки таймера } }
/*else { /*__delay_ms(10000); // ? Не получается сделать задержку через timerpovtor06 flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) // ? Не могу обраться к функции "else if(es1()==2)" через "return 2" pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Button= h1; // опросили кнопку для первоначальной установки переменной
while(1) { _delay_ms(10); // для подавления дребезга кнопки
oldButton= Button; // предыдущее состояние кнопки Button= h1; // текущее состояние кнопки
if(oldButton && !Button) // момент нажатия кнопки { if(DataTimer) DataTimer= 0; // если кнопка нажата во время работы таймера, то останавливаем таймер else DataTimer= 555; // если таймер стоял, то запускаем его // число 555 соответствует 555*10мсек= 5550мсек= 5,55 сек таймера }
Button= h1; // опросили кнопку для первоначальной установки переменной
while(1) { _delay_ms(10); // для подавления дребезга кнопки
oldButton= Button; // предыдущее состояние кнопки Button= h1; // текущее состояние кнопки
if(oldButton && !Button) // момент нажатия кнопки { if(DataTimer) DataTimer= 0; // если кнопка нажата во время работы таймера, то останавливаем таймер else DataTimer= 555; // если таймер стоял, то запускаем его // число 555 соответствует 555*10мсек= 5550мсек= 5,55 сек таймера }
if(DataTimer) --DataTimer; }
Вот так.
Идея очень хорошая, но почему то не получилось сделать все, ошибками сыпет Есть возможность более подробно все расписать, как и куда все добавить? Если все получится в долгу не останусь
Button= h1; // опросили кнопку для первоначальной установки переменной
while(1) { _delay_ms(10); // для подавления дребезга кнопки
oldButton= Button; // предыдущее состояние кнопки Button= h1; // текущее состояние кнопки
if(oldButton && !Button) // момент нажатия кнопки { if(DataTimer) DataTimer= 0; // если кнопка нажата во время работы таймера, то останавливаем таймер else DataTimer= 555; // если таймер стоял, то запускаем его // число 555 соответствует 555*10мсек= 5550мсек= 5,55 сек таймера }
if(DataTimer) --DataTimer; }
Вот так.
Я правильно понял, DataTimer это по сути TMR0? Если пытаться активировать таймер в коде, то почему то перестает работать вся программа после Инициализации прерываний Подскажите как правильно все сделать??
DataTimer это счётчик таймера. Если там не ноль, то значит таймер взведён. Если 0, то отсчёт закончен. Организовать можно и как переменную, и как железный таймер (тот же TMR0). Просто так взять и вставить в ваш код нельзя. Нужно логически вживлять.
Добавлено after 2 minutes 19 seconds: 2dosikus: где почитать про наилучший?
DataTimer это счётчик таймера. Если там не ноль, то значит таймер взведён. Если 0, то отсчёт закончен. Организовать можно и как переменную, и как железный таймер (тот же TMR0). Просто так взять и вставить в ваш код нельзя. Нужно логически вживлять.
Добавлено after 2 minutes 19 seconds: 2dosikus: где почитать про наилучший?
Да это понятно) Но видимо где то ошибся, потому и не заработало :C
Про наилучший если я его правильно понял то он про таймер имел ввиду, дабы не стопарить программу если много задержек будет
Про наилучший если я его правильно понял то он про таймер имел ввиду, дабы не стопарить программу если много задержек будет
Задержек вообще быть не должно. Антидребезг кнопки, это ее программное чтение с интервалом больше, чем дребезг. Все, точка. То есть либо в прерывании от таймера, либо в суперлупе. Последнее геморройней, ибо период в суперлупе нестабилен. Счетные функции кнопки (нажал-отжал) реализуют в месте ее чтения.
...программное чтение с интервалом больше, чем дребезг...
10мс больше чем дребезг?
dosikus писал(а):
... о вертикальных счетчиках...
Согласен, можно отсчитать не 10, а 5 раз по 2. ---------- Стоит ли в программе, управляющей тремя светодиодами в зависимости от состояния одной кнопки, городить такой огород? Впрочем, на вкус и цвет. Опять же - каждый суслик в поле агроном. От себя: что-то мне это напоминает бритву. Да-да, того самого.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения