Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 34

Тема: Открытый проект Секвенсор на Arduino

  1. #11
    Аватар для RK9AMX
    Регистрация
    26.03.2005
    Адрес
    Челябинск, MO05RE
    Сообщений
    1,341
    Записей в дневнике
    20
    Позывной
    RK9AMX
    Цитата Сообщение от R3DMO Посмотреть сообщение
    Вот собственно исходник без всего лишнего сервиса.
    Спасибо! Люблю смотреть различную реализацию алгоритмов работы. Очень познавательно иногда.
    Позволите немного прокомментировать ваш код?
    Сомнения могут быть устранены только опытом.


  2. #12
    Прекращаем флуд в теме! Кому "релюхи" сюда не заглядывают и не оставляют свое "бесценное мнение"! Делайте на чем угодно, но данная тема вполне понятно называется.

  3. Спасибо от RK9AMX

  4. #13
    Аватар для R3DMO
    Регистрация
    05.05.2012
    Адрес
    Домодедово
    Сообщений
    334
    Позывной
    R3DMO ex RX3DJY
    Цитата Сообщение от RK9AMX Посмотреть сообщение
    Спасибо! Люблю смотреть различную реализацию алгоритмов работы. Очень познавательно иногда.
    Позволите немного прокомментировать ваш код?
    Не претендую на программиста С, так что принимаются все мнения!

  5. Спасибо от RK9AMX

  6. #14
    Аватар для RK9AMX
    Регистрация
    26.03.2005
    Адрес
    Челябинск, MO05RE
    Сообщений
    1,341
    Записей в дневнике
    20
    Позывной
    RK9AMX
    Часть кода с терминалом тоже интересна. Если сочтете возможным, то с удовольствием посмотрел бы и её)

    По коду. Когда назначаете номера выводов, то лучше их прописывать через константы или дефайны. Вы же не переназначаете работу портов в процессе выполнения алгоритма. Поэтому лучше сделать так:
    Код:
    const int buttonInt = 0;
    const int Button = 2;
    В результате данные запишутся во флеш (её не жалко ), а не будут болтаться в RAM.
    Объявление переменной (константы) int для назначения работы портов избыточно (2 байта). Достаточно uint8_t - 1 байт (0-255).
    В результате можно записать так:
    Код:
    const uint8_t buttonInt = 0;
    Дребезг контактов тактовых кнопок в зависимости от их конструктивных особенностей и износа может быть разным. Обычно 10-20мс, но может достигать 40мс и более. Это желательно учесть.

    Вот у вас реализован отчет интервала времени в обработчике прерывания через millis(), а в основном цикле вы используете delay. Delay останавливает выполнение алгоритма. Поэтому временные задержки лучше выполнять через счетчики. В ардуино они уже реализованы - millis() и micros(). if-ами в основном цикле проверяйте наступило событие или нет. Не забывайте при этом обновлять переменную со значением счетчика начала отсчета времени.

    Кстати, в обработчике прерывания непонятно для чего идет проверка if (millis() >= 10) {...}. Оно будет всегда верно, за исключением интервала времени 10мс после подачи питания и при переполнении счетчика после 4294967295мс. Так и задумано?

    Из кода непонятно как реализовано управление. Схему бы ещё посмотреть. Хотя бы от руки нарисованную. Так будет более предметный разговор.
    Сомнения могут быть устранены только опытом.

  7. #15
    Аватар для R3DMO
    Регистрация
    05.05.2012
    Адрес
    Домодедово
    Сообщений
    334
    Позывной
    R3DMO ex RX3DJY
    Полностью согласен с замечаниями насчёт портов. Этот код писался как проба работ с прерываниями, ну и так и остался. С дребезгом контактов в прерывании тут всё хитро. Как известно в прерывании ни Delay ни millis() и micros() не работают и не изменяют своих значений, а меняют свои значения в основной программе. Как видно в программе прерывание вызывается при изменении состояния входного сигнала. Если есть дребезг - я даже боюсь подумать в какое состояние мы попадём, потому что прерывание будет вызываться как по фронту так и по срезу входного сигнала. Так вот эта конструкция как бы фиксирует время вызова прерывания, и даёт его завершить без проблем. Счётчик тикает только в основном цикле. И опять же если дребезг то в прерывании никаких действий не будет. Вот такая вот идея.
    Управление - схему я не рисовал, она и так понятна. Выходы с модуля на ULN2003 ну и на реле, или если использовать готовые модули реле - можно напрямую на них. Там по входу стоят оптроны. Скоро будут отдельные микросхемы 328Р, попробую всё это с внутренним тактовым генератором.

  8. Спасибо от RK9AMX

  9. #16
    Аватар для RK9AMX
    Регистрация
    26.03.2005
    Адрес
    Челябинск, MO05RE
    Сообщений
    1,341
    Записей в дневнике
    20
    Позывной
    RK9AMX
    Цитата Сообщение от R3DMO Посмотреть сообщение
    Вот такая вот идея.
    Очень интересное решение. Тем не менее, даже если функция millis() не меняет своего значения во время прерывания, условие будет выполняться как я и описал. Есть такое подозрение. Я в описании прерывания не нашел, что происходит со значением счетчика millis(). Значение счетчика millis() сбрасывается в ноль после прерывания или счет продолжается со значения до прерывания?
    Сомнения могут быть устранены только опытом.

  10. #17

    Регистрация
    28.04.2005
    Адрес
    Московская обл., г. Мытищи
    Сообщений
    3,920
    Позывной
    ex RW3DKC
    Просто во время прерывания не тикает. Поэтому не надо в прерывании ничего долгого делать, можно зафиксировать изменение состояния кнопки и значение millis (не забыть обьявить переменные как volatile), а в основном цикле через 50мс от этого момента считаем, что кнопка нажата или отпущена, если будет дребезг - millis в прерывании поменяется и 50мс не натикают.

  11. Спасибо от RK9AMX

  12. #18
    Аватар для R3DMO
    Регистрация
    05.05.2012
    Адрес
    Домодедово
    Сообщений
    334
    Позывной
    R3DMO ex RX3DJY
    Да, в прерывании не тикает, а в основном цикле продолжает, а там ещё и delay внутри которых тоже не тикает. Так что однозначно время на дребезг пройдет.

  13. Спасибо от RK9AMX

  14. #19
    Аватар для RK9AMX
    Регистрация
    26.03.2005
    Адрес
    Челябинск, MO05RE
    Сообщений
    1,341
    Записей в дневнике
    20
    Позывной
    RK9AMX
    Цитата Сообщение от R3DMO Посмотреть сообщение
    Да, в прерывании не тикает, а в основном цикле продолжает
    Ага. Понятно. Тогда моё предположение, что условие в обработчике прерывания всегда будет верное подтвердилось.

    R2DHG, примерно так?
    Код:
    int buttonInt = 0;
    //...
    volatile uint32_t debouce_time;
    //...
    void setup () {
      //...
      attachInterrupt(buttonInt, swap, CHANGE);
    }
    
    
    // Обработчик прерывания
    void swap() {
      debounce_time = millis();
    }
    
    
    void loop () {
      if (millis() - debounce_time > 50) {
         // считаем, что кнопка нажата.
      }
      //...
    }
    Сомнения могут быть устранены только опытом.


  15. #20
    Аватар для R3DMO
    Регистрация
    05.05.2012
    Адрес
    Домодедово
    Сообщений
    334
    Позывной
    R3DMO ex RX3DJY
    Чтоб развеять сомнения можно в разных точках сохранить состояния а потом посмотреть их через Serial.print

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 23.05.2019, 20:56
  2. Ответов: 0
    Последнее сообщение: 06.03.2016, 21:21
  3. Открытый ответ на закрытое сообщение
    от Smolenkov_BN в разделе Темы не вошедшие в другие разделы форума
    Ответов: 2
    Последнее сообщение: 24.08.2013, 15:15
  4. Ответов: 1
    Последнее сообщение: 02.02.2012, 01:07

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •