Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

PIC12F675 (MPLab IDE C++)

Сб окт 06, 2018 19:19:01

Здравствуйте!

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

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

Спойлер
Код:
/*
 * 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 сек.
    }
}
Вложения
Proteus.rar
(87.23 KiB) Скачиваний: 193
Снимок.JPG
(209.04 KiB) Скачиваний: 532

Re: PIC12F675 (MPLab IDE C++)

Сб окт 06, 2018 20:48:31

Запоминаете предыдущее состояние кнопки и срабатывание производите только в том случае, если она нажата, а предыдущее состояние - не нажата. После чего, делаете защитный интервал для подавления дребезга контактов кнопки.

Re: PIC12F675 (MPLab IDE C++)

Сб окт 06, 2018 22:59:51

Код:
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;
}

Вот так.


Если я правильно понял, мне нужно сделать что-то наподобие этого? Только что-то у меня не получается... :(

Re: PIC12F675 (MPLab IDE C++)

Вс окт 07, 2018 05:44:52

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

Re: PIC12F675 (MPLab IDE C++)

Вс окт 07, 2018 18:59:26

Возможно это не самый хороший вариант, но он работает
Код:
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

...чтобы при долгом нажатии все тэны сразу не включились?...

При долгом нажатии чего? какой кнопки?

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 11:05:00

pyzhman писал(а):
...чтобы при долгом нажатии все тэны сразу не включились?...

При долгом нажатии чего? какой кнопки?

При долгом нажатии одной из этих двух кнопок, подключенных к 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

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

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 12:29:01

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

Вы правы, обычно так и подключают (общая масса, а реле коммутирует соответствующий ТЭН с источником питания).
Но здесь 2-е ТЭНы одинаковой мощности и длины (они подключены параллельно), а третий ТЭН имеет более большую мощность и длину (подключен последовательно с теми двумя ТЭНами)

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

Подскажите пожалуйста более правильный вариант кода, я в программировании новичёк... :oops:

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 13:04:33

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

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 13:35:47

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

Обратной связи для МК нет. Поддержку температуры думал оставить заводскую, к баку с водой прикручен термостат "KSD 301 75 10A", с помощью его поддерживается температура воды на уровне 75°С.
Изображение
Фаза приходит на термостат, а с термостата на силовые контакты реле.

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 13:44:21

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

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 15:18:36

...к баку с водой прикручен термостат "KSD 301 75 10A", с помощью его поддерживается температура воды на уровне 75°С....

и выключается при превышении. Стандартное решение и работает надёжно.

Re: PIC12F675 (MPLab IDE C++)

Пн окт 08, 2018 19:14:13

Аlex писал(а):Alexander90h, глюкнет ваше изобретение при первых же включениях ТЕН'ов.

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

Вы правы, гораздо проще поставить пару тумблеров, наверное так и сделаю...

Re: PIC12F675 (MPLab IDE C++)

Вт окт 23, 2018 09:16:36

Вы правы, гораздо проще поставить пару тумблеров, наверное так и сделаю...

Никого не слушай, не прикипят контакты реле, если выбрать правильные реле, с запасом мощности разумеется, даже если ошибешся с выбором реле то ничего, купишь другие, если реле попадется бракованное то на этот случай - защита термостатом сработает или если критично важно - можно поставить по 2 реле на канал для страховки.

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

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

Re: PIC12F675 (MPLab IDE C++)

Вт окт 23, 2018 13:00:49

настоящие практические навыки, создания цифровых систем контроля и управления

Вот умеете поднять настроение :beer:
Ответить