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

таймер времени на 5 каналов


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

Доброе время суток. 

в электронике и работе с PIC  контролерами новичок так что не судите.

Накидал схему на микроконтроллере подскажите есть ли ошибки в ней и какие.

Также работа этого девайса должна быть такой.

Кнопка SW5 служит для экстренного отключения (ОС1-ОС5 выключаются)

Кнопка SW6 служит для выбора программы микроконтроллера

I – программа

Нажимаем кнопку пуск SW4. ОС1 включилась и работает (0-20 мин), по истечению заданного времени, включается ОС2 по истечению заданного времени (0-20 мин) ОС1 и ОС2 отключаются. После чего должно включиться ОС5 с задержкой времени (0-20 мин). После включения ОС5 (и выдержкой 3 секунды) происходит включение ОС1 включилась и работает (0-20 мин), по истечению заданного времени, включается ОС2 по истечению заданного времени (0-20 мин), включается ОС3 по истечению заданного времени (0-20 мин), включается ОС4 по истечению заданного времени (0-20 мин) происходит остановка программы (следующий запуск осуществляется кнопкой пуск SW4) Если время таймера для ОС1-ОС4 задано 0 то программа пропускает эту позицию.

При повторном нажатии кнопки пуск SW4 программа не останавливается и не начинается заново.

I I – программа

Нажимаем кнопку пуск SW4. ОС1 включилась и работает (0-20 мин), по истечению заданного времени, включается ОС2 по истечению заданного времени (0-20 мин) ОС1 и ОС2 отключаются. После чего должно включиться ОС5 с задержкой времени (0-20 мин).

Пока ОС5 не включилась кнопка SW4 не работает.

После того как ОС5 сработало нажимаем кнопку SW4

Происходит включение ОС1 включилась и работает (0-20 мин), по истечению заданного времени, включается ОС2 по истечению заданного времени (0-20 мин), включается ОС3 по истечению заданного времени (0-20 мин), включается ОС4 по истечению заданного времени (0-20 мин) происходит остановка программы (следующий запуск осуществляется кнопкой пуск) Если время таймера для ОС1-ОС4 задано 0 то программа пропускает эту позицию.

При повторном нажатии кнопки пуск SW4 программа не останавливается и не начинается заново.

 

На дисплеи отображается все время до завершении программы.

Кто поможет написать программу для микроконтроллера?

  

1111111111111111.spl7

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

Так будет проще всем:

1111111111111111.JPG

12 минут назад, cardovsckij сказал:

I – программа

...

I I – программа

Очень много условий. Вам для чего этот таймер?

Я не раздаю удочки. Я продаю рыбу.

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

Оптронами будет управляться плата управления электродвигателя. ОС5 за реверс его а остальные ступенчатое регулирование скоростей.

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

все помогут

Для полноты картины:

1. Разработка алгоритма 8 часов.

2. Написание текста программы 45 часов.

3. Отладка 50 часов.

800 руб/час

Я не раздаю удочки. Я продаю рыбу.

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

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

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

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

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

@солар прав.

3 часа назад, cardovsckij сказал:

Накидал схему

Схему "накидать" проблем нет, 10-15 минут и готово.

А вот что бы она ожила, времени надо гораздо больше и голова с необходимым уровнем знаний.

Это для ясности.

Или собирать шкаф (всё равно нужна силовая часть)  с реле времени, пускателями и т.п..

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

Кто удалил мое сообщение для ТС? И зачем?.. 

Еще раз для ТС.

Если вы пишете 

9 hours ago, cardovsckij said:

Кто поможет написать программу

это значит: ВЫ пишете программу, вам помогают.  Если вы хотите, чтобы кто-то написал программу за вас - то так и пишите. Для этого и раздел есть специальный: "Работа".  Или вы рассчитываете на халяву? 

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

наличие правильно написанной программы не означает наличие правильного алгоритма работы озвученного изначально заказчиком. и 50 часов это еще очень оптимистично

например уже в самом ТЗ изначально присутствуют логические парадоксы, вот один из них

17.03.2020 в 06:46, cardovsckij сказал:

включается ОС4 по истечению заданного времени (0-20 мин) происходит остановка программы (следующий запуск осуществляется кнопкой пуск SW4) Если время таймера для ОС1-ОС4 задано 0 то программа пропускает эту позицию.

При повторном нажатии кнопки пуск SW4 программа не останавливается и не начинается заново.

что этим хотел сказать ТС ????

и таких я только в ТЗ вижу штук пять

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

17.03.2020 в 11:39, солар сказал:

Для полноты картины:

1. Разработка алгоритма 8 часов.

2. Написание текста программы 45 часов.

3. Отладка 50 часов.

800 руб/час

Я бы сюда добавил в самое начало:

- вытягивание из заказчика клещами что же ему нужно на самом деле;

- объяснение на примерах, что его идея мягко говоря не работоспособна, так не делают и подходить к решению задачи нужно с другой стороны;

А вот потом уже разработка РАБОЧЕГО алгоритма и т.д. и т.п.

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

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

Учусь писать программы для pic18f4550 в MPLAB X IDE v5.30, версия языка С99. При попытке помигать светодиодом, возникает проблема с прерываниями от таймера 0. Светодиод мигает, но время его горения не более 30 микросекунд, едва различимо глазом (в протеусе вообще ничего не мигает)... В коде какая-то ошибка, не могу определить что именно не так. Перебрал кучу вариантов, толку нет. Код, скопированный из мануала компилятора тоже не работает почему-то.

Подскажите, хотя бы в какую сторону копать?

Код без конфигурационных битов:

#include <xc.h>
#pragma code high_vector=0x08
#define _XTAL_FREQ 8000000

void __interrupt(high_priority) ISR(unsigned int tick_count)
{

tick_count += tick_count;

if (tick_count>32) tick_count=0x01;
     
PORTA = tick_count;

INTCONbits.TMR0IF=0;

}

void main(void)
{
    TRISA = 0x00;    
    PORTA = 0x7F;
    IPEN = 1;
    GIEL = 1;
    TMR0IP = 1;
    TMR0H = 0xFF;
    INTCON=0b11100000;
    T0CON=0b10000100;
    TRISB0 = 1;
    TRISB1 = 1;

return;

}

Осцилограмма.jpg

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

31 minutes ago, Денис Е said:

Учусь писать программы

В Вашей программе столько ошибок и несуразностей, что руки не поднимаются всё объяснять!

Начните моргать светодиодом с простейшей программы без всяких таймеров и прерываний.

 

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

2 часа назад, Денис Е сказал:

Учусь писать программы

это похвально...

 

2 часа назад, Денис Е сказал:

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

ничего похожего на ваш код в мануале нет...

сходите сюда и скачайте любой пример оформления для PIC18  , смотреть на ваш код просто печально.

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

29.03.2020 в 01:30, IMXO сказал:

ничего похожего на ваш код в мануале нет...

То, что я вставил в сообщение хоть как-то работает...

Про код из мануала я имею в виду вот этот (стр. 142 мануала компилятора):

Но они не работают сосвем...

Танцы с портами типа PORTA &= 0xFF, никакого влияния не оказывают;

Имя функции   tc0Int(void) тоже не на что не влияет, функция перестаёт работать, если указана без параметров (вместо tc0Int(void) ставлю tc0Int(tick_count), и более-менее начинает работать...)

От того, глобальная tick_count или локальная тоже ничего не меняется, объявление её статической тоже не на что не влияет. Присвоение типа Volitile тоже не решает проблему...

int tick_count;

void __interrupt(high_priority) tcInt(void)

{

if (TMR0IE && TMR0IF)

{ // any timer 0 interrupts?

TMR0IF=0; ++tick_count;

}

if (TMR1IE && TMR1IF)

{

// any timer 1 interrupts?

TMR1IF=0;

tick_count += 100;

} // process other interrupt sources here, if required return;

}

И вот этот (оттуда же):

void __interrupt(irq(TMR0),high_priority) tc0Int(void)

{

TMR0IF=0;

++tick_count;

return;}

void __interrupt(irq(TMR1),high_priority) tc1Int(void)

{

TMR1IF=0;

tick_count += 100;

return;

}
28.03.2020 в 23:34, Yurkin2015 сказал:

В Вашей программе столько ошибок и несуразностей, что руки не поднимаются всё объяснять!

Начните моргать светодиодом с простейшей программы без всяких таймеров и прерываний.

Без прерываний я уже помигал, всё работает.

Сейчас задача освоить прерывания.

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

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

И время между вспышками получается как рассчитанное, значит, таймер работает...

29.03.2020 в 01:30, IMXO сказал:

сходите сюда и скачайте любой пример оформления для PIC18  , смотреть на ваш код просто печально.

Спасибо, попробую...

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

1 час назад, Денис Е сказал:

Танцы с портами типа PORTA &= 0xFF, никакого влияния не оказывают;

TRISx  направление порта

PORTx чтение порта

LATx  установка выхода порта

1 час назад, Денис Е сказал:

И вот этот (оттуда же):

да блин вы там че мануал на хай-тек читаете?, в ХС8 этого нет  в мануале... MPLAB_XC8_C_Compiler_User_Guide.pdf, если че страница 199...

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

7 минут назад, IMXO сказал:

PORTx чтение порта

LATx  установка выхода порта

Применял LATA вместо PORTA, и вместе их их применял, работа программы оставалась такой же. 

До этого переключение светодиодов было при помощи функции switch, подумал, она не работает в прерываниях, заменил на умножение:

code: 

tick_count += tick_count; 

PORTA = tick_count;

(было и LATA=tick_count; результат тот же). 

7 минут назад, IMXO сказал:

если че страница 199...

Я скачал мануал с оф. сайта. Только ощущение, что там такой же пример кода (у меня interrupt не воспринимается, нужно добавлять двойное подчёркивание перед функцией, я понял это из-за того, что версия языка не C90, а C99):

code:

int tick_count;
void interrupt tc_int(void)
{
    if (TMR0IE && TMR0IF) {
        TMR0IF=0;
        ++tick_count;
        return;
    }
    // process other interrupt sources here, if required
}

 

Я уже вариантов тысячу перебрал. Ощущение, что по кругу хожу, вроде близко ответ, а понять не могу... 

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

Спасибо за помощь. 

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

2 часа назад, Денис Е сказал:

вроде близко ответ, а понять не могу... 

остальные ответы в ссылке на оформление кода...

 вопросы простые : вы в куда из мейна выйти в коде пытаетесь?  и в куда потерян бесконечный цикл?

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

3 hours ago, Денис Е said:

tick_count += tick_count; 

PORTA = tick_count

 

6 hours ago, Денис Е said:

Почему при выходе из прерывания, светодиод гаснет?

Переменная tick_count всегда равна 0, можно сколько угодно складывать саму с собой. Вот и получается, что порт устанавливается в 1 в  main(), а сбрасывается в 0 в прерывании.

Опять же в main() нет бесконечного цикла, программа выходит из main() и снова попадает на начало, начинает по-новой устанавливать порты и регистры.

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

Добрый день!

Код полечился добавлением пустого бесконечного цикла в тело основной программы мэйн:

    while (1)
    {
        
    }

и условием, присваивающим параметру tick_count значения 0x01 при первом запуске:

if (tick_count == 0) tick_count=0x01;

...

В настоящее время мигание светодиодов осуществляется прерываниями при помощи следующего кода:

#include <xc.h>
#define _XTAL_FREQ 8000000
volatile int tick_count = 0x01;

void main(void)
{ 
    TRISA = 0;    
    LATA = 0;
    TRISB0 = 1;
    TRISB1 = 1;
    IPEN = 1;
    GIEL = 1;
    TMR0IP = 1;
    TMR0H = 0x00;
    TMR0L = 0x00;
    INTCON=0b11100000;
    T0CON=0b10000100;

    while (1)
    {
    
    }
}

void __interrupt() my_isr(void)
{
    tick_count += tick_count;
           
    if (tick_count>32) tick_count=0x01;
        
    LATA = tick_count;
           
    TMR0IF=0;

    return;
}

Не знаю, насколько он правильный с точки зрения опытных программистов, но работает.

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

В общем, большое спасибо за помощь, буду учиться дальше...

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

35 минут назад, Денис Е сказал:

насколько он правильный

вот это:

tick_count += tick_count;
    if (tick_count>32) tick_count=0x01;

лучше записать так:

 tick_count <<=1;
    if (tick_count&(1<<6)) tick_count=(1<<0);

или так:

if (tick_count&0b00011111) {tick_count <<=1;}
       else {tick_count=(1<<0);}

 

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

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

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

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

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

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

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

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

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

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

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