Прерывания аналоговый вход и SoftSerial

Тема в разделе "Arduino & Shields", создана пользователем sanik, 17 ноя 2018.

  1. sanik

    sanik Гик

    Добрый день уважаемые форумчане. У меня некое устройство, управляется двумя способами на выбор, управление реализовано с помощью аналоговой клавиатуры и помощью SoftSerial с андроида. Так то все работает но плохо реагирует на управление. Скажите возможно ли сделать прерывание на такое управление?
    И если можно то помогите разобраться как? С прерыванием по пину я разобрался как работает. А здесь я так думаю нужно реализовать по событию Но не знаю как это сделать.
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial softSerial(3, 2); // Создаём объект softSerial указывая выводы RX, TX


    byte key() {
      if (softSerial.available()) {
        int valserial = softSerial.read();
        if (valserial == 'W') {
          return 3;
        }
        else if ( valserial == 'S') {
          return 4;
        }
        else if ( valserial == 'A') {
          return 2;
        }
        else if ( valserial == 'D') {
          return 5;
        }
        else if ( valserial == 'B') {
          return 1;
        }
        else  return 0;
      }
      else {
        int val = analogRead(6);
        if (val < 50) return 5;
        else if (val < 150) return 4;
        else if (val < 350) return 2;
        else if (val < 510) return 1;
        else if (val < 800) return 3;
        else return 0;
      }
    }
    void setup() {
      // put your setup code here, to run once:
    softSerial.begin(38400);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      byte KEY = key();
    }
     
  2. parovoZZ

    parovoZZ Гуру

    в этих МК нет никаких событий. События есть в atxmega и в тиньках от них.
    Softserial выкинуть и заменить аппаратным. Там же и прерывания будут доступны.
    С АЦП ни к чему с такой частотой бомбить. Достаточно 10 раз в секунду.
     
    Igor68 нравится это.
  3. parovoZZ

    parovoZZ Гуру

    код вообще неправильный - пока МК сидит в функции аналогрид (а сидит он там долго, ибо МК останавливается и ни на какие прерывания не реагирует), данные, которые приходят на пин softserial исчезают в небытие.
     
  4. Daniil

    Daniil Гуру

    В стандартных примерах есть вариант приема данных через прерывание по Serial
     
  5. sanik

    sanik Гик

    Может подскажите ка это реализовать?
     
  6. parovoZZ

    parovoZZ Гуру

    конфигурируешь АЦП на старт от блока сравнения одного из таймеров (OCRnA или OCRnB, где n - номер таймера). Далее конфигурируешь выбранный таймер таким образом, чтобы его блок сравнения (OCRnA или OCRnB) срабатывал нужное количество раз в секунду. Разрешаешь прерывания от АЦП и от выбранного блока сравнения. Все. АЦП полностью работает параллельно нашей программе. Нам только в прерывание от АЦП забрать из его регистра данные.
     
  7. sanik

    sanik Гик

    К сожалению я в С++ не силен Да и ардуино только изучаю.
     
  8. DetSimen

    DetSimen Guest

    Вот и изучай, за тебя никто этова не сделает
     
    Daniil нравится это.
  9. parovoZZ

    parovoZZ Гуру