Перейти к содержанию

Работа с таймером, загорание лампочки в определённый промежуток времени


perec200

Рекомендуемые сообщения

Добрый день, в программирование контроллеров я ничего не смыслю, знаю только ассемблер, С++.
Мне необходимо реализовать систему автополива, у меня есть 5 выходов RA каждый из которых отвечает за открытия крана.
У каждого порта есть время срабатывания и длительность полива. Как мне в заданное время подать на нужный выход RA логическую единицу и держать этот уровень определенное время.

Пример: время срабатывания RA1 в 12:15 логическая единица должна быть установлена на 5 минут после истечения этого времени выход выдаёт сигнал 0.

Может посоветуете свои варианты как лучше сделать к примеру делать полив через заданные промежутки времени.
Основной вопрос: как создать таймер, который в заданное время сработает и подаст сигнал на порт RA?

Скрытый текст

#define _XTAL_FREQ 8000000

#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include <xc.h>
#include "lcd.h";
#include <stdio.h>

// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG



char* plants[] = {//??????  ???????? ????????
    "Ogurec",
    "Yabloko",
    "Apel'sin",
    "Pomidor",
    "Morkov'",
};
const int N_PLANTS = 5;
int plantsTime = {48};
int FlagTextChanged = 0;

int activeItem = 0;//???????? ????: ?????????????? ?? ??????
char num[3];

int plantsItems[5] = {0,3,0,0,0};//????????? ???????? ??? ??????? ????

void updateItem() {
    Lcd_Clear();
    Lcd_Set_Cursor(1, 1);
    sprintf(num , "%d%c", activeItem + 1, '.');
    Lcd_Write_String(num);
    
    Lcd_Set_Cursor(1, 3);
    Lcd_Write_String(plants[plantsItems[activeItem]]);
    FlagTextChanged = 1;
}

void interrupt isr() {
    if (INTF) {
        INTF = 0; // reset interrupt flag/
        updateItem();
    }
    if (RBIF || RBIE) {
        if (RB6) {//????????????? ???????? ? ?????
            plantsItems[activeItem] = (plantsItems[activeItem] + 1) % N_PLANTS;
            updateItem();
        }
        if (RB7) {//????????? ???? (Next item)
            activeItem = (activeItem + 1) % N_PLANTS;
            updateItem();
        }
        
        RBIF = 0;
    }
}

int main() {
    TRISA = 0b00001111;
    TRISB = 0B11000111;
    PORTA = 0;
    PORTB = 0;

    INTF = 0; //reset the external interrupt flag
    INTEDG = 1; //interrupt on the rising edge
    INTE = 1; //enable the external interrupt
    GIE = 1; //set the Global Interrupt Enable
    RBIE = 1;
    RBIF = 0;
    unsigned int a;
    TRISD = 0x00;
    Lcd_Init();
    while (1) {
        if (FlagTextChanged == 1) {
            FlagTextChanged = 0;
            __delay_ms(10000);
            __delay_ms(10000);
            __delay_ms(10000);
            __delay_ms(10000);
        }
        Lcd_Clear();
        Lcd_Set_Cursor(1, 1);
        Lcd_Write_String("Ogurec");
        Lcd_Set_Cursor(2, 1);
        Lcd_Write_String("MPLAB XC8");
        __delay_ms(2000);

    }
    return 0;
}

 

VirtualBox_OwnWIQAVM_10_04_2018_13_01_19.thumb.png.5c6ba88e5b93ab2ee9f05ce436aae2fa.png

Изменено пользователем Alex
Убрал код в скрытый текст
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

1 час назад, perec200 сказал:

Пример: время срабатывания RA1 в 12:15 логическая единица должна быть установлена на 5 минут после истечения этого времени выход выдаёт сигнал 0.

А где у Вас в коде система времени ? Когда она будет, то Ваша задача решится элементарно. Время включения и время выключения знаем, что ещё нужно ?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 час назад, perec200 сказал:

в 12:15 логическая единица должна быть установлена на 5 минут после истечения этого времени выход выдаёт сигнал 0.

Может посоветуете свои варианты как лучше сделать

Если нужна привязка к времени суток, то лучше добавить в схему часы реального времени (микросхему RTC) и батарейку. Можно конечно сделать и программно, но защитить весь контроллер от пропадания питания сложнее.

Управление портом при любом варианте исполнения счётчика времени аналогично алгоритму "будильника" - установленное время сравнивается с текущим. Если текущее больше будильника "включить" и меньше будильника "выключить", то порт включается, иначе выключается. Блок проверки будильников вызывается с заданным интервалом. То, что в порт периодически будет подаваться одна и та же команда подряд, даже хорошо, на случай восстановления случайных сбоев.

Управление устройством так же будет очень похоже на управление будильником: установка текущего времени и установка для каждого канала времени включения и времени выключения.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

5 часов назад, perec200 сказал:

полив через заданные промежутки времени.

  Показать содержимое


#define _XTAL_FREQ 8000000

#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include <xc.h>
#include "lcd.h";
#include <stdio.h>

// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG



char* plants[] = {//??????  ???????? ????????
    "Ogurec",
    "Yabloko",
    "Apel'sin",
    "Pomidor",
    "Morkov'",
};
const int N_PLANTS = 5;
int plantsTime = {48};
int FlagTextChanged = 0;

int activeItem = 0;//???????? ????: ?????????????? ?? ??????
char num[3];

int plantsItems[5] = {0,3,0,0,0};//????????? ???????? ??? ??????? ????

void updateItem() {
    Lcd_Clear();
    Lcd_Set_Cursor(1, 1);
    sprintf(num , "%d%c", activeItem + 1, '.');
    Lcd_Write_String(num);
    
    Lcd_Set_Cursor(1, 3);
    Lcd_Write_String(plants[plantsItems[activeItem]]);
    FlagTextChanged = 1;
}

void interrupt isr() {
    if (INTF) {
        INTF = 0; // reset interrupt flag/
        updateItem();
    }
    if (RBIF || RBIE) {
        if (RB6) {//????????????? ???????? ? ?????
            plantsItems[activeItem] = (plantsItems[activeItem] + 1) % N_PLANTS;
            updateItem();
        }
        if (RB7) {//????????? ???? (Next item)
            activeItem = (activeItem + 1) % N_PLANTS;
            updateItem();
        }
        
        RBIF = 0;
    }
}

int main() {
    TRISA = 0b00001111;
    TRISB = 0B11000111;
    PORTA = 0;
    PORTB = 0;

    INTF = 0; //reset the external interrupt flag
    INTEDG = 1; //interrupt on the rising edge
    INTE = 1; //enable the external interrupt
    GIE = 1; //set the Global Interrupt Enable
    RBIE = 1;
    RBIF = 0;
    unsigned int a;
    TRISD = 0x00;
    Lcd_Init();
    while (1) {
        if (FlagTextChanged == 1) {
            FlagTextChanged = 0;
            __delay_ms(10000);
            __delay_ms(10000);
            __delay_ms(10000);
            __delay_ms(10000);
        }
        Lcd_Clear();
        Lcd_Set_Cursor(1, 1);
        Lcd_Write_String("Ogurec");
        Lcd_Set_Cursor(2, 1);
        Lcd_Write_String("MPLAB XC8");
        __delay_ms(2000);

    }
    return 0;
}

 

Когда идет дождь будете тоже поливать?

А если земля мокрая (пасмурная погода, похолодало - земля плохо сохнет), то тоже будете заливать?

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

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Делал похожую задачу, только включал промышленный пресс для прогрева в нужный день и час. Согласен с коллегами со всем что выше сказано, добавлю только что кнопок 3 шт - определённо мало (точнее не удобно пролистывать параметры и менять их), надо 5, к тому же полно выводов у контроллера ещё осталось. Можно конечно и без часов RTC с батарейкой а просто указать интервал времени для каждого крана и длительность импульса открытия- Работает с момента включения. Так как начинающий то это самое то. 5 кранов - 5 независимых программных счётчиков на базе любого аппаратного таймера настроенного на  опр. интервал, зная его период считаем секунды-потом минуты-часы.... С чипом RTC хорошо, но накладывается куча всего - I2C/SPI , преобразование BCD/INT/BCD и много всего именно по электронике.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Помогите, пожалуйста, с кодом 1000 сайтов прошерстил ничего не работает.
Мне нужно к примеру каждую минуту, чтобы порт RA1 загорался. Так мне будет легче понять логику работы.
 

Пробовал ЧТО-ТО ТАКОЕ СДЕЛАТЬ но компилятор ругается на PR1
Это код с таймером в 10 секунд. Он у меня не работает

#include <p24fj128ga010.h> 
_CONFIG2(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_HS&FNOSC_PRI) 
#define SYSCLK 8000000 
#define t1 0.5 
#define PREG SYSCLK/2*t1/256 
#define DELAY 20 
#define PORTB_0 PORTBbits.RB0 
void main(void) 
{ 
   int cnt = 0; 
   AD1PCFG = 0xffff; 
   TRISB = 0xfffe; 
   PR1 = PREG; 
   TMR1 = 0; 
   T1CON = 0x8030; 
   while (1) 
   { 
     if (_T1IF == 1) 
     { 
       _T1IF = 0; 
       if (cnt == DELAY) 
       { 
         cnt = 0; 
         PORTB_0 = ~PORTB_0; 
       } 
       cnt++; 
     } 
   } 
}

 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, perec200 сказал:

компилятор ругается на PR1

Там, где он "ругается", написано, почему. Прочитайте сообщение об ошибке и исправьте.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...