Обсуждаем контроллеры компании Atmel.
Ответить

Помогите пожалуйста с кодом С#

Пт июл 31, 2020 17:54:38

Всем здравствуйте,имеется код,в котором реализовано при каждом нажатийодной и той же кнопки,включение указанных пинов,все работает,но нужно как то прикрутить к каждому case-у свои определенные условия,кейсами включаются движения вверх,вниз,влево,в право,но есть еще датчики по ограничению движения вниз и вверх,пытался IFы вкорячить в каждый кейс,но не получается,либо условие распространяется на все кейсы,либо перестает работать инкремент итд,подскажите как можно реализовать желаемое,желательно на примере какого-нибудь кейса,в конечных автоматах не силен,ток на это хватило ума,после сработки одного из датчиков должно произойти определенное движение в лево или в право,каждый раз разное,поэтому возникла такая проблема,что надо что бы у каждого кейса были свои условия
Спойлер#include <mega328p.h>
#include <delay.h>

#define VERH PORTC.2
#define VNIZ PORTC.3
#define VLEVO PORTC.4
#define PRAVO PORTC.5
#define DATCHIK_VERH PIND.3
#define DATCHIK_VNIZ PIND.4
#define DATCHIK_GORIZONT_2 PIND.0
#define DATCHIK_GORIZONT_1 PINC.6

unsigned char poziciya=0;
int n=0; //Переменная, отслеживающая нажатия. 0 - нет нажатия, 1 - происходит нажатие, 2-произошло отжатие кнопки



void main(void)
{
PORTB=0b11011110; //0xCF;-из двоичной в шеснадцатеричную систему исчисления
DDRB=0b00000000; //0x00;-из двоичной в шеснадцатеричную систему исчисления

PORTC=0b00000000; //0x00;-из двоичной в шеснадцатеричную систему исчисления
DDRC=0b11111110; //0xCF;-из двоичной в шеснадцатеричную систему исчисления

PORTD=0b11011111; //0xDF;-из двоичной в шеснадцатеричную систему исчисления
DDRD=0b00000000; //0x00;-из двоичной в шеснадцатеричную систему исчисления

//_________________Датчики(горизонт)_____
PORTD.0=1; //диалект CodeVision
DDRD.0=0; //диалект CodeVision
PORTD.1=1; //диалект CodeVision
DDRD.1=0; //диалект CodeVision

//_________________Датчики(концевые)_____
PORTC.6=1; //диалект CodeVision
DDRC.6=0; //диалект CodeVision
PORTD.4=1; //диалект CodeVision
DDRD.4=0; //диалект CodeVision

//________Выключатель(разрешение на ручной режим)_________
PORTD.2=1; //диалект CodeVision
DDRD.2=0; //диалект CodeVision

//_________________Датчики(вертикаль)_____
PORTD.2=1; //диалект CodeVision
DDRD.2=0; //диалект CodeVision
PORTD.3=1; //диалект CodeVision
DDRD.3=0; //диалект CodeVision

//_____
PORTB.5=1; //диалект CodeVision
DDRB.5=0; //диалект CodeVision


while(1){

switch(poziciya)
{
case 0:{PORTC=0b00000000; break; }
case 1:{VERH=1; break;} //1
case 2:{VLEVO=1; break;} //2
case 3:{VLEVO=1; break;} //3
case 4:{VNIZ=1; break;} //4
case 5:{PORTC=0b00000000; break;} //5
case 6:{PORTC=0b00000000; break;} //6
case 7:{PORTC=0b00000000; break;} //7


};

//if (DATCHIK_VERH==0){VERH=0;VLEVO=1;}
//if (DATCHIK_VNIZ==0){VNIZ=0;VLEVO=1;}


if((PIND.0==1)&&(n==0)){n=1;};


if((PIND.0==0)&&(n==1))
{poziciya++;
if (poziciya>8){poziciya=0;}
n=0;
};
};
};

Re: Помогите пожалуйста с кодом С#

Пт июл 31, 2020 18:15:48

Конечные автоматы - это просто. Состояния. Двигатель - Стоп, Разгон, Работа, Торможение, Авария. Устройство, станок - Стоп, Ручной режим или наладка, Работа, Аварийный стоп. Это главные автоматы. Есть еще вложенные автоматы. К примеру, состояние главного автомата Работа - начальное состояние, следим за датчиком, если датчик сработал, следующее состояние.
Вам нужно всего понять - Состояния.
Цикл статей Татарчевского.
Спойлер
Код:
//************************************************************************
//************************ Главный автомат *******************************
//************************************************************************

//==================
STATE (PROC_EDS_MAIN_INIT,        Proc_Eds_Main_Init)
STATE (PROC_EDS_MAIN_STOP,        Proc_Eds_Main_Stop)
STATE (PROC_EDS_MAIN_MANUAL,      Proc_Eds_Main_Manual)
STATE (PROC_EDS_MAIN_AUTOMAT,     Proc_Eds_Main_Automat)
STATE (PROC_EDS_MAIN_EMERG_STOP,  Proc_Eds_Main_Emerg_Stop)
//==================

//************************************************************************
//************************ Автомат "Автомат" *****************************
//************************************************************************

//==================
STATE (PROC_EDS_AUTOMAT_IDLE,                empty_func)
STATE (PROC_EDS_AUTOMAT_WAIT_RUN,            Proc_Eds_Automat_Wait_Run)
STATE (PROC_EDS_AUTOMAT_RUN,                 Proc_Eds_Automat_Run)
STATE (PROC_EDS_AUTOMAT_WAIT_FORM_CLOSING_1, Proc_Eds_Automat_Wait_Form_Closing_1)
STATE (PROC_EDS_AUTOMAT_WAIT_FORM_CLOSING_2, Proc_Eds_Automat_Wait_Form_Closing_2)
STATE (PROC_EDS_AUTOMAT_WAIT_HEAT_END,       Proc_Eds_Automat_Wait_Heat_End)
STATE (PROC_EDS_AUTOMAT_WAIT_FORMOVKA_END,   Proc_Eds_Automat_Wait_Formovka_End)
STATE (PROC_EDS_AUTOMAT_WAIT_FORM_OPENING,   Proc_Eds_Automat_Wait_Form_Opening)
STATE (PROC_EDS_AUTOMAT_WAIT_PNEVMOSYEM_END, Proc_Eds_Automat_Wait_Pnevmosyem_End)
STATE (PROC_EDS_AUTOMAT_WAIT_SENS_4,         Proc_Eds_Automat_Wait_Sens_4)
//==================

//==================
void Proc_Eds_Main_Init (void)
{
   read_proc_eds_param ();

   _proc_eds_main = PROC_EDS_MAIN_STOP;
}   
//==================

//==================
void Proc_Eds_Main_Stop (void)
{
   if (get_key_work (KEY_MANUAL_COD))
   {
      proc_eds_mode = MODE_MANUAL;
      _proc_eds_main = PROC_EDS_MAIN_MANUAL;
      _proc_eds_manual = PROC_EDS_MANUAL_INIT;
   }

   if (get_key_work (KEY_AUTOMAT_COD))
   {
       proc_eds_mode = MODE_AUTOMAT;
       _proc_eds_main = PROC_EDS_MAIN_AUTOMAT;
       _proc_eds_automat = PROC_EDS_AUTOMAT_WAIT_RUN;
   }
}
//==================

//==================
void Proc_Eds_Main_Set_Emerg_Stop (void)
{
   all_valves_off (); // Отключение всех клапанов.

   proc_eds_mode = MODE_EMERG_STOP;
   _proc_eds_main = PROC_EDS_MAIN_EMERG_STOP;
}

void Proc_Eds_Main_Emerg_Stop (void)
{
   if (!(emerg_stop_flags & (1<<EMERG_STOP_FLG)))
   {
      if (get_key_work (KEY_STOP_COD))
      {
         proc_eds_mode = MODE_STOP;
         _proc_eds_main = PROC_EDS_MAIN_STOP;
      }
   }
}
//==================

//Вложенные автоматы. Режим Автомат.

//==================
void Proc_Eds_Automat_Wait_Form_Closing_1 (void)
{
   if (inputs_buf [2] & (1<<SENSOR_1))
   {
      set_timer (ST_PROC_EDS_T_OUT_SENS_2, NO_RERUN_TIMER, 100); // Установка таймера "Тайиоут датчика ПРЕССФОРМА ЗАКРЫТА".
      _proc_eds_automat = PROC_EDS_AUTOMAT_WAIT_FORM_CLOSING_2;
      return;
   }

   if (wait (ST_PROC_EDS_T_OUT_SENS_1))
   {
      timer_timout_sens_1++;
      if (timer_timout_sens_1 >= timout_sens_1_val)
      {
         set_event (EV_TIMEOUT_SENS_1);
         Proc_Eds_Main_Set_Emerg_Stop ();
         return;
      }
      set_timer (ST_PROC_EDS_T_OUT_SENS_1, NO_RERUN_TIMER, 100); // Перезапуск таймера "Тайиоут датчика ПРЕССФОРМА ОТКРЫТА".
   }
}
//==================


В вашем случае вы всю работу устройства, чем бы оно ни было, раскладываете на состояния. К примеру, ночник. Состояния: Включено, Выключено. Состояние Выключено, ждем нажатия на кнопку. Если не нажали, сидим. Если нажали, включаем лампочку, в переменную State записываем состояние Включено. Состояние Включено. Если кнопку не нажали, сидим. Если нажали, выключаем лампочку, в переменную STATE записываем состояние Выключено.

Re: Помогите пожалуйста с кодом С#

Пт июл 31, 2020 18:33:00

Я читал книжки всякие но так в полной мере и не доходит)ссылку на статью почитаю

Re: Помогите пожалуйста с кодом С#

Пт июл 31, 2020 18:37:26

Повторю. Здесь нужно понять всего лишь одну вещь. Оперировать понятием Состояние. Состояния. И всю работу устройства раскладывать на фазы работы, то есть - состояния. Толчок я вам дал, больше пока ничем не могу помочь. Так как неизвестно, что вы делаете, что за устройство, как оно работает. И не в коде, а именно как устройство. К примеру, тот же ночник. Как он работает? Нажали на кнопку, лампочка загорелась. Опять нажали, лампочка потухла

Re: Помогите пожалуйста с кодом С#

Сб авг 01, 2020 10:35:11

Можно добавить в каждом case вызов функции (по указателю - если один и тот же case может иметь различное функционирование при разных интерпретациях источника кодовой комбинации).
:roll:

Re: Помогите пожалуйста с кодом С#

Сб авг 01, 2020 14:48:14

Ему сейчас важно только одно. Вникнуть, что вся программа, часть программы - это конечный автомат. Когда он это поймёт, дело сдвинется. Не раньше, хоть что пиши.

Re: Помогите пожалуйста с кодом С#

Сб авг 01, 2020 20:40:36

Demiurg писал(а):Ему сейчас важно только одно. Вникнуть, что вся программа, часть программы - это конечный автомат.
А я то думал - что любая программа начинается с алгоритма.

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 09:37:11

Перечитайте мои сообщения. Разложить работу устройства на состояния. Именно в этот момент анализируется алгоритм работы. Конечный автомат уже в самом своём термине подразумевает состояния, что и есть алгоритм.

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 10:23:02

Подход к восприятию "конечного автомата" зависит от конкретной базы знаний, на которой идет освоение предмета.
В данном случае, к примеру - от рассыпухи через ассемблер и далее Си или сразу к Си или еще каким образом.
У каждого СВОЯ начальная база.
И не поняв базы знаний собеседника весьма сложно иногда объяснить ситуацию - "говорим об одном и том же и не понимаем друг друга".
Мне вот "конечный автомат" вообще НИЧЕГО не объясняет - тем не менее как-то с программированием справляюсь...
8)

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 11:49:31

Давайте все таки с алгоритмом разберемся.
Имеем:
shrus43 писал(а):движения вверх,вниз,влево,в право
Чем управляется движение кнопками или как еще?
Если кнопками - то как? То есть пока кнопку держим едем вверх или еще как?
далее
shrus43 писал(а):но есть еще датчики по ограничению движения вниз и вверх


....
shrus43 писал(а):после сработки одного из датчиков должно произойти определенное движение в лево или в право,каждый раз разное
какого датчика?

В его коде встречается:
Датчики(горизонт) - что это?
Датчики(концевые) - что это?
Датчики(вертикаль) - что это?
Выключатель(разрешение на ручной режим) - а это что?,

switch(poziciya) - что это? То есть при каждом нажатии (срабатывании, изменении уровня или как) на PIND.0(DATCHIK_GORIZONT_2 PIND.0) должна меняться переменная poziciya?

А уж потом будем
Demiurg писал(а):Двигатель - Стоп, Разгон, Работа, Торможение, Авария.
И уважаемый Demiurg, вы если кусок кода выкладывайте, то постарайтесь что бы там все было, а то как то не связывается
Код:
STATE (.....) - ?

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 14:09:33

А причем здесь # в названии? C# - отдельный язык и точно не для микроконтроллеров.

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 15:21:10

...

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

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 15:40:45

Demiurg писал(а):Вы можете попросить. Не более.
Дак я Вас прошу, что бы приведенный вами пример был рабочим, либо приложить архив где используется данный пример.
Создаю пустой проект, выполняю копировать -> вставить, нажимаю компиляция - и в результате получаю?
Приведенный вами пример должен быть полностью рабочим, а не просто кусок из основной части программы, дескать остальное сами допишите.

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 18:32:39

...

Поступим по другому. Что вы хотите получить от моего примера? То что привел, это из проекта. Коммерческого. Но, какую- то часть показать могу. В качестве примера, что такое конечный автомат. Также я выложил ссылку на цикл статей. Там полно примеров. Так вот. Прямой вопрос. Что вы хотите получить из моих примеров. Подумайте, ответьте.

Добавлено after 55 minutes 29 seconds:
...

Я когда узнал, что такое конечные автоматы, сразу понял, что это такое. Это близко мне по мммм..., мышлению наверное. На профильных форумах иногда были споры, КА против обычного программирования, RTOS. Весь прикол в том, что КА и есть и диспетчеры и RTOS. Не буду поднимать очередной срач, скажу так, нужно просто понять, что такое состояния. А любая программа это и есть состояния, если срезать всю шелуху. Все.

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 18:34:15

Demiurg, я ожидал примерно такой ответ от вас, как "коммерческий".
Про ваш пример
Кусок кода вырванный из программы означает ошибку цитирования. Поэтому, он не передаёт с достаточной степенью точности смысл этого блока. Более того, этот код может радикально исказить содержание первоисточника, откуда он процитирован. В таком случае, этот вырванный код не может рассматриваться в качестве подлинной программы и
не имеет никакой силы.
так сойдет? Подумайте, прежде чем ответить.

Re: Помогите пожалуйста с кодом С#

Вс авг 02, 2020 18:41:08

Я не согласен с вами. Также я не согласен с тем, что любой пример должен автоматом компилироваться. Я писал на ассемблере. ВСЕГДА ассимилировал примеры под себя. Сишные примеры. В принципе, аналогично. Значит, за вашим желанием посмотреть пример готовый к компилированию стоит что-то другое. Поэтому я вам написал, подумайте, может я навстречу пойду. Не надо прикрываться высокими словами, типа какой-то пример вырванный из контекста в корне поменяет смысл. Примеры на то и примеры, и никто не обязан давать вам готовый к компилированию пример. Надо, бери и делай. Что-то непонятно, спрашивай.

Re: Помогите пожалуйста с кодом С#

Пн авг 03, 2020 01:38:28

А причем здесь # в названии? C# - отдельный язык и точно не для микроконтроллеров.

C# а для чего?компьютерных программ?а этот тогда какой?просто си?или что? объясните пжл

Добавлено after 12 minutes 41 second:
Подход к восприятию "конечного автомата" зависит от конкретной базы знаний, на которой идет освоение предмета.
В данном случае, к примеру - от рассыпухи через ассемблер и далее Си или сразу к Си или еще каким образом.
У каждого СВОЯ начальная база.
И не поняв базы знаний собеседника весьма сложно иногда объяснить ситуацию - "говорим об одном и том же и не понимаем друг друга".
Мне вот "конечный автомат" вообще НИЧЕГО не объясняет - тем не менее как-то с программированием справляюсь...
8)

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

Добавлено after 9 minutes 25 seconds:
То что Demiurg,хотел довести до меня изучив статью,я вроде понел,но реализовать в коде не получилось,но свой вопрос решить удалось,я после блока switch case отдельно прописал ифки указывав в условий номер переменной POZICIA#, получается в деле типо того что,case 0это POZICIA 1,не знаю правильно это с профессиональной точки зрения или не,но работает четко в протеусе,в любом случае спасибо за советы,может еще вопросы возикнут

Re: Помогите пожалуйста с кодом С#

Пн авг 03, 2020 03:30:29

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

Re: Помогите пожалуйста с кодом С#

Пн авг 03, 2020 05:57:48

на, вот, проект термостата (кодевижен и протеус) https://radiokot.ru/forum/download/file.php?id=322102 (это старая версия, но в данном случае это непринципиально) там тоже КА есть (для организации меню)
есть действия, которые выполняются всегда (опрос датчика, "рисование" экрана, поддержание температуры, опрос кнопок) они вынесены из КА ка-кбы за скобки, а вот в самом КА (второй вложенный кейс - параметром состояния является переменная "меню") рассматривается, что нужно показывать на экране и что должны делать кнопки в каждом из разделов меню (состояний КА).
(На первом кейсе реализовано распараллеливание процессов, обработка меню является одним из них)
П.С. случайно зашёл сюда... т.к. С# не интересуюсь... (думаю из-за такого названия темы многие прошли мимо)

Re: Помогите пожалуйста с кодом С#

Пн авг 03, 2020 07:26:30

C# а для чего?компьютерных программ?а этот тогда какой?просто си?или что? объясните пжл

Да, C# для ПК, в вашем примере просто C. А еще C++ - тоже совсем отдельный язык. Не путайте, потому что да, из-за названия темы неправильного многие прошли мимо. И как вам уже сказали, нужно более подробное словесное описание того, что вам в итоге нужно.
Ответить