Jump to content
cardovsckij

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

Recommended Posts

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

в электронике и работе с 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

Share this post


Link to post
Share on other sites

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

1111111111111111.JPG

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

I – программа

...

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

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


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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Как управлять SiС-транзистором?

Преимущества карбид-кремниевых транзисторов (SiC MOSFET) – высокий КПД, повышенная, по сравнению с биполярными транзисторами с изолированным затвором (IGBT), частота переключения, экономия места на печатной плате. Для управления SiC MOSFET используются специализированные драйверы: как изолированные от транзистора, так и неизолированные. Выбор драйвера и расчет оптимального режима его работы играет ключевую роль в эффективной работе всего устройства на базе SiC MOSFET.

Подробнее

По первой программе так?

IMG-81df508c69774ab24e98725c4b7bf36a-V.jpg


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

Share this post


Link to post
Share on other sites
                     

Как упростить выбор ИП для промышленного применения?

Компания Mean Well выпускает широкий перечень встраиваемых источников питания с креплением на шасси, имеющих, на первый взгляд, схожие характеристики. Статья расскажет о ключевых особенностях выпускаемых семейств и упростит выбор источника питания для промышленного применения.

Подробнее

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

все помогут

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

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

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

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

800 руб/час


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

Share this post


Link to post
Share on other sites
                     

Преимущества новых высоковольтных SOI-драйверов Infineon

При производстве драйверов силовых транзисторов компания Infineon использует различные технологии: JI, SOI, CT. Драйверы, выполненные с применением технологии SOI, имеют целый ряд преимуществ по сравнению с классическими JI-драйверами. В статье рассматриваются эти преимущества на примере новых семейств драйверов 650 В 2ED210x и 2ED218x.

Подробнее

@солар прав.

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

9 hours ago, cardovsckij said:

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

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

Share this post


Link to post
Share on other sites

У меня тоже бывает пропадают сообщения, отослал, а позже уже его нет:unknw:

Глюк какой то.

Share this post


Link to post
Share on other sites
Guest PEF

 солар мне думается что ваша калькуляция раза в 3-4 раздута. Что вы собираетесь отлаживать если программа написана правильно?

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
17.03.2020 в 11:39, солар сказал:

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

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

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

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

800 руб/час

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

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

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

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

Share this post


Link to post
Share on other sites
Posted (edited)

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

Учусь писать программы для 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

Edited by Falconist

Share this post


Link to post
Share on other sites
31 minutes ago, Денис Е said:

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

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

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

 

Share this post


Link to post
Share on other sites
2 часа назад, Денис Е сказал:

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
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  , смотреть на ваш код просто печально.

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

Edited by Falconist

Share this post


Link to post
Share on other sites
1 час назад, Денис Е сказал:

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
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
}

 

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

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

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

Share this post


Link to post
Share on other sites
2 часа назад, Денис Е сказал:

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

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

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

Share this post


Link to post
Share on other sites
3 hours ago, Денис Е said:

tick_count += tick_count; 

PORTA = tick_count

 

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

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

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

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

Share this post


Link to post
Share on other sites

Добрый день!

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

    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;
}

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

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

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

Share this post


Link to post
Share on other sites
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);}

 

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...