Програмирование двухрежимной работы микроконтроллера.

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

main.h
Спойлер

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

//==================
#include "main_def_func.h" // Заголовочные файлы, глобальные определения, общие функции.
//==================

//==================
__C_task main (void)
{
   wdt_enable (WDTO_15_MS);

   init_soft_timers ();

   Init_Events ();

   __enable_interrupt ();

   while (1)
   {
      __watchdog_reset ();

      proc_device ();

      Process_Events ();
   }
}
//==================
events.h
Спойлер

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

//==================
#ifndef EVENTS_H
#define EVENTS_H

#include "events.h"

#include "main_def_func.h"
//==================

//==================
extern u08 Events [];

typedef enum num_event
{
   EV_ID_KEY_PRESSED,
   EV_ID_KEY_UNPRESSED,
   EV_ID_2,
   EV_ID_3,
   EV_ID_4,
   MAX_ID_EVENTS,
} num_event;

#define NORMAL_EVENT 1
#define USER_EVENT   3
//==================

extern void Init_Events (void);
extern bool Get_Event (u08 event);
extern void Set_Event (u08 event, u08 status);
extern void Clr_Event (u08 event);
extern void Process_Events (void);

#endif
events.c
Спойлер

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

//==================
#include "events.h"
//==================

//==================
u08 Events [MAX_ID_EVENTS];
//==================

//==================
void Init_Events (void)
{
   u08 i = 0;

   while (i < MAX_ID_EVENTS)
   {
      Events [i++] = 0;
   }
}

bool Get_Event (u08 event)
{
   if (Events [event] == 2 || Events [event] == USER_EVENT)
   {
      Events [event] = 0;
      return true;
   }
   return false;
}

void Set_Event (u08 event, u08 status)
{
   if (Events [event] == 0)
      Events [event] = status;
}

void Clr_Event (u08 event)
{
   Events [event] = 0;
}

void Process_Events (void)
{
   u08 i = 0;

   while (i < MAX_ID_EVENTS)
   {
      switch (Events [i])
      {
         case 0:
            break;

         case 1:
            Events [i] = 2;
            break;

         case 2:
            Events [i] = 0;
            break;
      }

      i++;
   }
}
//==================
kbd_drv.h
Спойлер

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

#ifndef KBD_DRV_H

#define KBD_DRV_H

#include "kbd_drv.h"

#include "main_def_func.h"

//==================
#define DEBOUNCE_DELAY 20
//==================

//==================
#define KEYS_PIN              PINB
#define KEYS_DDR              DDRB
#define KEYS_PORT             PORTB
//==================
#define KEY_SELECT_MODE_DDR   DDRB
#define KEY_SELECT_MODE_PORT  PORTB
#define KEY_SELECT_MODE_PIN   PINB
#define KEY_SELECT_MODE       PB0
//==================

//==================
typedef enum kbd_drv_states
{
   KBD_DRV_INIT = 0,
   KBD_DRV_NONE,
   KBD_DRV_DOWN,
   KBD_DRV_WAIT_UP,
   KBD_DRV_UP,
} kbd_drv_states;
//==================

//==================
void kbd_drv (void);

bool check_button (void);
//==================

#endif

kbd_drv.c
Спойлер

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

//==================
#include "kbd_drv.h"
//==================

//==================
void kbd_drv (void)
{
static kbd_drv_states _kbd_drv;

static soft_timer ST_KBD;

   switch (_kbd_drv)
   {
      case KBD_DRV_INIT:
         _kbd_drv = KBD_DRV_NONE;
         break;

      case KBD_DRV_NONE:
         if (check_button ())
         {
            set_soft_timer (ST_KBD, DEBOUNCE_DELAY, 0);
            _kbd_drv = KBD_DRV_DOWN;
         }
         break;

      case KBD_DRV_DOWN:
         if (handle_soft_timer (ST_KBD))
         {
            if (check_button ())
            {
               Set_Event (EV_ID_KEY_PRESSED, USER_EVENT);
               _kbd_drv = KBD_DRV_WAIT_UP;
            }
            else
            _kbd_drv = KBD_DRV_NONE;
         }
         break;

      case KBD_DRV_WAIT_UP:
         if (!check_button ())
         {
            set_soft_timer (ST_KBD, DEBOUNCE_DELAY, 0);
            _kbd_drv = KBD_DRV_UP;
         }
         break;

      case KBD_DRV_UP:
         if (handle_soft_timer (ST_KBD))
         {
            if (!check_button ())
            {
               _kbd_drv = KBD_DRV_NONE;
               Set_Event (EV_ID_KEY_UNPRESSED, USER_EVENT);
            }
            else
               _kbd_drv = KBD_DRV_WAIT_UP;
         }
         break;

      default:
         break;
   }
}
//==================

//==================
#pragma inline = forced
bool check_button (void)
{
   return check_bit (KEY_SELECT_MODE_PIN, KEY_SELECT_MODE);
}
//------------------------------------------------------------------------
Программные таймеры тут.

proc_device.h
Спойлер

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

//==================
#ifndef PROC_DEVICE_H
#define PROC_DEVICE_H

#include "proc_device.h"

#include "main_def_func.h"
//==================

//==================
//--------------------------- INPUTS -------------------------------------
//-------------------------- OUTPUTS -------------------------------------
#define OUT_1_PORT PORTD
#define OUT_1_DDR  DDRD
#define OUT_1      PD0

#define OUT_1_METHOD OUT_1_PORT
//==================

/*
typedef enum proc_device_states
{
   PROC_DEVICE_INIT = 0,
   PROC_DEVICE_MODE_1_INIT,
   PROC_DEVICE_MODE_1,
   PROC_DEVICE_MODE_2_INIT,
   PROC_DEVICE_MODE_2,
} proc_device_states;
*/

//==================
void proc_device (void);

void set_proc_out_1_on (void);
void set_proc_out_1_off (void);
bool proc_out_1 (void);
//==================

//==================
void out_1_on (void);
void out_1_off (void);
void out_1_switch (void);
//==================

#endif
proc_device.с Собссно сам алгоритм.
Спойлер

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

//==================
#include "proc_device.h"
//==================

#define LED_ON_TIME 3 // 3000
#define MINUTE 5 // 60000
#define MINUTES 2 // 90

//==================
void proc_device (void)
{
   static u08 _proc_device_main;
   static u08 _proc_device_slave;
   static u08 minutes;

   static soft_timer ST_PROC_DEVICE;

   kbd_drv ();

   switch (_proc_device_main)
   {
      case 0:
         set_bit (OUT_1_DDR, OUT_1);

      case 1:
         _proc_device_main = 2; // Настройка первого режима.
         _proc_device_slave = 0;
         break;

      case 2:
         if (Get_Event (EV_ID_KEY_PRESSED))
         {
            set_proc_out_1_off ();

            _proc_device_main = 3; // Настройка второго режима.
            _proc_device_slave = 0;
            return;
         }

         switch (_proc_device_slave)
         {
            case 0:
               set_proc_out_1_on ();
               _proc_device_slave = 1;
               break;

            case 1:
               if (proc_out_1 ())
               {
                  set_soft_timer (ST_PROC_DEVICE, MINUTE, MINUTE);
                  _proc_device_slave = 2;
               }
               break;

            case 2:
               if (handle_soft_timer (ST_PROC_DEVICE))
               {
                  minutes++;
                  if (minutes > MINUTES)
                  {
                     minutes = 0;
                     _proc_device_slave = 0;
                  }
               }
               break;
         }
         break;

      case 3:
         if (Get_Event (EV_ID_KEY_PRESSED))
         {
            set_proc_out_1_off ();

            _proc_device_main = 1;
            return;
         }

         // Тут пишете логику второго режима.
         break;
   }
}
//==================

//==================
static u08 _proc_out_1;

void set_proc_out_1_on (void)
{
   _proc_out_1 = 1;
}

void set_proc_out_1_off (void)
{
   out_1_off ();
   _proc_out_1 = 0;
}

bool proc_out_1 (void)
{
   static soft_timer ST_PROC_OUT_1;

   switch (_proc_out_1)
   {
      case 0:
         break;

      case 1:
         out_1_on ();
         set_soft_timer (ST_PROC_OUT_1, LED_ON_TIME, 0);
         _proc_out_1 = 2;
         break;

      case 2:
         if (handle_soft_timer (ST_PROC_OUT_1))
         {
            out_1_off ();
            _proc_out_1 = 0;
            return true;
         }
         break;
   }

   return false;
}
//==================

//==================
#pragma inline = forced
void out_1_on (void)
{
   set_bit (OUT_1_METHOD, OUT_1);
}

#pragma inline = forced
void out_1_off (void)
{
   clr_bit (OUT_1_METHOD, OUT_1);
}

#pragma inline = forced
void out_1_switch (void)
{
   switch_bit (OUT_1_METHOD, OUT_1);
}
//==================
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Demiurg писал(а):Я вас минусовал, за то, что вы, по моему мнению, ерунду написали?

По сбросу решение имеет право на жизнь, но сброс может быть не только по нажатию кнопки. Так что способ от бедности и безнадеги. Потому что пожадничали на нормальный МК и алгоритм. Не вариант.

У EEPROM ограниченный ресурс, а если смена режима будет производиться часто? Опять же этот способ завязан на предыдущий ненадежный способ. Не вариант вдвойне.

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

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

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

int mode __attribute__ ((section (".noinit"))); //активный режим. Секция noinit говорит о том что при старте программы инициализироваться переменная не будет

#define LED_ON() do{PORTB |= (1<<0);}while(0) //включение нагрузки
#define LED_OFF() do{PORTB &=~(1<<0);}while(0) //выключение нагрузки

inline void _delay_s(unsigned int s){ while(s--)_delay_ms(1000); } //даже не знаю нужен ли тут комментарий

int main(){
  DDRB = (1<<0);
  mode = !mode; //меняем режим при каждом перезапске
  while(1){
    if(mode)_delay_s(5400); else _delay_s(3600 + random()%3600);
    LED_ON();
    _delay_s(3);
    LED_OFF();
  }
}
Простой задаче - простое решение! Как в плане схемотехники, так и кода - 17 строчек, и это с форматированием.
На счет ресета и неумения выбирать контроллер под задачу. Допустим, надо, как и сказал ТС, включать-выключать нагрузку (1 вывод), задержка во втором режиме задается не рандомом, а переменным резистором (1 вывод АЦП) и режим нужно индицировать (1 вывод), причем нужна хорошая точность выдержки времени (2 вывода под кварц). Поскольку задача простая, постараемся упаковать все это в минимальный объем.
Итак, какой контроллер возьмете? Я бы предложил ATtiny25 в smd-корпусе, поскольку его как раз хватает на эту задачу.
А то и вовсе ATtiny10, у которой всего 6 выводов, правда программировать придется на ассемблере, но для такой задачи это не займет много времени.
Иными словами, надо подбирать контроллер под задачу и уметь обходить некоторые ограничения а не хвататься сразу за самый мощный.
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

COKPOWEHEU писал(а): Правильно он проминусовал, в том сообщении конкретики не было. В этом, впрочем ее тоже немного. Там как раз был обрисован алгоритм, но если вам больше по нраву в вид кода - пожалуйста
Давайте я скажу прямо. Как есть. Конкретику я не дал, потому что подразумевается само собой. Кнопку с дребезгом на ресет только и вешать. И еще использовать EEPROM для этого. Ну прямо таки шедевральное решение! Премию за это!
Я понимаю что основной контингент любители. Ну так вы сами признайте и перестаньте надувать щеки. Я сам по сути любитель, если разобраться. Ладно, это лирика.

По вашему коду. Ну и что вы там накидали? Где подавление дребезга контактов кнопок? Предлагаете секунду жать кнопу? Код на отвали, моя черешня. Вдобавок не по ТЗ ТС. Чуть усложнить задание и приплыли.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Demiurg писал(а): Кнопку с дребезгом на ресет только и вешать.
Сколько же брендовых приборов имеют такую кнопку, откройте им глаза. Я смотрю тут молятся уже на дребезг кнопок. Во первых есть не все кнопки дребезжат, можете не верить.
Во вторых, при простом предложенном алгоритме, можно же мыслить чуть шире. Что мешает при старте МК выждать некое время и только потом выполнять остальной алгоритм?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):По сбросу решение имеет право на жизнь, но сброс может быть не только по нажатию кнопки. Так что способ от бедности и безнадеги.
способ нормальный, никакой безнадеги. всего лишь разумное использование аппаратных возможностей МК - разве не в этом состоит embedded-программирование?! сброс может быть и не от кнопки - разве анализ источника сброса путем просмотра регистра MCUCSR или аналогичного кто-то запрещает?! Я ведь описал самыми простыми словами, в общих чертах алгоритм решения задачи - что задача, что алгоритм по сложности не страшнее табуретки.
Demiurg писал(а):У EEPROM ограниченный ресурс, а если смена режима будет производиться часто?
Ну давайте прикинем... ресурс EEPROM Атмел гаратнитует в 100000 циклов. У топикстартера задача отрабатывать какие-то циклы, длящиеся по 1,5 часа, ну пусть по 30 минут... пусть даже ему приспичит менять режим каждые 10 минут (хотя зачем - я не могу предположить даже!). Итак, 100000 раз по 10 минут это будет... два года. То есть ресурс EEPROM будет выработан полностью, если в течение 2 лет работы каждые 10 минут пользователь будет нажимать кнопку... вы в самом деле считаете это аргументом?! :shock: :shock: :shock:
Demiurg писал(а):В свою очередь, от вас тоже нет конкретики. В общих чертах вы сказали - "фигня вопрос". Ну так на все можно сказать это и типа считать себя опытным зубастым котом. Предложите свой вариант.
разве мой алгоритм недостаточно понятен, хоть и изложен крайне кратко?! Я ведь рассчитывал минимум на среднее образование и минимальный опыт в программировании... извините, если переоценил ваши способности.
Demiurg писал(а):Меленько, подленько, гаденько поступаете
оставляя за вами право на личные оценки, выскажу свое мнение: подленько я бы поступил, если бы минусанул вам карму втихаря. но я открыто сказал, что делаю это - в воспитательных целях, ибо вы просто погнали волну без аргументов, причем в недопустимом тоне. у меня большое желание минусануть и этот ваш пост, но т.к. в нем все-таки присутствует какая-то аргументация, я этого не делаю.

воздержитесь от постов в стиле "сам дурак", и я никогда не поставлю вам минус.
Demiurg писал(а):main.h
events.h
events.c
kbd_drv.h
kbd_drv.c
proc_device.h
proc_device.с
вы на самом деле считаете, что этот подход - наиболее оптимальный для столь примитивной задачи?! вы считаете, что он хорош на самом деле?! :shock: для убийства таракана вы тоже загоняете его под шкаф и быстренько подпиливаете ножки шкафа?!
Z_h_e писал(а):Сколько же брендовых приборов имеют такую кнопку, откройте им глаза. Я смотрю тут молятся уже на дребезг кнопок
самое смешное в этом споре то, что сброс аппаратно защищен от дребезга, чем я и предложил воспользоваться! но программная защита от дребезга - это, конечно, панацея :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а): main.h
events.h
events.c
kbd_drv.h
kbd_drv.c
proc_device.h
proc_device.с
Я ждал, когда вы ткнете на это. Задача ТС, в любой момент времени нажатием на кнопку сменить режим. Я показал модульный подход. И конечный автомат. Плюс псевдопараллельность. Проект собран из готовых модулей. Допилен чуток модуль опроса кнопки и добавлен модуль алгоритма ТС.

Понимаю, что ТС новичок. Но и вопрос у него непростой. Пусть видит в какую сторону ему копать в будущем.

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

Никто не молится на дребезг. Вы же не будете утверждать на полном серьезе, что у кнопок нет дребезга? Будете? Тогда соберите на рассыпухе счетчик импульсов и попробуйте доказать ваше утверждение.
Конденсаторы лепим на кнопки? И вы намертво привязали себя времянками. У меня нет никаких ограничений, при программном подавлении дребезга можно реализовать любой требуемый алгоритм. Короткие нажатия, длинные, удержание, автоповтор.
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):Я ждал, когда вы ткнете на это.
если вы надеетесь, что я восхищусь вашей прозорливостью, то вынужден вас разочаровать... стрельба из пушки по воробьям - вот как называется ваш подход. есть еще на форуме любители доказывать, что лучше ARM ничего нет - они могли бы посоветовать топикстартеру взять ARM с линухом на борту (ту же Raspberry) и небольшой скриптик на питоне...
Demiurg писал(а):Но и вопрос у него непростой
вопрос у него простой. если надо откупорить бутылку вина, надо использовать штопор, а не какие-нибудь технологии гиперпространственного перемещения материи сквозь стекло
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Demiurg писал(а):Я показал модульный подход. И конечный автомат. Плюс псевдопараллельность. Проект собран из готовых модулей. Допилен чуток модуль опроса кнопки и добавлен модуль алгоритма ТС.
ТС толком задачу даже не может обрисовать, а вы ему конечные автоматы с параллельностью суёте... :facepalm:
Пришёл и выеб.улся, типа - смотрите как я умею... Только вот перед кем ? Перед ТС'ом ? - Дак он вообще не понял ничего из ваших слов. Перед нами ? - Тогда смешно...
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а):вопрос у него простой. если надо откупорить бутылку вина, надо использовать штопор, а не какие-нибудь технологии гиперпространственного перемещения материи сквозь стекло
В том то и дело, что за простым вопросом ТС непростые задачи.
Предложите что-нибудь, что отвечает требованиям ТС. Смена режима в любой момент времени (минус подавление дребезга, это 20-100 мс). Сброс не предлагать. Смотрим на цифры дребезга контактов.
Последний раз редактировалось Demiurg Пт июл 15, 2016 21:13:33, всего редактировалось 1 раз.
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Аlex писал(а):...
Кто понимает, тот не ставит минусы, как и плюсы, в общем-то...
Не так ли? :)
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):Сброс не предлагать. Смотрим на цифры дребезга контактов
почему не предлагать? давайте тогда уж на логике какой-нибудь задачу решать... КР561-ой или там импортном аналоге... че так скромно - без сброса? это обычная функция микроконтроллера, которой можно и нужно пользоваться разумно. если для вас разумность ограничена только инициализацией МК, это лишь говорит о вашей ограниченности.

мне лень копаться в даташитах... но вы, надеюсь, понимаете, что тупейшая простейшая задержка в 10-20 миллисекунд в самом-самом начале main решит все проблемы с дребезгом кнопки на сбросе?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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

Сообщение Demiurg »

Z_h_e писал(а):...
Мне плевать на минус. Просто я был крайне удивлен, когда товарищ на полном серьезе написал, что поставил мне минус. Лично для меня этой фичи на сайте просто не существовало до этого момента.
Плюсы-минусы - это все детство.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ARV писал(а):мне лень копаться в даташитах... но вы, надеюсь, понимаете, что тупейшая простейшая задержка в 10-20 миллисекунд в самом-самом начале main решит все проблемы с дребезгом кнопки на сбросе?
Уважаемый, этот способ вынесен за скобки, как элементарная задача, которая нужна в двух случаях. Жесткая необходимость экономии ножек. Энергосбережение.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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

Сообщение Demiurg »

ARV писал(а):это легкий способ указать на неприемлемое поведение. ну или наоборот, указать на правильное поведение.
Тогда какого вы спрашивали конкретику? Ну подумайте еще раз.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

итак:
1. вы стали хамить без выдвижения каких-либо аргументов
2. я попросил вас уточнить претензии, надеясь на корректное, цивилизованное разрешение конфликта
3. вы проигнорировали, в очередной раз продемонстрировав свое неуважение к собеседнику (ко мне т.е.)
4. я отметил вас минусами только за эти два наезда, и открыто сказал об этом, т.к. тайные плевки в компот в качестве отмщения - не мой метод
что вам не понятно в этом описании произошедшего?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

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

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