Репликация последовательной связи Arduino на atmega328p - PullRequest
0 голосов
/ 21 мая 2018

У меня есть простая схема с ESP8266 и Arduino Nano, переданная через последовательный порт.

Чтобы проверить это сообщение, я посылаю простую строку «ВКЛЮЧЕНО», и Arduino должен включить светодиод.

Это код Arduino:

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}

void loop() {

  if(Serial.available() > 0) 
  {
    String command = "";
    while(Serial.available())
    {
      command += (char)Serial.read();
      delay(1);
      if (command == "T"){
        while(Serial.available())
        {
          command += (char)Serial.read();
          delay(1);
        }
      }else{
        command = "";
      }
    }

    if(command == "TURN ON") {
      digitalWrite(3, HIGH);  
    }

    if(command == "TURN OFF") {
      digitalWrite(3, LOW);
    }
  }

  delay(500);
}

Это прекрасно работает.

Теперь я хотел бы заменить Arduino на Atmega328p.

У меня есть базовая схема: enter image description here

Плюс светодиод и контакты TX и RX, подключенные к ESP8266.

Если я загружаю тот же код вAtmega328p, это не работает, так что я думаю, что мне не хватает чего-то очень важного (например, конфигурации UART или чего-то еще), но я не знаю, что это такое

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

То, как вы используете Serial API, очень чувствительно к синхронизации байтов.В зависимости от времени получения байтов вы можете просто вернуться к началу цикла и установить command в пустую строку, то есть ваша программа забудет о байтах, которые она видела ранее.Вам повезло, что этот код работал на одном процессоре, и неудивительно, что он не работает на другом.

Как насчет того, чтобы ограничить себя однобайтовыми командами сейчас?«T» может включить светодиод, а «S» может выключить его.Для реализации многобайтовых команд вам, вероятно, понадобится небольшой конечный автомат, и вам нужно будет передавать его байты из UART по одному, таким образом, чтобы это не зависело от времени.

0 голосов
/ 11 июня 2018

В случае, если кто-то прибывает сюда с аналогичной проблемой:

Да, это должно работать так, как я планировал.

Я использовал поврежденный макет!(вы не можете получить сообщение, если контакты не подключены ...)

0 голосов
/ 21 мая 2018

Я предполагаю, что вы использовали внешний программатор с Atmega328p, и это новый Atmega328p.

Если мои предположения верны, то биты предохранителей в вашем Atmega328p настроены на использование внутренней 1 МГцчасы, и это вызывает проблему.

Что вы можете сделать, чтобы это исправить: Подключите программатор к Atmega328p. Перейдите в Инструменты> Платы, выберите Arduino Uno в Платы.Перейдите в Инструменты> Программист выберите программист, который вы используете.Зайдите в инструменты и выберите Burn bootloader.

Затем вы можете загрузить свой код в Atmega328p, он должен начать работать так, как вы ожидаете.

Надеюсь, это поможет.

...