Страница 1 из 1

PIC12F675 (MPLab IDE C++)

Добавлено: Сб окт 06, 2018 19:19:01
Alexander90h
Здравствуйте!

Я прошу Вас помочь мне разобраться, как остановить цикл при удержании кнопки? Есть три тэны которые будут управляться релюшками, одна кнопка при каждом нажатии будет включать дополнительную тэну, а вторая кнопка в обратном порядке будет отключать тэны. Есть также и кнопка "СТОП", которая одним нажатием выключает все тэны.

Так вот, вопрос в следующем, как сделать так чтобы при долгом нажатии все тэны сразу не включились? В интернете находил информацию, что как то это можно через таймер реализовать...но у меня с этим ничего не получилось...
Спойлер

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

/*
 * Project name:
     |<A...y> (PIC12F675)
 * Copyright:
     (c) <A...7,
      v.1.0 - (Start(21.07.2015) and Finish(25.07.2015))>
 * Revision History:
     <versionNo> - 1.0
 */
#include <pic.h>
//PIC12F675
#include <htc.h>
#include <delay.c>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
 #define OpenTR3      TRIS0 //Открытие тр-ра #3(7-ая нога МК(GP0/AN0)).
 #define OpenTR2      TRIS1 //Открытие тр-ра #2(6-ая нога МК(GP1/AN1/VREF)).
 #define OpenTR1      TRIS2 //Открытие тр-ра #1(5-ая нога МК(GP2/T0CKI/INT/AN2)).
 #define KnopkaStop   GPIO3 //Аварийное отключение(4-ая нога МК(GP3/$MCLR$)).
 #define KnopkaDown   GPIO4 //Понижение темперетуры(3-ья нога МК(GP4/$T1G$/OSC2/AN3))).
 #define KnopkaUp     GPIO5 //Повышение темперетуры(2-ая нога МК(GP5/T1CKI/OSC1)).
__CONFIG (INTIO & UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS);
//----------------------------------------------------------------
//unsigned int g,k,s;
unsigned char i;
//----------------------------------------------------------------

 void ZX1(void)      //Подготовка МК.
  {
   TRISIO = 0b111111;//Направление работы ножек порта(1-вход, 0-выход).
   CMCON = 0x07;     //Отключение компараторов.
   GPIO = 0b000111;  //Очищаем порт(0-приём напряж., 1-подача напряж.).
   WPU4 = 1;         //Подтягивающий резистор(1-вкл., 0-откл.).
   WPU5 = 1;         //Подтягивающий резистор(1-вкл., 0-откл.).
   ANSEL = 0b000101; //Настройка аналогового входа.
   i = 1;
  }
//----------------------------------------------------------------

void main(void)//Начало программы.
 {
   ZX1();      //Вызов функции подготовки МК.
   while(1)    //Бесконечный цикл.
     {
MT:   if (KnopkaUp==1)//Повышение темперетуры.
        {
         if(i==1)//1
           {
            i=2;
            OpenTR2=1;
            OpenTR3=1;
            OpenTR1=0;
            DelayMs(500);
            goto MT;
           }
         if(i==2)//2
           {
            i=3;
            OpenTR1=1;
            OpenTR3=1;
            OpenTR2=0;
            DelayMs(500);
            goto MT;
           }
         if(i==3)//3
           {
            OpenTR1=1;
            OpenTR2=0;
            OpenTR3=0;
            DelayMs(500);
            goto MT;
           }
         }   
         if(KnopkaDown==1)//Понижение темперетуры.
          {
          if(i==3)//2
           {
            i=2;
            OpenTR1=1;
            OpenTR3=1;
            OpenTR2=0;
            DelayMs(500);
            goto MT;
           }
         if(i==2)//1
           {
            i=1;
            OpenTR2=1;
            OpenTR3=1;
            OpenTR1=0;
            DelayMs(500);
            goto MT;
           }
         if(i==1)//OFF
           {
            OpenTR1=1;
            OpenTR3=1;
            OpenTR2=1;
            DelayMs(500);
            goto MT;
           }
          }
         if(KnopkaStop==1)//Аварийное отключение.
          {
           i=1;
           TRISIO = 0b111111;
           DelayMs(1);
           return;
          }
      DelayMs(5);//Задержка 0,005 сек.
    } 
}

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Сб окт 06, 2018 20:48:31
uldemir
Запоминаете предыдущее состояние кнопки и срабатывание производите только в том случае, если она нажата, а предыдущее состояние - не нажата. После чего, делаете защитный интервал для подавления дребезга контактов кнопки.

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Сб окт 06, 2018 22:59:51
Alexander90h
[uquote="pyzhman",url="/forum/viewtopic.php?p=3465496#p3465496"]

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

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: PIC12F675 (MPLab IDE C++)

Добавлено: Вс окт 07, 2018 05:44:52
uldemir
Так как вы написали: задержка, сохранение предыдущего, опрос нового, повтор - никогда работать не будет. потому как надо с нажатием попасть в очень короткий период времени. Надо прочитать и сразу сохранить, задержка, повторить. И в любом месте задержки проверяь условие.
кажется, фигню написал. Приведённый код верный. А... это не ваш.

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Вс окт 07, 2018 18:59:26
Alexander90h
Возможно это не самый хороший вариант, но он работает

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

XL1:          if (KnopkaUp){goto XL1;}
Пока кнопку не отпустишь дальше по циклу не пойдёт..

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

MT:   if (KnopkaUp==1)//Повышение темперетуры.
        {
         DelayMs(10);//Для подавления дребезга кнопки.
         if (KnopkaUp)
           {
            if(i==0||i==1||i==2)
             {
              i++;
XL1:          if (KnopkaUp){goto XL1;}
             }
            if(i==1)//1
             {
              OpenTR2=1;
              OpenTR3=1;
              OpenTR1=0;
              DelayMs(10);
              goto MT;
             }
            if(i==2)//2
             {
              OpenTR1=1;
              OpenTR3=1;
              OpenTR2=0;
              DelayMs(10);
              goto MT;
             }
       . . .
Спасибо за помощь

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 10:30:05
pyzhman
[uquote="Alexander90h",url="/forum/viewtopic.php?p=3474676#p3474676"]...чтобы при долгом нажатии все тэны сразу не включились?...[/uquote]
При долгом нажатии чего? какой кнопки?

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 11:05:00
Alexander90h
pyzhman писал(а):[uquote="Alexander90h",url="/forum/viewtopic.php?p=3474676#p3474676"]...чтобы при долгом нажатии все тэны сразу не включились?...[/uquote]
При долгом нажатии чего? какой кнопки?
При долгом нажатии одной из этих двух кнопок, подключенных к 2-ой и 3-ей ножке МК.

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

 #define KnopkaDown   GPIO4 //Понижение темперетуры(3-ья нога МК(GP4/$T1G$/OSC2/AN3))).
 #define KnopkaUp     GPIO5 //Повышение темперетуры(2-ая нога МК(GP5/T1CKI/OSC1)).
Изображение

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 11:14:01
pyzhman
Что-то я не могу понять, что за беда с подключением ТЭНов. По идее должна быть общая масса, а реле должны подключать соответствующий ТЭН. Не?
__________
Просчитал по положениям реле (все 8 возможных состояний). Полная ахинея получается.

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 12:29:01
Alexander90h
pyzhman писал(а):Что-то я не могу понять, что за беда с подключением ТЭНов. По идее должна быть общая масса, а реле должны подключать соответствующий ТЭН. Не?
__________
Вы правы, обычно так и подключают (общая масса, а реле коммутирует соответствующий ТЭН с источником питания).
Но здесь 2-е ТЭНы одинаковой мощности и длины (они подключены параллельно), а третий ТЭН имеет более большую мощность и длину (подключен последовательно с теми двумя ТЭНами)

Это не моя идея, так задумано инженерами которые проэктировали данный бойлер (Только изначально ТЭНы управлялись программным пакетным переключателем) Как объясняет производитель, такое подключение ТЭН имеет более большую рассеиваемую мощность (теплоотдачу) при малых мощностях потребляемого бойлером тока
Просчитал по положениям реле (все 8 возможных состояний). Полная ахинея получается.
Подскажите пожалуйста более правильный вариант кода, я в программировании новичёк... :oops:

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 13:04:33
RoboC
Что обратной связи нет в вашем бойлере?Датчик температуры?
Какой тогда смысл "городить" контроллер, если можно тумблерами все включать и выключать?

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 13:35:47
Alexander90h
[uquote="RoboC",url="/forum/viewtopic.php?p=3475981#p3475981"]Что обратной связи нет в вашем бойлере?Датчик температуры?
Какой тогда смысл "городить" контроллер, если можно тумблерами все включать и выключать?[/uquote]
Обратной связи для МК нет. Поддержку температуры думал оставить заводскую, к баку с водой прикручен термостат "KSD 301 75 10A", с помощью его поддерживается температура воды на уровне 75°С.
Изображение
Фаза приходит на термостат, а с термостата на силовые контакты реле.

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 13:44:21
Аlex
Alexander90h, глюкнет ваше изобретение при первых же включениях ТЕН'ов.
Поставьте тумблеры и не занимайтесь ерундой. МК тут явно излишен.

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 15:18:36
pyzhman
[uquote="Alexander90h",url="/forum/viewtopic.php?p=3476003#p3476003"]...к баку с водой прикручен термостат "KSD 301 75 10A", с помощью его поддерживается температура воды на уровне 75°С....[/uquote]
и выключается при превышении. Стандартное решение и работает надёжно.

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Пн окт 08, 2018 19:14:13
Alexander90h
Аlex писал(а):Alexander90h, глюкнет ваше изобретение при первых же включениях ТЕН'ов.
Насчёт того, что это изобретение глюкнет при первом включении, вполне возможно, если контакты на реле прикипят и оно не отключит фазу или ноль при переключении.
Изображение
Родной программный пакетный переключатель уже не рабочий и заменить его нечем, я не нашел подходящий по размерам... кстати, на него тоже приходила фаза с нулём и таким же образом переключались контакты
Аlex писал(а):Поставьте тумблеры и не занимайтесь ерундой. МК тут явно излишен.
Вы правы, гораздо проще поставить пару тумблеров, наверное так и сделаю...

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Вт окт 23, 2018 09:16:36
Sed
Вы правы, гораздо проще поставить пару тумблеров, наверное так и сделаю...
Никого не слушай, не прикипят контакты реле, если выбрать правильные реле, с запасом мощности разумеется, даже если ошибешся с выбором реле то ничего, купишь другие, если реле попадется бракованное то на этот случай - защита термостатом сработает или если критично важно - можно поставить по 2 реле на канал для страховки.

В 675-ом есть отличный 10-и разрядный АЦП - с помощью одного терморезистора за "5 коппеек" можно организовать регулируемый термостат, на этом же контроллере, в будущем, можно согласовать работу нескольких устройств, к примеру в ванне тёплый пол будет выключатся при включении тэнов в бойлере, чтобы избежать излишней нагрузки на проводку, к немуже можно прикрутить модуль управления по wi-fi или сети, сейчас таких на Ali валом...

Это всё не обязательно, но используя МК - ты в разы расширяешь возможности казалось бы банального бойлера, и самое главное - получаешь навыки, настоящие практические навыки, создания цифровых систем контроля и управления, а тумблер - любой дурак может поставить...

Re: PIC12F675 (MPLab IDE C++)

Добавлено: Вт окт 23, 2018 13:00:49
RoboC
настоящие практические навыки, создания цифровых систем контроля и управления
Вот умеете поднять настроение :beer: