Прерывания по уарту

Тема в разделе "Проводная и беспроводная связь", создана пользователем Рокки1945, 3 мар 2019.

  1. Рокки1945

    Рокки1945 Гуру

    Здравствуйте подскажите как сделать прерывание по концу приёма с уарта.
    Надо для организации приёма данных с пульта используя библиотеку IREMOTE.h.
    Не могу понять как это осуществить.
     
  2. Никак. И никаких прерываний для этой библиотеки не нужно.
     
  3. Рокки1945

    Рокки1945 Гуру

    Дядя Витя - объясни мне тогда как организовать -
    вот крутится цикл - и чтобы выйти из него или перейти по программе мне надо нажать заранее запрограммированную кнопку на пульте?
    Неужели - подпрограммы не надо?
    if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xB3D4B87F:
    digitalWrite( 13, HIGH );
    break;
    case 0x44490A7B:
    digitalWrite( 13, LOW );
    break;
    }
    irrecv.resume(); // принимаем следующую команду
    }
     
  4. в этом коде нет цикла
     
    Рокки1945 нравится это.
  5. Рокки1945

    Рокки1945 Гуру

    Почему светодиод не откликается пока идёт цикл?
    int m = 0;
    void loop() {

    if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xB3D4B87F:
    digitalWrite( 13, HIGH );
    break;
    case 0x44490A7B:
    digitalWrite( 13, LOW );
    break;
    }
    irrecv.resume(); // принимаем следующую команду
    }
    while(m < 100){
    m+=1;
    delay(300);
    Serial.println(m);
    }

    }
     
  6. Airbus

    Airbus Радиохулиган Модератор

    А!!!!!!!!!!!!!!
    [​IMG]
     
    Рокки1945 нравится это.
  7. Потому что в цикле не происходит обработки сигнала, может быть?
     
    Рокки1945 нравится это.
  8. Рокки1945

    Рокки1945 Гуру

    и что в каждую функцию его засовывать?
     
  9. Ну по-хорошему не следует писать функции, которые блокируют всю остальную программу на 30 секунд.
    Если никак, то делать прерывания по таймеру для обработки важных задач. Но не по уарту.
     
    Рокки1945 нравится это.
  10. Рокки1945

    Рокки1945 Гуру

    Дядя Вить - а если на Уно 1 таймер занят библиотекой для светодиодов, 2 таймер это для пульта, 0 таймер для прерываний - как быть?
     
  11. DetSimen

    DetSimen Guest

    используй TTimerList, на 328-й он работает на таймер0
     
    Рокки1945 нравится это.
  12. Рокки1945

    Рокки1945 Гуру

    попрубую - отпишусь пока вариант с модулем в котором встроен декодер НЕК
     
  13. Рокки1945

    Рокки1945 Гуру

    дайте пример а то на хабе одно СИ - пожалуйста !
     
  14. DetSimen

    DetSimen Guest

    https://github.com/DetSimen/Arduino_TimerList небольшое описание

    небольшой примерчег

    Код (C++):
    #include "TTimerList.h"

    extern TTimerList TimerList;

    THandle hGreenLed;   // Handle добавляемого счетчика для его последующей идентификации

    uint8_t greenLedPin = 13;

    void tmrGreenLed(void){
      static bool ledState=true;              // состояние светодиода
      digitalWrite(greenLedPin, ledState);    // вывести состояние в светодиод
      ledState = !ledState;            // инвертировать состояние
    }

    void setup(){
      pinMode(greenLedPin, OUTPUT);
      hGreenLed = TimerList.Add(1000,tmrGreenLed); // функция tmrGreenLed будет вызываться раз в 1000 мс.
    }

    void loop(){}
     
    Kolyn и Рокки1945 нравится это.
  15. Использовать таймер вачдога. Брать другой контроллер. Переписывать таки код.
     
  16. Romambius

    Romambius Нуб

    Да! Чтоб выйти из цикла по нажатию кнопки пульта внутри цикла также нужно организовать проверку сигнала с иктприемника!
     
  17. b707

    b707 Гуру

    не надо. Реально в коде сообщения №5 цикл вообще не нужен, тогда и проблема "выйти из цикла" исчезнет сама собой.
    дядяВитя еще в марте написал - "по хорошему не надо писать циклы на 30 секунд". И именно это было главным в его ответе, а не прерывания.