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

Обсуждаем контроллеры компании Atmel.
shrus43
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт сен 10, 2019 16:18:33

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

Сообщение shrus43 »

Всем здравствуйте,имеется код,в котором реализовано при каждом нажатийодной и той же кнопки,включение указанных пинов,все работает,но нужно как то прикрутить к каждому 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;
};
};
};
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

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

Код: Выделить всё

//************************************************************************
//************************ Главный автомат *******************************
//************************************************************************

//==================
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 записываем состояние Выключено.
Реклама
shrus43
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт сен 10, 2019 16:18:33

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

Сообщение shrus43 »

Я читал книжки всякие но так в полной мере и не доходит)ссылку на статью почитаю
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Повторю. Здесь нужно понять всего лишь одну вещь. Оперировать понятием Состояние. Состояния. И всю работу устройства раскладывать на фазы работы, то есть - состояния. Толчок я вам дал, больше пока ничем не могу помочь. Так как неизвестно, что вы делаете, что за устройство, как оно работает. И не в коде, а именно как устройство. К примеру, тот же ночник. Как он работает? Нажали на кнопку, лампочка загорелась. Опять нажали, лампочка потухла
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Можно добавить в каждом case вызов функции (по указателю - если один и тот же case может иметь различное функционирование при разных интерпретациях источника кодовой комбинации).
:roll:
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Ему сейчас важно только одно. Вникнуть, что вся программа, часть программы - это конечный автомат. Когда он это поймёт, дело сдвинется. Не раньше, хоть что пиши.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Demiurg писал(а):Ему сейчас важно только одно. Вникнуть, что вся программа, часть программы - это конечный автомат.
А я то думал - что любая программа начинается с алгоритма.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Перечитайте мои сообщения. Разложить работу устройства на состояния. Именно в этот момент анализируется алгоритм работы. Конечный автомат уже в самом своём термине подразумевает состояния, что и есть алгоритм.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение Dimon456 »

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

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

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

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

Код: Выделить всё

STATE (.....) - ?
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

А причем здесь # в названии? C# - отдельный язык и точно не для микроконтроллеров.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3874052#p3874052"]...[/uquote]
Разбираться не с чем. Придёт ТС и распишет, что за устройство ему нужно.
Теоретически я мог на ассемблере, бейсике, паскале выложить примеры. Я указал только переменную State. Также, бывает, приводят примеры псевдокодом. Поэтому, не надо мне указывать, как мне приводить примеры. Вы можете попросить. Не более.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Demiurg писал(а):Вы можете попросить. Не более.
Дак я Вас прошу, что бы приведенный вами пример был рабочим, либо приложить архив где используется данный пример.
Создаю пустой проект, выполняю копировать -> вставить, нажимаю компиляция - и в результате получаю?
Приведенный вами пример должен быть полностью рабочим, а не просто кусок из основной части программы, дескать остальное сами допишите.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3874137#p3874137"]...[/uquote]
Поступим по другому. Что вы хотите получить от моего примера? То что привел, это из проекта. Коммерческого. Но, какую- то часть показать могу. В качестве примера, что такое конечный автомат. Также я выложил ссылку на цикл статей. Там полно примеров. Так вот. Прямой вопрос. Что вы хотите получить из моих примеров. Подумайте, ответьте.

Добавлено after 55 minutes 29 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=3874014#p3874014"]...[/uquote]
Я когда узнал, что такое конечные автоматы, сразу понял, что это такое. Это близко мне по мммм..., мышлению наверное. На профильных форумах иногда были споры, КА против обычного программирования, RTOS. Весь прикол в том, что КА и есть и диспетчеры и RTOS. Не буду поднимать очередной срач, скажу так, нужно просто понять, что такое состояния. А любая программа это и есть состояния, если срезать всю шелуху. Все.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Demiurg, я ожидал примерно такой ответ от вас, как "коммерческий".
Про ваш пример
Кусок кода вырванный из программы означает ошибку цитирования. Поэтому, он не передаёт с достаточной степенью точности смысл этого блока. Более того, этот код может радикально исказить содержание первоисточника, откуда он процитирован. В таком случае, этот вырванный код не может рассматриваться в качестве подлинной программы и
не имеет никакой силы.
так сойдет? Подумайте, прежде чем ответить.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

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

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

Сообщение shrus43 »

[uquote="NStorm",url="/forum/viewtopic.php?p=3874094#p3874094"]А причем здесь # в названии? C# - отдельный язык и точно не для микроконтроллеров.[/uquote]
C# а для чего?компьютерных программ?а этот тогда какой?просто си?или что? объясните пжл

Добавлено after 12 minutes 41 second:
[uquote="BOB51",url="/forum/viewtopic.php?p=3874014#p3874014"]Подход к восприятию "конечного автомата" зависит от конкретной базы знаний, на которой идет освоение предмета.
В данном случае, к примеру - от рассыпухи через ассемблер и далее Си или сразу к Си или еще каким образом.
У каждого СВОЯ начальная база.
И не поняв базы знаний собеседника весьма сложно иногда объяснить ситуацию - "говорим об одном и том же и не понимаем друг друга".
Мне вот "конечный автомат" вообще НИЧЕГО не объясняет - тем не менее как-то с программированием справляюсь...
8)[/uquote]
Вы обсолютно правы,а база то мизерная),так как я любитель,обычно я беру пример,ищу некую логику принципа работы кода,прикидываю что и как,методы и тд,и тогда приходит осмысление и понимание,профессионалы на этом форуме этого толи не понимают,толи спецом жмутся,как будто хлеб у них отобирают,возможно я ошибаюсь,но статистика потвержает это,не могу осуждать за это,имют полное право

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

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

Сообщение Demiurg »

Вы так и не сказали, что за устройство. Не в виде непонятного кода, а в виде тз. Тогда спецы не будут ужиматься, а что-то дельное подскажут...
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

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

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

Сообщение NStorm »

[uquote="shrus43",url="/forum/viewtopic.php?p=3874327#p3874327"]C# а для чего?компьютерных программ?а этот тогда какой?просто си?или что? объясните пжл[/uquote]
Да, C# для ПК, в вашем примере просто C. А еще C++ - тоже совсем отдельный язык. Не путайте, потому что да, из-за названия темы неправильного многие прошли мимо. И как вам уже сказали, нужно более подробное словесное описание того, что вам в итоге нужно.
Ответить

Вернуться в «AVR»