PIC12F675 (MPLab IDE C++)

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Alexander90h
Родился
Сообщения: 7
Зарегистрирован: Сб окт 06, 2018 15:09:18

PIC12F675 (MPLab IDE C++)

Сообщение 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 сек.
    } 
}
Вложения
Proteus.rar
(87.23 КБ) 215 скачиваний
Снимок.JPG
(209.04 КБ) 558 скачиваний
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: PIC12F675 (MPLab IDE C++)

Сообщение uldemir »

Запоминаете предыдущее состояние кнопки и срабатывание производите только в том случае, если она нажата, а предыдущее состояние - не нажата. После чего, делаете защитный интервал для подавления дребезга контактов кнопки.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Alexander90h
Родился
Сообщения: 7
Зарегистрирован: Сб окт 06, 2018 15:09:18

Re: PIC12F675 (MPLab IDE C++)

Сообщение 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]

Если я правильно понял, мне нужно сделать что-то наподобие этого? Только что-то у меня не получается... :(
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: PIC12F675 (MPLab IDE C++)

Сообщение uldemir »

Так как вы написали: задержка, сохранение предыдущего, опрос нового, повтор - никогда работать не будет. потому как надо с нажатием попасть в очень короткий период времени. Надо прочитать и сразу сохранить, задержка, повторить. И в любом месте задержки проверяь условие.
кажется, фигню написал. Приведённый код верный. А... это не ваш.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Эиком - электронные компоненты и радиодетали
Alexander90h
Родился
Сообщения: 7
Зарегистрирован: Сб окт 06, 2018 15:09:18

Re: PIC12F675 (MPLab IDE C++)

Сообщение 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;
             }
       . . .
Спасибо за помощь
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: PIC12F675 (MPLab IDE C++)

Сообщение pyzhman »

[uquote="Alexander90h",url="/forum/viewtopic.php?p=3474676#p3474676"]...чтобы при долгом нажатии все тэны сразу не включились?...[/uquote]
При долгом нажатии чего? какой кнопки?
Docendo discimus
Реклама
Alexander90h
Родился
Сообщения: 7
Зарегистрирован: Сб окт 06, 2018 15:09:18

Re: PIC12F675 (MPLab IDE C++)

Сообщение 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)).
Изображение
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: PIC12F675 (MPLab IDE C++)

Сообщение pyzhman »

Что-то я не могу понять, что за беда с подключением ТЭНов. По идее должна быть общая масса, а реле должны подключать соответствующий ТЭН. Не?
__________
Просчитал по положениям реле (все 8 возможных состояний). Полная ахинея получается.
Docendo discimus
Alexander90h
Родился
Сообщения: 7
Зарегистрирован: Сб окт 06, 2018 15:09:18

Re: PIC12F675 (MPLab IDE C++)

Сообщение Alexander90h »

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

Это не моя идея, так задумано инженерами которые проэктировали данный бойлер (Только изначально ТЭНы управлялись программным пакетным переключателем) Как объясняет производитель, такое подключение ТЭН имеет более большую рассеиваемую мощность (теплоотдачу) при малых мощностях потребляемого бойлером тока
Просчитал по положениям реле (все 8 возможных состояний). Полная ахинея получается.
Подскажите пожалуйста более правильный вариант кода, я в программировании новичёк... :oops:
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: PIC12F675 (MPLab IDE C++)

Сообщение RoboC »

Что обратной связи нет в вашем бойлере?Датчик температуры?
Какой тогда смысл "городить" контроллер, если можно тумблерами все включать и выключать?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Alexander90h
Родился
Сообщения: 7
Зарегистрирован: Сб окт 06, 2018 15:09:18

Re: PIC12F675 (MPLab IDE C++)

Сообщение Alexander90h »

[uquote="RoboC",url="/forum/viewtopic.php?p=3475981#p3475981"]Что обратной связи нет в вашем бойлере?Датчик температуры?
Какой тогда смысл "городить" контроллер, если можно тумблерами все включать и выключать?[/uquote]
Обратной связи для МК нет. Поддержку температуры думал оставить заводскую, к баку с водой прикручен термостат "KSD 301 75 10A", с помощью его поддерживается температура воды на уровне 75°С.
Изображение
Фаза приходит на термостат, а с термостата на силовые контакты реле.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC12F675 (MPLab IDE C++)

Сообщение Аlex »

Alexander90h, глюкнет ваше изобретение при первых же включениях ТЕН'ов.
Поставьте тумблеры и не занимайтесь ерундой. МК тут явно излишен.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: PIC12F675 (MPLab IDE C++)

Сообщение pyzhman »

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

Re: PIC12F675 (MPLab IDE C++)

Сообщение Alexander90h »

Аlex писал(а):Alexander90h, глюкнет ваше изобретение при первых же включениях ТЕН'ов.
Насчёт того, что это изобретение глюкнет при первом включении, вполне возможно, если контакты на реле прикипят и оно не отключит фазу или ноль при переключении.
Изображение
Родной программный пакетный переключатель уже не рабочий и заменить его нечем, я не нашел подходящий по размерам... кстати, на него тоже приходила фаза с нулём и таким же образом переключались контакты
Аlex писал(а):Поставьте тумблеры и не занимайтесь ерундой. МК тут явно излишен.
Вы правы, гораздо проще поставить пару тумблеров, наверное так и сделаю...
Sed
Родился
Сообщения: 4
Зарегистрирован: Пн дек 14, 2009 16:17:43

Re: PIC12F675 (MPLab IDE C++)

Сообщение Sed »

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

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

Это всё не обязательно, но используя МК - ты в разы расширяешь возможности казалось бы банального бойлера, и самое главное - получаешь навыки, настоящие практические навыки, создания цифровых систем контроля и управления, а тумблер - любой дурак может поставить...
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

Re: PIC12F675 (MPLab IDE C++)

Сообщение RoboC »

настоящие практические навыки, создания цифровых систем контроля и управления
Вот умеете поднять настроение :beer:
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Ответить

Вернуться в «PIC»