Перейти к содержанию

demiurg1978

Members
  • Постов

    361
  • Зарегистрирован

  • Посещение

Комментарии блога, опубликованные demiurg1978

  1. Делал как то автоматику на КМОП серии. Столкнулся с тем, что при включении питания триггеры могут включиться в любое состояние. Все неиспользуемые выводы у меня были зашунтированы либо резисторами 10 кОм либо намертво к соответствующей полярности. У всех ключевых триггеров на входах Reset поставил RC цепочки. У вас я вижу у второго триггера есть на входе Reset RC цепочка. А у первого триггера нет сброса при включении питания.

    Да, у вас интересно сделан самосброс RS-триггера. Есть ложные срабатывания при подаче питания? Как бы понятно, стоит конденсатор, и вход зашунтирован низким уровнем. Но?

  2. 2 минуты назад, Falconist сказал:

    МЛАДЕНЕЦ

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

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

  4. Правнучка - похвально. Вдвойне похвально, что вы делаете для нее что-то своими руками. Про переменный резистор верно упомянули. Отвалилась ручка и приплыли. Я успел оценить вашу квалификацию. И поддерживаю про гальваническую развязку. Ваших знаний хватит, чтобы купить DC-DC преобразователь, с гальванической развязкой (они есть и размеры у них небольшие), и на той же NE555 шимом замутить регулировку яркости.

  5. Засуньте сейчас свою исключительность ммм... куда-нибудь. Вы сами писали, а как же начинающие. И представляете, они не всегда пишут свои проекты в вашем компиляторе. IAR, AVR-Studio Toolchain, WinAVR. Этого достаточно. Не согласны? Варитесь сами в своем компиляторе. Я знаю что грубо. Написал статью, держи свою гранату. А теперь отключим эмоции, включим осознанность. Я на свои работы получил карт бланш. У Татарчевского, у редакции. Ты получил карт бланш на статью в easyelectronics? Замахнулся, соответствуй... Все по взрослому.

  6. Я вам уже писал. Кроссплатформенность. Если вы дадите решение, которое будет работать на всех компиляторах с минимальными переделками, ещё лучше, проект сделанный в разных компиляторах, как делают некоторые авторы статей, честь вам и хвала. Если же будет решение для единственного компилятора, тогда практический смысл имеет только для вас.

    Лично мне пришлось помучиться, чтобы перевести проект micromenu с easyelectronics.ru на IAR. Тем более что на тот момент у меня были сложности с указателями в си. 

  7. MicroMenu неплохой проект. Но вы не поняли его сути. Сразу скажу, для своих нужд я ничего лучшего не нашёл. Плюсы этого проекта. Сведение большой части данных по меню в одно место. Навигация, сами пункты, текст, вспомогательные функции. Минусы. Ожидаемой универсальности, что вы приписываете, нет. Иначе, придётся вводить дополнительные поля, что приводит к расходу flash памяти. И по большому счету ненужный балласт.

    Поверьте, я достаточно хорошо разбирался с этим проектом. Притом, в моей реализации из статьи easyelectronics.ru взяты имена. Parent, Child и так далее. Но за основу взят оригинальный проект с AVRFreaks.

    Что могу сказать, для разных типов дисплеев все равно придётся делать разные реализации. Символьные, графические, семисегментные. Это разные реализации. Количество кнопок управления соответственно навигация по меню тоже вносит свои коррективы.

    Что в итоге остается: MicroMenu это всего лишь завернутый в красивые фантики (макросы) доступ к структурам. И ничего более. Всё остальное, что вы так красиво расписали, все равно придётся делать ручками.

  8. Посмотрел код. И поматерился. Динамическую индикации вы сделали в лоб. Хотя табличным методом это сделать проще. И работать будет в разы быстрее по тактам. Магические числа. Проект сделан одноразово. Программу в дальнейшем невозможно редактировать как либо. Возможно вы этот проект делали на заре освоения МК.

  9. Защита от дребезга контактов - слишком громко сказано. Это элементарщина. Вижу код тут не выкладывается. Зря. Конечные автоматы, автоматное программирование. Функционал в начале расписан. Будем считать это как ТЗ. Накидать программу за вечерок как два пальца... Дарю кусочек кода

    Spoiler
    
    //========================================================================
    #ifndef KBD_DRV_H
    
    #define KBD_DRV_H
    
    #include "kbd_drv.h"
    
    #include "main_def_func.h"
    //========================================================================
    
    //========================================================================
    #ifdef __PROJECT_MODE_WORK__
    #define DEBOUNCE_DELAY 30
    #define HOLD_DELAY_1   300
    #define HOLD_DELAY_2   5000
    #endif
    
    #ifdef __PROJECT_MODE_DEBUG__
    #define DEBOUNCE_DELAY 3
    #define HOLD_DELAY_1   10
    #define HOLD_DELAY_2   50
    #endif
    //========================================================================
    
    //========================================================================
    #ifdef __WORK_BOARD__
    #define KEY_PIN        PINB
    #define KEY_PORT       PORTB
    //------------------------------------------------------------------------
    #define KEY            PB0
    #define KEY_BIT        1<<KEY
    #endif
    //------------------------------------------------------------------------
    
    //------------------------------------------------------------------------
    #ifdef __DEBUG_BOARD__
    #define KEY_PIN        PIND
    #define KEY_PORT       PORTD
    //------------------------------------------------------------------------
    #define KEY            PD0
    #define KEY_BIT        1<<KEY
    #endif
    //========================================================================
    
    //========================================================================
    //#define KEY1_PRESSED() ((KEYS1_PIN & (1<<BIT_KEY1) == 0)
    //#define KEY1_UNPRESSED() ((KEYS1_PIN & (1<<BIT_KEY1) == 1)
    
    #ifdef __PROJECT_MODE_WORK__
    #define Set_Is_Key_Pressed() !(check_bit (KEY_PIN, KEY))  // Low level.
    #endif
    
    #ifdef __PROJECT_MODE_DEBUG__
    #define Set_Is_Key_Pressed() check_bit (KEY_PIN, KEY)  // Low level.
    #endif
    
    // При работе с буфером входов (расширение ввода-вывода):
    // #define Set_Is_Key_Stop_Pressed()   check_bit (inputs_buf [0], KEY_STOP)
    //========================================================================
    
    //========================================================================
    typedef enum _kbd_drv
    {
       KBD_DRV_INIT = 0,
       KBD_DRV_NONE,
       KBD_DRV_WAIT_DOWN,
       KBD_DRV_DOWN,
       KBD_DRV_WAIT_UP,
       KBD_DRV_UP,
    } kbd_drv_t;
    //========================================================================
    
    //========================================================================
    typedef enum keys_buf
    {
       KEY_COD_SHORT_PRESS = 0,
       KEY_COD_LONG_PRESS,
    } key_cod_t;
    //========================================================================
    
    //========================================================================
    typedef enum key_press_mode
    {
       KEY_PRESS_MODE_NONE = 0,
       KEY_PRESS_MODE_WAIT_LONG_PRESS,
       KEY_PRESS_MODE_WAIT_RESET,
    } key_press_mode_t;
    //========================================================================
    
    //========================================================================
    void kbd_drv (void);
    //------------------------------------------------------------------------
    void Set_Keys_Buf (key_cod_t a);
    key_cod_t Get_Keys_Buf (void);
    //========================================================================
    
    #endif
    
    //========================================================================
    #include "kbd_drv.h"
    //========================================================================
    
    //========================================================================
    static kbd_drv_t _kbd_drv;
    
    static key_cod_t keys_buf;
    
    static key_press_mode_t key_press_mode;
    
    static soft_timer ST_KBD_DRV;
    //========================================================================
    
    //========================================================================
    void kbd_drv (void)
    {
       switch (_kbd_drv)
       {
          case KBD_DRV_INIT:
             key_press_mode = KEY_PRESS_MODE_NONE;
             _kbd_drv = KBD_DRV_NONE;
             break;
    
          case KBD_DRV_NONE:
             if (Set_Is_Key_Pressed ()) // Если кнопка нажата, то
             {
                set_soft_timer (ST_KBD_DRV, DEBOUNCE_DELAY); // установка таймера антидребезга.
                _kbd_drv = KBD_DRV_WAIT_DOWN;
             }
             break;
    
          case KBD_DRV_WAIT_DOWN:
             if (handle_soft_timer (ST_KBD_DRV)) // Таймер антидребезга.
             {
                if (Set_Is_Key_Pressed ())
                {
                   set_soft_timer (ST_KBD_DRV, HOLD_DELAY_1); // Установка таймера длинного нажатия кнопки.
                   key_press_mode = KEY_PRESS_MODE_WAIT_LONG_PRESS;
                   _kbd_drv = KBD_DRV_DOWN;
                }
                else
                   _kbd_drv = KBD_DRV_NONE;
             }
             break;
    
          case KBD_DRV_DOWN:
             if (Set_Is_Key_Pressed ())
             {
                if (handle_soft_timer (ST_KBD_DRV))
                {
                   switch (key_press_mode)
                   {
                      case KEY_PRESS_MODE_WAIT_LONG_PRESS:
                         set_soft_timer (ST_KBD_DRV, HOLD_DELAY_2); // Установка таймера RESET.
                         key_press_mode = KEY_PRESS_MODE_WAIT_RESET;
                         break;
    
                      case KEY_PRESS_MODE_WAIT_RESET:
                         Set_Event (EV_ID_RESET, USER_EVENT); // Событие нажатия кнопки.
                         key_press_mode = KEY_PRESS_MODE_NONE;
                         _kbd_drv = KBD_DRV_WAIT_UP;
                         break;
                   }
                }
             }
             else
                _kbd_drv = KBD_DRV_WAIT_UP;
             break;
    
          case KBD_DRV_WAIT_UP:
             if (!(Set_Is_Key_Pressed ())) // Если кнопка отпущена, то
             {
                set_soft_timer (ST_KBD_DRV, DEBOUNCE_DELAY); // Таймер подавления дребезга.
                _kbd_drv = KBD_DRV_UP;
             }
             break;
    
          case KBD_DRV_UP:
             if (handle_soft_timer (ST_KBD_DRV)) // Таймер подавления дребезга.
             {
                if (!(Set_Is_Key_Pressed ()))
                {
                   switch (key_press_mode)
                   {
                      case KEY_PRESS_MODE_WAIT_LONG_PRESS:
                         Set_Keys_Buf (KEY_COD_SHORT_PRESS); // Короткое нажатие.
                         Set_Event (EV_ID_KEY_PRESSED, USER_EVENT); // Событие нажатия кнопки.
                         break;
    
                      case KEY_PRESS_MODE_WAIT_RESET:
                         Set_Keys_Buf (KEY_COD_LONG_PRESS); // Длинное нажатие.
                         Set_Event (EV_ID_KEY_PRESSED, USER_EVENT); // Событие нажатия кнопки.
                         break;
                   }
    
                   _kbd_drv = KBD_DRV_INIT;
                }
                else
                   _kbd_drv = KBD_DRV_WAIT_UP;
             }
             break;
       }
    }
    //========================================================================
    
    //========================================================================
    void Set_Keys_Buf (key_cod_t a)
    {
       keys_buf = a;
    }
    //------------------------------------------------------------------------
    key_cod_t Get_Keys_Buf (void)
    {
       return keys_buf;
    }
    //========================================================================
    
    
    //Шкелет основной программы:
    
    //========================================================================
    void proc_device (void)
    {
       static proc_device_t _proc_device;
    
       static soft_timer ST_PROC_DEVICE;
    
       static u08 cnt_inputs;
    
       if (Get_Event (EV_ID_RESET))
          _proc_device = PROC_DEVICE_INIT;
    
       switch (_proc_device)
       {
          case PROC_DEVICE_INIT: // Блок инициализации.
             break;
    
          case PROC_DEVICE_1:
             if (Get_Event (KEY_COD_SHORT_PRESS))
             {
                if (++cnt_inputs >= MAX_INPUTS)
                   cnt_inputs = 0;
             }
    
             switch (cnt_inputs)
             {
                case 0:
                   INPUTS_PORT = INPUT_2
                   break;
    
                case 1:
                   INPUTS_PORT = INPUT_3
                   break;
    
                case 2:
                   INPUTS_PORT = INPUT_4
                   break;
    
                case 3:
                   INPUTS_PORT = INPUT_1
                   break;
             }
             break;
    
          case PROC_DEVICE_2:
             break;
       }
    }
    //========================================================================

     

     

  10. Когда начинаете подобные разговоры, вспомните о том, что любой бизнес стремится получить максимальную выгоду при минимуме вложений. Также о полезных ископаемых. Не в каждой стране есть ресурсы. Медь очень дорогая. Механические коммутаторы дороги в любом отношении. Что по по содержанию металлов что по изготовлению. Гораздо проще сделать электронное управление. Это экономичнее по всем пунктам.

  11. STK-500 отладочная плата и программатор AVR. Поддерживает как параллельное, высоковольтное программирование так и ISP (внутриплатное программирование). Удобна набором панелек для AVR в DIP-корпусах. Наличием 8 кнопок и 8 светодиодов. Минус - работает от COM порта.

    AVR-Studio 4.19.

  12. Лично я зарабатываю на AVR. Поэтому и спокойно трачу деньги на эти программаторы. Деньги я отбил уже давно. Зато никакого геморроя. Работаю только со студией 4.19. Отладки у этих программаторов нет. Никогда не пользовался отладкой. Программы отлаживаю в симуляторе студии, потом на железе.

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

  14. Когда-то высокий порог вхождения отсеивал несостоявшихся. И это было правильно...

    Помню, лет в 15 читал в одном журнале как на МК сделать прибор 3 в одном. Частотомер, длительность, что-то еще. На 1816ВЕ31. Я начал изучать тему, но тогда с этим делом было туго. Открытой информации нуль.

  15. 1 час назад, Darth_Vader сказал:

    Я даже не знаю, есть ли они - поэтому и говорю "возможно".

    В данном случае все зависит от ваших предпочтений, хотелок и фантазии. Рассыпуха или МК... Я начну в вашу сторону смотреть очень недоуменным взглядом...

     

    727732.jpg

×
×
  • Создать...