Например TDA7294

Форум РадиоКот :: Просмотр темы - Нестабильность из-за задержек
Форум РадиоКот
https://radiokot.ru/forum/

Нестабильность из-за задержек
https://radiokot.ru/forum/viewtopic.php?f=57&t=176597
Страница 5 из 8

Автор:  Ivanoff-iv [ Вт апр 20, 2021 14:08:14 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Были бы макросы чуть гибче (или я чуть умней :oops: :))) )... применение метода стало бы ещё проще - убрались бы имена потока как минимум из задержек и завершения, убрались бы номера задержек... и задержки бы стали ровно как стандартный встроенный делай - только с одной цифрой = время задержки. ну, впринципе и так получилось не сильно сложно...
Вот, ещё примеры - задержка внутри цикла, моргушки с условием и без, обработка долгого кода с понижением его приоритета...
код постарался по максимуму снабдить комментариями.
Спойлер
Код:
#include <mega8.h>
#include <delay.h>

// частота цикла в кГц
#define Speed_temp            0.1
//начинаем поток (имя потока)
#define StartPotok(pot) {static unsigned int  pot##_EscapeIteration=1;                           \
                         static unsigned char pot##_StepOfPotok=0;                               \
                             if (pot##_EscapeIteration) {(pot##_EscapeIteration)--;              \
                                 if ((pot##_EscapeIteration)==0) {                               \
                                     switch (pot##_StepOfPotok){case 0: (pot##_EscapeIteration)=0
//задержка в потоке (имя потока, номер задержки, длительность задержки-циклов)
#define Delay_n(pot,step,tim) pot##_StepOfPotok=step; pot##_EscapeIteration=(tim)+1;             \
                              goto pot##_End; case(step): (pot##_EscapeIteration)=0
//задержка в потоке (имя потока, номер задержки, длительность задержки-мс)
#define Delay_t(x,step,tim)   Delay_n(x,step,(tim)*(Speed_temp))
//заканчиваем поток (имя потока)
#define EndPotok_n(pot,tim)   default: pot##_EscapeIteration=(tim)+1; pot##_StepOfPotok=0; pot##_End:};};};}
#define EndPotok_t(pot,tim)   EndPotok_n(pot,(tim)*(Speed_temp))
#define EndPotok(pot)         EndPotok_n(pot,0)

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{PORTC.6=1; //diagnostic out

#asm("sei") //подобие вытесняющей многозадачности (без него - кооперативный)
/*в задачу, которую прервало прерывание мы не попадём,
т.к. пока она не отработает - вход в неё блокируется
поэтому в прерывании выполнятся остальные задачи,
прерывание завершится и выполнение приостановленной задачи возобновится*/

StartPotok(key_trigg); //// кнопка-триггер с антидребезгом
if(!PINC.2)                  //проверка
    {
    Delay_t(key_trigg,3,10); //задержка 10 ms (номера могут быть не по порядку, главное, чтоб не повторялись и были от 1 до 255)
    if(!PINC.2)              //повторная проверка
        {
        PINC.0=1;            // переключение d9 (записью 1 в регистр PIN производится переключение 1->0 0->1 порта)
        do  {
            Delay_t(key_trigg,1,0);
            }while (!PINC.2);//ждём отпускания
        };
    }
EndPotok(key_trigg);
       
StartPotok(morgunchik);      // моргунчик d10
if(PINC.0) 
    {
    PORTC.1=1;
    Delay_t(morgunchik,1,200);//delay_ms(200);
    PORTC.1=0;
    Delay_t(morgunchik,2,200);//delay_ms(200);
    }; 
EndPotok(morgunchik);

StartPotok(morgD11);          // моргунчик d11 - проверка что мк работает
PINC.3=1;                     //(моргает всегда, т.к. нет запрещающих моргание условий)
Delay_t(morgD11,1,190);       //моргает чуть быстрее чем d10
EndPotok(morgD11);

//приоритет зависшей задачи понижается она продолжит выполняться но только в фоне
//если зависнет 2я задача - первая зависшая будет остановлена, пока не развиснет 2я
StartPotok(largeoperation);   //долгая, возможно зависшая задача...
PORTC.4=1;                    //мигаем желтым светодиодом D13
delay_ms(300);                //вот он - зависон (не знаю, какими вычислениями занять, поэтому просто делай)
PORTC.4=0;                   
Delay_t(largeoperation,1,300);//когда зависание пройдёт - приоритет задачи будет восстановлен
EndPotok(largeoperation);     //окончание зависания определяется по достижению меток задержек или конца потока.

//не оформлять код в поток можно только при полной уверенности,
//что он успеет отработать за время между прерываниями и не зависнет!
//очень рекомендую так не делать, и оформить его в поток.
if (!PIND.0) {PORTB.0=1; PORTB.1=0; PORTB.2=0; PORTB.3=0;};
if (!PIND.1) {PORTB.1=1; PORTB.0=0; PORTB.2=0; PORTB.3=0;};
if (!PIND.2) {PORTB.2=1; PORTB.0=0; PORTB.1=0; PORTB.3=0;};
if (!PINC.5) {PORTB.5=1; PORTB.0=0; PORTB.1=0; PORTB.3=0;};
if (!PIND.3) {PORTB.3=1; PORTB.0=0; PORTB.1=0; PORTB.2=0;};
/////////   2-ая   группа кнопок
if (!PIND.4) {PORTB.4=1; PORTB.5=0; PORTB.6=0; PORTB.7=0;};
if (!PIND.5) {PORTB.5=1; PORTB.6=0; PORTB.7=0; PORTB.4=0;};
if (!PIND.6) {PORTB.6=1; PORTB.4=0; PORTB.5=0; PORTB.7=0;};
if (!PIND.7) {PORTB.7=1; PORTB.4=0; PORTB.5=0; PORTB.6=0;};
}

void main(void)
{
PORTB = 0x00; PORTC = 0xFC; PORTD = 0xFF;
DDRB  = 0xFF; DDRC  = 0x5B; DDRD  = 0x00;

//Timer/Counter 1: Interrupt Period = 10 ms
TCCR1A=(0<<COM1A0) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (2<<CS10);
TCNT1=0x0000;
OCR1A=0x270F;
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

MCUCR=(1<<SE) | (0<<SM0);      //sleep mode enable, mode idle
#asm("sei")                    // Global enable interrupts
while (1)
    {
    //тут записываются самые низкоприоритетные задачи... наприер сон...
    PORTC.6=0;      //diagnostic out  D12
//на портС.6 (ресет) выведен сигнал загрузки МК когда АЛУ работает, там лог1, когда простаивает/спит - лог0
    //#asm("sleep") //disabled for proteus
    }
};
СпойлерИзображение


Вложения:
1.cof.zip [1.45 KiB]
Скачиваний: 315
8kn-8led.zip [17.74 KiB]
Скачиваний: 307
2021-04-20_15-35-49.png [29.8 KiB]
Скачиваний: 652

Автор:  Самсусамыч [ Вт апр 20, 2021 14:32:48 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Прочитал все страницы и не понял, что тут за алгоритм выдумывается? Какая задача поставлена? Просто стало любопытно... Если прочитать первый пост ТС, то алгоритм выходит проще простого. Но так как дискуссия на 5 страниц – подозреваю что что-то делается в дополнении к поставленной задачи ТС. Или я ошибаюсь?
Не смотрел алгоритм ТС но из его первого поста не понятно, могут ли быть нажаты две кнопки одновременно в одной группе и как должен отработать алгоритм – включить оба выхода соответствующим нажатым кнопкам или выбрать какой-то приоритет между этими кнопками?
И ещё, на порт РD подключаются кнопки с фиксацией или без фиксации?

ЗЫ. Я так понимаю ТС уже всё для себя решил и тема теперь живёт по инерции – верно?

Автор:  Ivanoff-iv [ Вт апр 20, 2021 14:37:54 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Самсусамыч, Привет!
Да, первоначально вопрос стоял (в переводе): почему программные задержки в одной части кода мешают работе другой части кода и что нужно сделать, чтобы не мешали...
этот вопрос породил небольшое противостояние на тему многозадачности, который почему-то перешел с темы многозадачности на тему опроса кнопок...
ПС кнопки без фиксации,
если я правильно понял, то кроме поставленного вопроса алгоритм Sergbernа, его полностью устраивал.

Автор:  Demiurg [ Вт апр 20, 2021 14:42:23 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Обсуждение касается и вопросов ТС, и живёт своей жизнью. Лично я учился в том числе и на подобных обсуждениях. Народ предлагает свои способы решения задач, обсуждает достоинства и недостатки, обмениваются опытом. Порой в подобных обсуждениях можно найти решения каких то своих проблем. В том числе и достаточно обширных, необязательно локальных.

Добавлено after 2 minutes 14 seconds:
Ivanoff-iv, опрос кнопок предполагает обработку дребезга контактов. А это таймеры, ну и так далее. Так что эта тема не просто близка, она напрямую связана со псевдопараллельностью процессов.

Автор:  Ivanoff-iv [ Вт апр 20, 2021 14:50:00 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

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

Автор:  Самсусамыч [ Вт апр 20, 2021 15:07:55 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Привет!!! :beer:
кнопки без фиксации

Раз кнопки бес фиксации, то получается пока удерживаешь кнопку нажатой – соответствующий выход имеет высокий уровень? А как отпустил кнопку – на выходе появился низкий уровень?
Как с вопросом по нажатию двух кнопок в одной группе? Как должно работать?

ЗЫ. Мне тоже нравится светиками помигать… :)

Добавлено after 2 minutes 28 seconds:
Порой в подобных обсуждениях можно найти решения каких то своих проблем.

Проблем нет… просто задача сверх простая, потому можно и мне поучаствовать… :))

Автор:  Demiurg [ Вт апр 20, 2021 15:09:48 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

А вы сами себе задачу поставьте. Необязательно смотреть в задачу ТС-а. Представьте, что вы делаете автомат световых эффектов. С управлением от кнопок. Какой алгоритм захотите, такой и будет.

Автор:  Самсусамыч [ Вт апр 20, 2021 15:31:36 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

А вы сами себе задачу поставьте.

Мне так не интересно… :)

Автор:  Ivanoff-iv [ Вт апр 20, 2021 16:12:13 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

думаю, что ТС не думал о нжатии сразу нескольких кнопок...
да и дело тут уже не в алгоритме мигания светодиодами, а впринципе... в принципе построения кода...
я уже отклонился от линии автора... (добавил ещё кнопок и светодиодов..., но те что стоят изначально - работают по алгоритму автора).
кстати Самсусамыч, у меня был подобный распределённый диспетчер и для АБ... не помню уже показывал ли я его тебе, если нет - поищу...

Автор:  Самсусамыч [ Вт апр 20, 2021 16:26:52 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

кстати Самсусамыч, у меня был подобный распределённый диспетчер и для АБ...

Спасибо большое, но не ищи… :beer: тут тоже есть диспетчеры для АВ… http://www.forum.getchip.net/viewforum. ... 6e68ccd6bd :)

Добавлено after 7 minutes 17 seconds:
думаю, что ТС не думал о нжатии сразу нескольких кнопок...

А как у ТС сделан алгоритм выполнения работы выходов одной группы? По принципу однорядных кнопок П2К (одну нажал, все остальные отключились)? Или ещё как-то?

Автор:  Ivanoff-iv [ Вт апр 20, 2021 16:38:25 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

4 подряд... опрос следующей кнопки, если она нажата - затирает состояние, оставленное предыдущими итерациями и выставляет на 4 вывода порта свой паттерн. паттерн прост горит тьлько тот светодиод из 4х, какая кнопка нажата. паттерн выставляется побитной записью в порт.
таких конструкций 2, одна работает на битах 0-3, вторая на битах 4-7.

Добавлено after 1 minute 48 seconds:
т.е. да как П2К, но при одновреме6ом нажатии горит только втарший

Автор:  Самсусамыч [ Вт апр 20, 2021 16:42:03 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Ага понял… :beer: пришла мысль по данному поводу… попробую реализовать и посмотреть, что получится. :write:

Автор:  Ivanoff-iv [ Вт апр 20, 2021 18:03:28 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

уточню: кнопки без механической фиксации, программно: 1 кнопка - триггер, и 2 группы по 4 кнопки типа "кто последний тот и папа" :)))

Автор:  Самсусамыч [ Вт апр 20, 2021 18:26:11 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

2 группы по 4 кнопки типа "кто последний тот и папа" :)))

:beer:

Вот и мой вариант… нажатие кнопки включает соответствующий светик группы, отключая при этом ранние включенные светики этой группы. Группы независимы… ну и кнопка для двух светиков…
Первая группа:
Кнопки:
РD0; PD1; PD2; PD3.
Светики:
PB0; PB1; PB2; PB3.

Вторая группа:
Кнопки:
РD4; PD5; PD6; PD7.
Светики:
PB4; PB5; PB6; PB7.

Кнопка:
РС2.
Светики:
PС0; PС1.

Вложение:
Butt_OUT_a.hex


МК мега8 тактируется от внутреннего генератора на 8 МГц. :beer:

ЗЫ. Есть и фишка в алгоритме… если для включения очередного светика нажать и не отпуская её нажать любую другую кнопку из группы, то засветится следующий светик не гася предыдущий. Выключить светики можно нажав повторно на кнопку того светика который необходимо погасить. Второй светик останется включенным. Таким образом можно зажечь одновременно все 4 светика. Но можно эту фишку и убрать, изменив алгоритм. :beer:

Автор:  Dimon456 [ Вт апр 20, 2021 18:33:57 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Вроде ясно написано
Задача в следующем: группа 4кнопки-4светодиода ( для краткости в дальнейшем 4кн-4сд) с зависимым включением, таких групп две, сами группы между собой независимы.
думаю П2К.
Demiurg, ваш proc_device полностью переписывать надо.
Одним словом тот же самый алгоритм только в упакованном виде, если распаковать там целая портянка получится.
Честно говоря я ожидал большего, к примеру:
Код:
if (Set_Is_Key_Kn0_Pressed ())  a |= KEY_KN_0_BIT;
это должно было задаваться отдельной задачей, к примеру у меня
Спойлер
Код:
          if(PIND.0 == 0){
           if(count_p[0] < (BTN_LOCK_TIME)) count_p[0]++;
           else flag_g1.bit_t.b0=1; 
          } else { if(count_p[0]) count_p[0]--; }
 
          if(PIND.1 == 0){
           if(count_p[1] < (BTN_LOCK_TIME))count_p[1]++;
           else flag_g1.bit_t.b1=1; 
          } else { if(count_p[1]) count_p[1]--; }
обратите внимание, две задачи, даже у каждой кнопки свой дребезг, не только в +(нажали) ни и в -(отжали)

Хотите оберну в функцию?
Спойлер
Код:
void port_read (seg_pin *p)

  if(!(*p->port & p->or)) {
    if(p->pauza < (BTN_LOCK_TIME)) p->pauza++;
    else { p->flag=1; }
  } else { if(p->pauza) p->pauza--; p->flag=0;}
}

        if(flag0){
         flag0=0;
         port_read(&kn_k[0]);
         port_read(&kn_k[1]);
         port_read(&kn_k[2]);
         port_read(&kn_k[3]);
         port_read(&kn_k[4]);
         port_read(&kn_k[5]);
         port_read(&kn_k[6]);
         port_read(&kn_k[7]);
         port_read_trigger(&kn_k[8]);
        }
а вот светики
Спойлер
Код:
void port_write (flash seg_pin *p, unsigned char a, unsigned char data)
{   unsigned char s=1,i=0;
      for(i=0; i<a; i++, s<<=1){
      if (data & s)
         *p->port |= p->or;
         else
          *p->port &= ~(p->or);
      p++;
   }
}

        if(kn_k[0].flag) port_write(led_g1, sf(led_g1), 0b0001);
        else if(kn_k[1].flag) port_write(led_g1, sf(led_g1), 0b0010);
        else if(kn_k[2].flag) port_write(led_g1, sf(led_g1), 0b0100);
        else if(kn_k[3].flag) port_write(led_g1, sf(led_g1), 0b1000);
        else port_write(led_g1, sf(led_g1), 0b0000);
       
        if(kn_k[4].flag) port_write(led_g2, sf(led_g2), 0b0001);;
        else if(kn_k[5].flag) port_write(led_g2, sf(led_g2), 0b0010);
        else if(kn_k[6].flag) port_write(led_g2, sf(led_g2), 0b0100);
        else if(kn_k[7].flag) port_write(led_g2, sf(led_g2), 0b1000);
        else port_write(led_g2, sf(led_g2), 0b0000);
а вот как кнопки со светиками задаются
Спойлер
Код:
flash seg_pin led_g1[] = {
  pn_led(B,0),
  pn_led(B,1),
  pn_led(B,2),
  pn_led(B,3)
};

flash seg_pin led_g2[] = {
  pn_led(B,4),
  pn_led(B,5),
  pn_led(B,6),
  pn_led(B,7)
};

seg_pin kn_k[] = {
  pn_kn(D,0),
  pn_kn(D,1),
  pn_kn(D,2),
  pn_kn(D,3),
  pn_kn(D,4),
  pn_kn(D,5),
  pn_kn(D,6),
  pn_kn(D,7),
  pn_kn(C,2)
};
в любой последовательности, как расположишь, так и будет.

Автор:  Самсусамыч [ Вт апр 20, 2021 21:39:05 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

т.е. да как П2К, но при одновременном нажатии горит только старший

Сделал иначе… то есть пока не отпустишь кнопку в группе, другие из группы не реагируют. И это не зависит от последовательности (старшая/младшая). :beer:
Вложение:
Butt_OUT_b.hex

Автор:  Demiurg [ Вт апр 20, 2021 23:20:36 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Dimon456, в моем примере я показал только кнопку триггер. То есть, пример подавления дребезга, удержание, двухрежимный автоповтор. Держим кнопку, включается один автоповтор, держим дальше, долбит ещё быстрее. Включение одного светодиода, и мигалка. На тот момент ТС не ответил, когда я просил полное ТЗ. А код я тогда не стал глядеть. Не до того было. Я сейчас крайне занят. Ну а дальше вы все потянулись.
Как я уже писал, технически, на остальных кнопках подавление дребезга как бы можно и не делать, ну выставит программа порты ещё раз. Не айс, конечно. А дальше ТС перестал участвовать в теме.

Автор:  Starichok51 [ Ср апр 21, 2021 07:41:20 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

Самсусамыч, ну и кто в твоем хексе увидит твой алгоритм?
или ты думаешь, что народ кинется собирать макет и прошивать твой хекс, чтобы посмотреть его работу?

Автор:  NStorm [ Ср апр 21, 2021 08:05:46 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

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

Автор:  Starichok51 [ Ср апр 21, 2021 08:29:25 ]
Заголовок сообщения:  Re: Нестабильность из-за задержек

я это знаю, что он пишет на АБ.
брал я как-то у него один исходник - понять можно.

Страница 5 из 8 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/