Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Мигане на светодиод(и) ?
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=15883
Страница 1 от 3

Автор:  syscop [ Пет Апр 20, 2018 9:31 am ]
Заглавие:  Мигане на светодиод(и) ?

Става дума за микропроцесорна система, която по време на работа дава обратна връзка чрез светване, угасване, мигане на светодиод(и). Също така може да има и някакви звукови сигнали. Към момента нещата са направени на "парче" - където трябва светвам/гася чакам определено време и т.н. Този начин работи, но си има недостатъци.
Идеален вариант е нещо такова: върви някакъв процес, свети/мига определен диод. Ако нещо се счупи/промени или си мени цвета, или мига по-бързо(бавно).
Имам идея да направя таблица със състоянията на всички диоди и на определено време да я обхождам и променям това, което е смяна.
Какъв е правилният подход да се реализира такова поведение ?

Автор:  lcr [ Пет Апр 20, 2018 12:45 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Какъв е броят на състоянията, които трябва да се индикират и какъв е броят на светодиодите?

Би било добре да се помисли затова всички възможни състояния да се групират по степен на важност, респективно да се дефинира броят за всяка група. В практиката обикновено се ползват 3 - 4 групи: 1 - информативни, 2 - важни, 3 - критични, 4 - грешки.....

Автор:  syscop [ Пет Апр 20, 2018 12:54 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Различен, последно ми трябваше 1 rgb и един обикновен. Искам да направя нещо по-универсално, че всеки път да не се боря с едни и същи неща.

Автор:  lcr [ Пет Апр 20, 2018 1:04 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Аз бих разделил събитията на 3 групи, като за целта ползвам трите основни цвята.
За индикацията в дадена група (цвят), бих избрал едно от двете - честота на мигане или PWM (с период примерно 1 сек. и КЗ, който зависи от конкретното събитие). Съответно групите на събития трябва да имат различен приоритет.

Автор:  Pif [ Пет Апр 20, 2018 2:17 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Аз до колкото разбрах човека пита как да си организира програмата а не кой цвят кога да свети.
Щом задава такъв въпрос явно няма мениджер на задачите и рънва плейн код.

Или по време генерираш прекъсване и на всяко прекъсване сменяш състоянието като времето на прекъсване ще трябва да ти е най-бързото мигане. Или ползваш някой друг таймер дето прави нещо по време и знаеш колко е времето.
Майсторите ще ти кажат да ползваш RTOS.

Автор:  itso.t [ Пет Апр 20, 2018 2:24 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

А проблемът от какво естество е - времената за изчакване или искаш да организираш някакъв универсален модул "led blink" с който да управляваш светлините и зумера?

Автор:  syscop [ Пет Апр 20, 2018 3:09 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Колегата itso.t е най-близо до това, за което питам. Нещо (тук е проблема, не знам какво) като му кажа запали за 1 сек зеления диод и то да го свърши, от друго място като му кажа червен да мига през 1 сек за 10 секунди пак да го задейства. От трето място rgb да мига зелено, когато има данни от usb или някаква друга комуникация, отново да го направи. Относно rtos - заиграх се с nuttx, но и там стои същият въпрос - как е правилно да се организират нещата. Това ако го знам, ще напиша каквото ми трябва.

Автор:  ike [ Пет Апр 20, 2018 3:11 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Аз не разбрах какъв е процесора, какъв е ОС-а и на какъв език се пише.

Автор:  miro_atc [ Пет Апр 20, 2018 3:45 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

syscop написа:
Нещо (тук е проблема, не знам какво)


Това нещо се нарича опашка или още FIFO. Доколкото разбирам от няколко места ще пъхаш команди за LED-a. Затова ти е нужна синхронизация при пъхането. При различните архитектури има различни бързи методи за синхронизация, най-елементарния е просто забраняваш прекъсванията докато пишеш. Може и да има по-добри (примерно ексклузив достъп и т.н.).

Като цяло обаче идеята не е добра ми се струва. По 10-на секунди да трае един тип мигане означава междувременно нищо да не може да показваш. Най-често когато са много неща за показване се правят в поредица. Една голяма пауза след това по едно мигане за всяко нещо. Като мигането може да е кратко или продължително. За кратко - ОК, за проблем дълго. Ако имаш и цвят може за ОК да е зелено, за проблем червено, може и комбинации да вкараш. Въпросът е, че така е по-лесно за поддръжка щото потребителите няма нужда да помнят кое мигане за какво е. Достатъчно е да могат да броят само ;-)

Автор:  syscop [ Пет Апр 20, 2018 3:46 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Няма значение нито езика, нито процесора. Като разбера как трябва да изглеждат нещата писането на код няма да е трудно.
@miro_atc
Това за опашката го мислих/мисля го, но там може да има проблем при показване на събития, които не могат да чакат, т.е. ще трябва да има някаква система за приоритети.

Автор:  ike [ Пет Апр 20, 2018 4:14 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

syscop написа:
Няма значение нито езика, нито процесора. Като разбера как трябва да изглеждат нещата писането на код няма да е трудно.

За различните процесори и OS-и процеса е различен.

Автор:  Desert Leo [ Пет Апр 20, 2018 4:37 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

syscop написа:
Имам идея да направя таблица със състоянията на всички диоди и на определено време да я обхождам и променям това, което е смяна.

Таймер генерира прекъсване през определено време. При всяко прекъсване инкрементираш съответните броячи и проверяваш дали е изтекло времето на съответното светене и ако да - сменяш състоянието.

Автор:  Cekins [ Съб Апр 21, 2018 10:54 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

Аз го правя като един от системните таймери (на ниска честота - примерно 10Hz) върти някакъв байт, дума или квото ще да е и примерно най-младшия бит е състоянието на лед-а. Процеса който иска да се индицира на светодиод просто си слага каквото иска да индицира в съответния байт или дума. И ако е на 10 Hz 11001100 ще мига през 0.2 сек. а 10101010 ще мига през 0.1 сек. и т.н. Може и примерно таймера сам да си презарежда поредицата като я шифтне цялата - така докато процеса заявил мигане не запише 0, мигането/светенето си продължава. Не работя с ОС и идея си нямам как би станало там ама едва ли е много по-различно. Предполагам че е по-засукано ама като цяло едва ли е някаква космическа технология.

Автор:  relsys [ Нед Апр 22, 2018 11:00 am ]
Заглавие:  Re: Мигане на светодиод(и) ?

Така както го описаха колегите, ето го и като код за PIC18 в най-простия му вид.
Можеш да добавиш още изходи и проста логика кога каво да се зарежда.

Код:
#define _GEAR_1  0b0000000000000001
#define _GEAR_2  0b0000000000000101
#define _GEAR_3  0b0000000000010101
#define _GEAR_4  0b0000000001010101
#define _GEAR_5  0b0000000101010101
#define _GEAR_N  0b0000000000111111
#define _GEAR_R  0b0000001111111111
#define _GEAR_E  0b0011001100110011

#define led_gear LATD.B5

u16 gear_pattern, gear_cnt = 16;

void int_LOW() iv 0x0018 ics ICS_AUTO
{
  if (TMR0IF_bit)
    {
      TMR0IF_bit = 0;
      TMR0H         = 0x79;
      TMR0L         = 0xB9;
 
      led_gear = gear_pattern & 0x0001;
      gear_pattern >>= 1;
      gear_cnt++;
    }
}
   
void InitTimer0()
{
  T0CON         = 0x85;
  TMR0H         = 0x79;
  TMR0L         = 0xB9;


  TMR0IP_bit = 0;
  TMR0IF_bit = 0;
  TMR0IE_bit = 1;
}

void main()
{   
  InitTimer0();
 
  while(1)
    {
      if (gear_cnt >= 12)
        {
          gear_cnt = 0;
          switch (gear)
            {
              case '1':
                gear_pattern = _GEAR_1;
              break;
              case '2':
                gear_pattern = _GEAR_2;
              break;
              case '3':
                gear_pattern = _GEAR_3;
              break;
              case '4':
                gear_pattern = _GEAR_4;
              break;
              case '5':
                gear_pattern = _GEAR_5;
              break;
              case 'N':
                gear_pattern = _GEAR_N;
              break;
              case 'R':
                gear_pattern = _GEAR_R;
              break;
            }
        }
       
      //YOUR CODE 
       
    }
}

Автор:  Zdrav [ Нед Апр 22, 2018 10:55 pm ]
Заглавие:  Re: Мигане на светодиод(и) ?

лека добавка:
Код:
...
void int_LOW() iv 0x0018 ics ICS_AUTO
{
  if (TMR0IF_bit)
    {
      TMR0IF_bit = 0;
      TMR0H         = 0x79;
      TMR0L         = 0xB9;
      if(gear_cnt < 12)
      {
          led_gear = gear_pattern & 0x0001;
          gear_pattern >>= 1;
          gear_cnt++;
      }
    }
}

...

void main()
{   
  InitTimer0();

  while(1)
    {
      if (gear_cnt >= 12)
        {
          switch (gear)
            {
              case '1':
                gear_pattern = _GEAR_1;
              break;
              case '2':
                gear_pattern = _GEAR_2;
              break;
              case '3':
                gear_pattern = _GEAR_3;
              break;
              case '4':
                gear_pattern = _GEAR_4;
              break;
              case '5':
                gear_pattern = _GEAR_5;
              break;
              case 'N':
                gear_pattern = _GEAR_N;
              break;
              case 'R':
                gear_pattern = _GEAR_R;
              break;
            }


          gear_cnt = 0;  // <--------

        }
       
      //YOUR CODE
       
    }
}
...
}

за да направиш писането по gear_pattern, от две различни нишки, mutualy exclusive.


Аз очаквах в тази тема да се включат само "АРМаТУРИсти",
но явно и PIC-овете стават за мигане на светодиоди.

А сега по-сериозно... relsys предложения код няма FIFO и на всеки цикъл на main() можеш да сменяш gear_pattern, но
ако текущия gear_pattern не се е извъртял, всички нови заявки(gear_pattern-и) ще останат в небитието и няма да видят бял свят.
Когато имаш FIFO и освен това при препълване на FIFO-то също индицираш код за грешка с някакъв gear_pattern, тогава е по-читаво.
Както miro_atc писа опашката(FIFO-то) е важния елемент. От там нататък може и с директно клатене на GPIO, може и ако има свободен таймер да се конфигурира PWM да клати светодиода ако пък имаш "арматура" може и с DMA да клатиш gear_pattern-а към светодиода или да използваш изход на някой сериен интерфейс SPI например ако имаш свободен.

Но извеждането на информация с мигания и бибкания има своя лимит над който става безсмислено. Дори и да добавиш димни сигнали пак не става, иска си съответния юзър интерфейс - дисплей с подходящи размери.

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/