Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Светодиод
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Bloodykeeper
Здравствуйте, помогите пожалуйста с задачкой. Для опытного человека она является простенькой, а мне необходим опыт sm.gif

Суть вот в чём, по нажатии на кнопку, строка из 5 светодиодов пробегает слева направо (т.е. сначала загорается один светодиод, гаснет, потом следующий, и так до последнего), после чего последний светодиод остаётся гореть. Потом нажимается кнопка снова, и опять всё повторяется, но кроме уже горящего 5го светодиода загорается ещё и 4й. И так пока не заполнится вся строка. Задача простенькая, но необходимо её сделать на автоматах Мили или Мура, а это нам плоховато объяснили. Я код набросал немного, но не знаю как сделать сумирование переменных, чтобы светодиоды загорались и горели в конце. Помогите пожалуйста. Заранее спасибо.


CODE
#include<LPC213x.h>
int main()
{
int ST=10000, N=2, L=0, i;
IODIR1 =(1<<16)+(1<<17)+(1<<18)+(1<<19)+(1<<20);
IOCLR1 =(1<<16)+(1<<17)+(1<<18)+(1<<19)+(1<<20);
IOSET1 =(1<<16);
while(1)
{
for(i=0; i<20000000; i++)
{

//Таймер(Граф1)
ST--;
if(ST==0)
{if(N==1){L++; ST=10000;} else ST=10000;}
//if(L==6) {L=1;}

//Направление перемещения(Граф2)
if(!(IOPIN0&(1<<10)))
{N=1;}


//Условия перемещения(Граф3)
//Прямой ход
if(N==1) {
if((L==1))
{if((IOPIN1&(1<<16))){IOSET1=(1<<17); IOCLR1=(1<<16); N=2;}}
if((L==2))
{if((IOPIN1&(1<<17))){IOSET1=(1<<18); IOCLR1=(1<<17); N=2;}}
if((L==3))
{if((IOPIN1&(1<<18))){IOSET1=(1<<19); IOCLR1=(1<<18); N=2;}}
if((L==4))
{if((IOPIN1&(1<<19))){IOSET1=(1<<20); IOCLR1=(1<<19); N=2;}}
if((L==5))
{if((IOPIN1&(1<<20))){IOSET1=(1<<16); IOCLR1=(1<<20); N=2;}}
if (L==6) {L=1; N=0;}
}




}
}
}

XVR
Это у вас не автомат, а черт знает что.
toweroff
Ну на Мура можно и не смотреть - у него нет вектора входных переменных
Только Мили

И описывать автоматы на С - жесть (в данном случае)
Хоть бы на какой-нибудь xHDL посмотрите
Bloodykeeper
Я понимаю вас, я тоже вижу, что всё это глупо, но так требует институт, вернее один преподаватель. До этого никто таким не страдал, всё нормально преподавалось, а тут такое... Если бы я мог найти выход из сложившейся ситуации сам, то я бы решил эту задачу, но я не могу это сделать. Поэтому и прошу помощи. Может быть кто-то сталкивался с таким, и сможет как-то помочь мне в написании кода. Задача по требованию должна состоять из графов и реализована на автоматах. Графов здесь 2 - граф перемещения и граф подсчёта последних переходов, чтобы реализовать счётчик. Вот и всё. По идее, написанный мной код работает, переходы осуществляются. Нет только счётчика, который бы считал загорание последнего светодиода, и записывал бы массив этих светодиодов потом в обратном порядке. Вот это я и не могу сделать. sad.gif
toweroff
Забудь про С
Вот когда нечто в схеме или xHDL появится, тогда кто-то подскажет
И, самое главное, xHDL никак не равно С, это просто схема, железо
Bloodykeeper
Ясно, спасибо и на том. Буду тогда мучать горепрепода sm.gif
XVR
Автоматы можно и на С сделать, но в вашей программе автоматов нет. Где переменные, хранящие текущее состояние? Где переходы между состояниями?
И еще - 2 графа это требование преподавателя или ваше личное решение? И можно ли часть функционала сделать не в виде автомата?
toweroff
Цитата(XVR @ Feb 29 2012, 13:37) *
Автоматы можно и на С сделать, но в вашей программе автоматов нет.

это от преподавателя и предмета зависит. У нас по ПТЦА давали разработку автоматов на жесткой логике.
Смысл -- показать умение синтеза функций, понимание цифрового автомата

А так -- оно да, можно, конечно, автомат реализовать и на "обычных" языках программирования
XVR
Цитата(toweroff @ Feb 29 2012, 14:08) *
это от преподавателя и предмета зависит.
Это зависит от того исходника, который привел ТС. В том исходнике автомат обнаружить очень трудно rolleyes.gif
Цитата
А так -- оно да, можно, конечно, автомат реализовать и на "обычных" языках программирования
Разумеется можно, но ТС этого не сделал.
Автомат (их тут должно быть 2 штуки) должен выглядеть как то так:
Код
typedef enum {
Idle,
Running
} State;

int total_lamps_on=0;

void run_a2(void);
int is_a2_running(void);

int is_button_pressed(void);

State a1_state = Idle;

void a1_step(void)
{
switch(a1_state)
  {
   case Idle:
    if (is_button_pressed())
     {
      run_a2();
      a1_state=Running;
     }
    break;
   case Running:
    if (!is_a2_running())
     {
      a1_state=Idle;
      total_lamps_on++;
      total_lamps_on&=7;
     }
    break;
  }
}

...
main()
{
for(;;)
  {
   a1_step();
   a2_step();
  }
}
Реализацию 2го автомата и вывод на LED'ы оставляю для ТС
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.