Таймер для PIC (PIC16F628A)
Таймер для PIC (PIC16F628A)
Всем доброго времени суток. Господа нужна помощ в логике работы таймера для PIC, в упор не могу разобраться как оно работает и как мне правильно все сделать под свой код.... Суть вопроса в том, как сделать так, что бы при нажатии кнопки у меня начинался отчёт таймера, при этом если нажать ещё раз программа завершиться и перейдёт в ожидание, но если не была нажата кнопка и таймер досчитал до определенного момента происходит завершение программы и снова переход в ожидания
У меня есть готовый и полностью работающий код именно для кнопок, т.е кнопку нажал программа начала своё выполнение, ещё раз нажал программа завершилась и ушла в ожидание
Кто может подсказать, у кого будут какие либо мысли??
У меня есть готовый и полностью работающий код именно для кнопок, т.е кнопку нажал программа начала своё выполнение, ещё раз нажал программа завершилась и ушла в ожидание
Кто может подсказать, у кого будут какие либо мысли??
Re: Таймер для PIC (PIC16F628A)
Воть такое "устройство" (открытый исходник)...
https://radiokot.ru/forum/viewtopic.php ... 8#p3153788
Ежли одновременно и динамическая индикация на светодиодных 7-сегментниках на одном и том же МК - там другое решение потребуется.
А ежли любой тип дисплея с собственным мозгом (хоть ЖКИ, хоть светики) тогда просто заменить обработчик связи с дисплеем на соответствующий.

https://radiokot.ru/forum/viewtopic.php ... 8#p3153788
Ежли одновременно и динамическая индикация на светодиодных 7-сегментниках на одном и том же МК - там другое решение потребуется.
А ежли любой тип дисплея с собственным мозгом (хоть ЖКИ, хоть светики) тогда просто заменить обработчик связи с дисплеем на соответствующий.

Re: Таймер для PIC (PIC16F628A)
[uquote="BOB51",url="/forum/viewtopic.php?p=3461662#p3461662"]Воть такое "устройство" (открытый исходник)...
https://radiokot.ru/forum/viewtopic.php ... 8#p3153788
Ежли одновременно и динамическая индикация на светодиодных 7-сегментниках на одном и том же МК - там другое решение потребуется.
А ежли любой тип дисплея с собственным мозгом (хоть ЖКИ, хоть светики) тогда просто заменить обработчик связи с дисплеем на соответствующий.
[/uquote]
Это немного не то :C
Есть возможность подсказать как сделать в поем случае? Щас пытаюсь добиться хотя бы задержку адекватную сделать, но при этом, что бы и кнопки работали
Сам код:
https://radiokot.ru/forum/viewtopic.php ... 8#p3153788
Ежли одновременно и динамическая индикация на светодиодных 7-сегментниках на одном и том же МК - там другое решение потребуется.
А ежли любой тип дисплея с собственным мозгом (хоть ЖКИ, хоть светики) тогда просто заменить обработчик связи с дисплеем на соответствующий.
[/uquote]Это немного не то :C
Есть возможность подсказать как сделать в поем случае? Щас пытаюсь добиться хотя бы задержку адекватную сделать, но при этом, что бы и кнопки работали
Сам код:
Спойлер
Код: Выделить всё
#include <pic.h>
__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS );
#define uph1 RB0 // Вверх щуп
#define pump1 RA0 // Помпа
#define auto1 RA1 // Клапан автоподкачки
#define downh1 RB1 // Низ щуп
#define head RA2 // Тен
#define flap RA3 // Клапан группы
#define flapvalve RA7 // Клапан горячий воды
#define h1 RB2 // Кнопки
#define h2 RB3 // *
#define h3 RB4 // *
#define h4 RB5 // *
#define h5 RB6 // *
#define h6 RB7 // Кнопки
#define exitmk2 RA6
#define DLITUD 25 // Таймер задерэки
#define _XTAL_FREQ 4000000
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)
}
*/
}
h1DOUN=0; // сброс бита сигнал удержания сформирован
timerpovtor01=0;
return 0;
}
char es2 (void)
{
if (h2==0)//&&(auto1==0)) // проверяем, кнопка нажата? уровень низкий?
{
_delay(10000); // подождем 10 мСек. задержка для устранения "дребезга"
if (h2==0)//&&(auto1==0)) // и еще раз проверим, кнопка нажата
{
if (!timerpovtor02&&!h2DOUN) // проверяем бит, кнопка была нажата до этого?
{
timerpovtor02=DLITUD; // таймер задежки на время удержание клавиши
return 1; // одно нажатие
}
else if (h2==0)
{
timerpovtor02--; //
if(!timerpovtor02) //
{
timerpovtor02=DLITUD; //
h2DOUN=1; //
return 2; // удержание кнопки
}
return 0; // ожидание отработки таймера
}
}
}
h2DOUN=0; // сброс бита сигнал удержания сформирован
timerpovtor02=0;
return 0;
}
char es3 (void)
{
if (h3==0) // проверяем, кнопка нажата? уровень низкий?
{
_delay(10000); // подождем 10 мСек. задержка для устранения "дребезга"
if (h3==0) // и еще раз проверим, кнопка нажата
{
if (!timerpovtor03&&!h3DOUN) // проверяем бит, кнопка была нажата до этого?
{
timerpovtor03=DLITUD; // таймер задежки на время удержание клавиши
return 1; // одно нажатие
}
else if (h3==0)
{
timerpovtor03--; //
if(!timerpovtor03) //
{
timerpovtor03=DLITUD; //
h3DOUN=1; //
return 2; // удержание кнопки
}
return 0; // ожидание отработки таймера
}
}
else
{
__delay_ms(15000); // ? Не получается сделать задержку через timerpovtor06
flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) // ? Не могу обраться к функции "else if(es1()==2)" через "return 2"
pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1)
}
}
h3DOUN=0; // сброс бита сигнал удержания сформирован
timerpovtor03=0;
return 0;
}
char es4 (void)
{
if (h4==0) // проверяем, кнопка нажата? уровень низкий?
{
_delay(10000); // подождем 10 мСек. задержка для устранения "дребезга"
if ((h4==0)&&(auto1==0)) // и еще раз проверим, кнопка нажата
{
if (!timerpovtor04&&!h4DOUN) // проверяем бит, кнопка была нажата до этого?
{
timerpovtor04=DLITUD; // таймер задежки на время удержание клавиши
return 1; // одно нажатие
}
else if (h4==0)
{
timerpovtor04--; //
if(!timerpovtor04) //
{
timerpovtor04=DLITUD; //
h4DOUN=1; //
return 2; // удержание кнопки
}
return 0; // ожидание отработки таймера
}
}
else
{
__delay_ms(10000); // ? Не получается сделать задержку через timerpovtor06
flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) // ? Не могу обраться к функции "else if(es1()==2)" через "return 2"
pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1)
}
}
h4DOUN=0; // сброс бита сигнал удержания сформирован
timerpovtor04=0;
return 0;
}
char es5 (void)
{
if (h5==0) // проверяем, кнопка нажата? уровень низкий?
{
_delay(10000); // подождем 10 мСек. задержка для устранения "дребезга"
if (h5==0)//&&(auto1==0)) // и еще раз проверим, кнопка нажата
{
if (!timerpovtor05&&!h5DOUN) // проверяем бит, кнопка была нажата до этого?
{
timerpovtor05=DLITUD; // таймер задежки на время удержание клавиши
return 1; // одно нажатие
}
else if (h5==0)
{
timerpovtor05--; //
if(!timerpovtor05) //
{
timerpovtor05=DLITUD; //
h5DOUN=1; //
return 2; // удержание кнопки
}
return 0; // ожидание отработки таймера
}
}
else
{
__delay_ms(10000); // ? Не получается сделать задержку через timerpovtor06
flap = 0; // Включается Клапан группы // Отключается клапан группы (Порт RA3 = 0) // ? Не могу обраться к функции "else if(es1()==2)" через "return 2"
pump1 = 0; //Включается Помпа // Отключается помпа (Порт RA0 = 1)
}
}
h5DOUN=0; // сброс бита сигнал удержания сформирован
timerpovtor05=0;
return 0;
}
void es8 (void)
{
if (uph1==0)
{
_delay(5000); // ожидаем 10 мс, пропускаем дребезг
if (uph1==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата" // Программа кнопки 1 - Эспрессо мал иначе если h3=1
{ // то
NAG=1;
head = 1;
auto1 = 0; // Включается Клапан группы
pump1 = 0; //Включается Помпа
counter++;
}
else if (uph1==0)
{
_delay(5000);
if (uph1==0&&NAG==0)
{
NAG=1;
// auto1 =1;
// pump1 =1;
counter--;
}
}
else
{
auto1 = 1;
pump1 = 1;
head = 0;
NAG=0;
}
}
}
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
[uquote="BonTens86",url="/forum/viewtopic.php?p=3461652#p3461652"]...при этом если нажать ещё раз программа завершиться и перейдёт в ожидание...[/uquote]
а таймер в это время чё делать должен?
а таймер в это время чё делать должен?
Docendo discimus
Re: Таймер для PIC (PIC16F628A)
Придется СИшников обождать... Я ассемблером балуюсь...

Re: Таймер для PIC (PIC16F628A)
[uquote="pyzhman",url="/forum/viewtopic.php?p=3464719#p3464719"][uquote="BonTens86",url="/forum/viewtopic.php?p=3461652#p3461652"]...при этом если нажать ещё раз программа завершиться и перейдёт в ожидание...[/uquote]
а таймер в это время чё делать должен?[/uquote]
Ждать пока не истечет время, после нажатия кнопки, и завершить программу
а таймер в это время чё делать должен?[/uquote]
Ждать пока не истечет время, после нажатия кнопки, и завершить программу
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
Код: Выделить всё
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;
}
Вот так.
Docendo discimus
Re: Таймер для PIC (PIC16F628A)
[uquote="pyzhman",url="/forum/viewtopic.php?p=3465496#p3465496"]
Вот так.[/uquote]
Идея очень хорошая, но почему то не получилось сделать все, ошибками сыпет
Есть возможность более подробно все расписать, как и куда все добавить? Если все получится в долгу не останусь
Код: Выделить всё
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;
}
Вот так.[/uquote]
Идея очень хорошая, но почему то не получилось сделать все, ошибками сыпет
Есть возможность более подробно все расписать, как и куда все добавить? Если все получится в долгу не останусь

Re: Таймер для PIC (PIC16F628A)
[uquote="pyzhman",url="/forum/viewtopic.php?p=3465496#p3465496"]
Вот так.[/uquote]
Это наихудший вариант подавления дребезга...
Код: Выделить всё
while(1)
{
_delay_ms(10); // для подавления дребезга кнопки
...
}
Вот так.[/uquote]
Это наихудший вариант подавления дребезга...
Re: Таймер для PIC (PIC16F628A)
[uquote="dosikus",url="/forum/viewtopic.php?p=3465676#p3465676"][uquote="pyzhman",url="/forum/viewtopic.php?p=3465496#p3465496"]
Вот так.[/uquote]
Это наихудший вариант подавления дребезга...[/uquote]
Согласен, но на данный момент пусть так пока что и будет))
Код: Выделить всё
while(1)
{
_delay_ms(10); // для подавления дребезга кнопки
...
}
Вот так.[/uquote]
Это наихудший вариант подавления дребезга...[/uquote]
Согласен, но на данный момент пусть так пока что и будет))
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
Хм... А наилучший?
Добавлено after 1 minute 51 second:
BonTens86, распишите подробнее, что и как должно выполнять устройство, и пришлите мне в личку.
Добавлено after 1 minute 51 second:
BonTens86, распишите подробнее, что и как должно выполнять устройство, и пришлите мне в личку.
Docendo discimus
Re: Таймер для PIC (PIC16F628A)
[uquote="pyzhman",url="/forum/viewtopic.php?p=3465496#p3465496"]
Вот так.[/uquote]
Я правильно понял, DataTimer это по сути TMR0? Если пытаться активировать таймер в коде, то почему то перестает работать вся программа после Инициализации прерываний
Подскажите как правильно все сделать??
Код: Выделить всё
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;
}
Вот так.[/uquote]
Я правильно понял, DataTimer это по сути TMR0? Если пытаться активировать таймер в коде, то почему то перестает работать вся программа после Инициализации прерываний
Подскажите как правильно все сделать??
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
DataTimer это счётчик таймера. Если там не ноль, то значит таймер взведён. Если 0, то отсчёт закончен. Организовать можно и как переменную, и как железный таймер (тот же TMR0). Просто так взять и вставить в ваш код нельзя. Нужно логически вживлять.
Добавлено after 2 minutes 19 seconds:
2dosikus:
где почитать про наилучший?
Добавлено after 2 minutes 19 seconds:
2dosikus:
где почитать про наилучший?
Docendo discimus
Re: Таймер для PIC (PIC16F628A)
[uquote="pyzhman",url="/forum/viewtopic.php?p=3466979#p3466979"]DataTimer это счётчик таймера. Если там не ноль, то значит таймер взведён. Если 0, то отсчёт закончен. Организовать можно и как переменную, и как железный таймер (тот же TMR0). Просто так взять и вставить в ваш код нельзя. Нужно логически вживлять.
Добавлено after 2 minutes 19 seconds:
2dosikus:
где почитать про наилучший?[/uquote]
Да это понятно) Но видимо где то ошибся, потому и не заработало :C
Про наилучший если я его правильно понял то он про таймер имел ввиду, дабы не стопарить программу если много задержек будет
Добавлено after 2 minutes 19 seconds:
2dosikus:
где почитать про наилучший?[/uquote]
Да это понятно) Но видимо где то ошибся, потому и не заработало :C
Про наилучший если я его правильно понял то он про таймер имел ввиду, дабы не стопарить программу если много задержек будет
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
[uquote="BonTens86",url="/forum/viewtopic.php?p=3466995#p3466995"]...он про таймер имел ввиду...[/uquote]
dosikus программист опытный и понимает, что я расписал только саму идею. Хотя, возможно, вы и правы.
dosikus программист опытный и понимает, что я расписал только саму идею. Хотя, возможно, вы и правы.
Docendo discimus
- КРАМ
- Друг Кота
- Сообщения: 25149
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Таймер для PIC (PIC16F628A)
[uquote="BonTens86",url="/forum/viewtopic.php?p=3466995#p3466995"]Про наилучший если я его правильно понял то он про таймер имел ввиду, дабы не стопарить программу если много задержек будет[/uquote]
Задержек вообще быть не должно.
Антидребезг кнопки, это ее программное чтение с интервалом больше, чем дребезг. Все, точка.
То есть либо в прерывании от таймера, либо в суперлупе. Последнее геморройней, ибо период в суперлупе нестабилен.
Счетные функции кнопки (нажал-отжал) реализуют в месте ее чтения.
Задержек вообще быть не должно.
Антидребезг кнопки, это ее программное чтение с интервалом больше, чем дребезг. Все, точка.
То есть либо в прерывании от таймера, либо в суперлупе. Последнее геморройней, ибо период в суперлупе нестабилен.
Счетные функции кнопки (нажал-отжал) реализуют в месте ее чтения.
Re: Таймер для PIC (PIC16F628A)
Крам, уже все расписал, добавлю только что почитайте о вертикальных счетчиках. На микрочип.сю есть реализация на них от tester...
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
[uquote="КРАМ",url="/forum/viewtopic.php?p=3467320#p3467320"]...программное чтение с интервалом больше, чем дребезг...[/uquote]
10мс больше чем дребезг?
Согласен, можно отсчитать не 10, а 5 раз по 2.
----------
Стоит ли в программе, управляющей тремя светодиодами в зависимости от состояния одной кнопки, городить такой огород? Впрочем, на вкус и цвет. Опять же - каждый суслик в поле агроном.
От себя: что-то мне это напоминает бритву. Да-да, того самого.
10мс больше чем дребезг?
dosikus писал(а):... о вертикальных счетчиках...
Согласен, можно отсчитать не 10, а 5 раз по 2.
----------
Стоит ли в программе, управляющей тремя светодиодами в зависимости от состояния одной кнопки, городить такой огород? Впрочем, на вкус и цвет. Опять же - каждый суслик в поле агроном.
От себя: что-то мне это напоминает бритву. Да-да, того самого.
Docendo discimus
- КРАМ
- Друг Кота
- Сообщения: 25149
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Таймер для PIC (PIC16F628A)
10мс обычно хватает, но бывают кнопки, которым нужно 30мс. Легко проверить опытным путем.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Таймер для PIC (PIC16F628A)
Благодарю за ответ. В промконтроллерах дело доходит до 80мсек. И опрашиваются не только кнопки, но и датчики, и блок-контакты, и прочая.
Docendo discimus