Управление VFD-дисплеем Futaba через последовательный порт

Тема в разделе "Arduino & Shields", создана пользователем iZont, 26 июн 2019.

  1. iZont

    iZont Нерд

    Нашел тут VHD дисплей Futaba M402SD07GJ и решил попробовать запустить его с помощью Arduino. Долго копаясь в гугле, умудрился найти даташит именно для него. В даташите написано, что дисплей может работать как в параллельном так и в последовательном режиме. Т.к. у меня не хватает проводов, я выбрал последовательный режим.
    Насколько я понимаю, мне нужно подать на пин BUSY сигнал LOW и тут же начать передавать байт информации на RXD, начиная с нуля и заканчивая единицей, одновременно с которой BUSY должен будет венруться на HIGH (я руководствовался пунктом даташита 4-2-2). Но, если подать HIGH к BUSY, курсор начинает носиться по нижней строке, а изменения на RXD ни на что не влияют.

    Код, с помощью которого я пытался управлять:
    Код (Text):
    void writeByte(int pin, int data) {
      for (int i = 0; i < 8; i++) {
          digitalWrite(pin, bitRead(data, i) == 1
              ? HIGH : LOW);
          delayMicroseconds(DELAY_BIT_MICRO);
        }
    }

    digitalWrite(PIN_BUSY, LOW);
    digitalWrite(PIN_RXD, LOW);
    delayMicroseconds(DELAY_BIT_MICRO);
    writeByte(6, 157);
    digitalWrite(PIN_RXD, HIGH);
    delayMicroseconds(DELAY_BIT_MICRO / 2);
    digitalWrite(PIN_BUSY, HIGH);
    Пины RXD и BUSY в void setup() я ставил в положение HIGH
    DELAY_BIT_MICRO равен (1 000 000 / 1 200) - секунда делится на скорость бит в секунду.
    Вместо своей функции writeByte пробовал использоввать библиотеку SoftwareSerial - нет эффекта.

    Даташит:
    https://yadi.sk/i/369hPd_fh-wMUQ

    [​IMG]
    TEST - HIGH, BUSY - LOW, RXD - NC / HIGH / LOW
    вышеперечисленные значения не влияют на результат
    [​IMG]
    [​IMG]
    [​IMG]
    Символы рандомны, шанс на такое примерно 20%, если подключать +5V дисплея к 5V Arduino, и 100% - если к Vin на Arduino

    Ниже я напишу еще пару особенностей, с которыми мне пришлось столкнуться. Может быть, проблема в них.

    Ардуино подключен в порт USB3.0 компа. В соответствии с распиновкой подключил один из входов +5V к соответствующему выходу на контроллере и землю к земле. Сразу начались проблемы: дисплей не с первого раза включался по-нормальному. Судя по даташиту, в режиме ожидания, у него должен появиться курсор в начале, но в моем случае он показывал рандомные символы, и только после нескольких включений-выключений он, наконец, выдавал один курсор. Я подозреваю, что это из-за того, что ему не хватает силы тока. Если подключить землю к пину TEST, когда дисплей нормально работает, он начнет показывать все символы, что у него есть, что означает, что его чипы в порядке.

    Я пробовал различные комбинации состояний BUSY с RXD - ничего не помогло.
     
    Un_ka нравится это.
  2. parovoZZ

    parovoZZ Гуру

    Мне разбираца с дисплеем, который никогда в глаза не увижу, разбираца лень, поэтому дашик крутанул по диагонали. Сейчас буду пороть.
    1. В таблице 9 указаны скорости последовательного интерфейса. Какая скорость выбрана?
    2. В
    не имеет ничего общего с тем, что написано выше по тексту.
    3. Где в коде настройки UART и работа с ним?
     
  3. iZont

    iZont Нерд

    Джамперы не стоят - значит 1200, но в сноске написано, что нужно что-то еще присобачить, поэтому пробовал перемычкой замкнуть J3 и поменять скорость в коде с 1200 на 7812,5 - без толку. Джамперы там такие, что их паять надо чтобы оставить замкнутыми, пока что не рисковал этого делать.
    [​IMG]
    J3 был покрыт каким-то лаком, пришлось отдирать, чтобы замкнуть. В данный момент он разомкнут, через камеру кажется, что нет.

    Для того сюда и написал - чтобы мне указали, где я не правильно интерпретировал документацию. Я вообще первый раз работаю с серийными портами на таком низком уровне. Можно ссылку на литературу, где вкратце объясняется то, что мне в данный момент нужно? Что мне в коде нужно для работы с UART кроме моей функции writeByte() или SoftwareSerial.write()?

    А еще мне стало казаться, что BUSY - это выход а не вход. Это так?
     
  4. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Сигнал BUSY - сроду был выходом. См. appendix 2 даташита. По нему хост видит что периферия его слушает или занята своими делами. Если вы его еще не спалили - вам повезло.
     
    Последнее редактирование: 28 июн 2019
  5. iZont

    iZont Нерд

    Кому не лень, можете написать код, который будет просто отправлять два символа на этот дисплей? Допустим, что 4 - пин RXD, 6 - BUSY

    Ибо я явно что-то не понимаю, либо он таки сдох (хотя режим TEST все показывает как надо). Вот мой код:
    Код (C++):

    #include <SoftwareSerial.h>

    #define PIN_RXD 4
    #define PIN_BUSY 6

    const long BIT_DELAY = 1000000 / 1200; // Время, в течение которого передается бит.

    SoftwareSerial vfd(5, PIN_RXD);

    void setup() {
      pinMode(PIN_RXD, OUTPUT);
      pinMode(PIN_BUSY, INPUT);
      digitalWrite(PIN_RXD, HIGH); // Судя по даташиту, в режиме ожидания RX должен быть HIGH
      vfd.begin(1200);
    }

    void writeByte(int pin, byte b) { // Функция, посылающая байт на пин RXD
      for (int i = 0; i < 7; i++) {
        digitalWrite(pin, bitRead(b, i) == 0 ? LOW : HIGH);
        delayMicroseconds(BIT_DELAY);
      }
    }

    void loop() {
      if (digitalRead(PIN_BUSY) == LOW) {
        digitalWrite(13, HIGH); // При отправке включаем индикатор
        digitalWrite(PIN_RXD, LOW);
        delayMicroseconds(BIT_DELAY);
        //writeByte(PIN_RXD, 0xB0); // Пробовал как свой wryteByte(), так и SoftwareSerial ниже
        vfd.write(0xB0);
        digitalWrite(PIN_RXD, HIGH);
      }
      digitalWrite(13, LOW); // Выключаем индикатор, когда ничего не отправляем
    }
     
    Ноль внимания. Курсор стоит в начале. Индикатор отправки постоянно горит, значит RXD ддосится байтами 0xB0

    По моей задумке, он должен был заполняться символом α
     
    Последнее редактирование: 28 июн 2019
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    С линии БИЗИ читаете состояние дисплея. Если 0 - дисплей ждет команд. Если 1 - дисплей занят внутренней работой. Встроенные Частоты ввода последовательного интерфейса этого дисплея - нестандартные (при замкнутом J3), При разомкнутом - надо впаивать кварц, иначе интерфейс не будет работать. Поддерживает ли СофтСериал нестандартные частоты - не знаю. Это надо Паровоза спросить. Не мудрите с делаями и диджиталВрайтами в протоколе, используйте только библиотечные функции. Тут важны тайминги. Или пишите полностью свою полноценную функцию вывода.
     
    Последнее редактирование: 29 июн 2019
  7. iZont

    iZont Нерд

    На сайте arduino.cc написано, что софтсериал поддерживает только стандартные бауды. А вот обычный сериал - любой. Сейчас попробую запаять J3 (не знаю, как иначе его замкнуть), подключить RXD дисплея к пину ТX (1) ардуино и воспользоваться обычным Serial.write().
     
  8. iZont

    iZont Нерд

    Сделал как сказал ранее - все заработало. Огромное вам спасибо за наводку. Идею использовать хардвейрсериал я взял у человека с похожей проблемой - https://forum.arduino.cc/index.php?topic=408263.0
     
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Эээ, колИтесь. Вы как, прямо в настройках вписывали нестандартные частоты
    Serial.begin(xxxxx).
    и всё заработало ?
     
  10. iZont

    iZont Нерд

    [​IMG]

    Код (C++):
    #define PIN_BUSY 6

    void writeByte(byte b) {
      while (digitalRead(PIN_BUSY) != LOW) { }
      Serial.write(b);
      delay(10);
    }

    void setup() {
      pinMode(PIN_BUSY, INPUT);
      Serial.begin(7812);

      delay(3000);

      writeByte(0x1F);
      writeByte(0x43);
      writeByte(0xE2);
      writeByte(0x41);
      writeByte(0x43);
      writeByte(0xDF);
      writeByte(0xDA);
      writeByte(0x4F);
      writeByte(0x20);
      writeByte(0x42);
      writeByte(0x43);
      writeByte(0x45);
      writeByte(0x4D);
      writeByte(0x20);
      writeByte(0x10);
      writeByte(0x28);
      writeByte(0x48);
      writeByte(0x45);
      writeByte(0x4C);
      writeByte(0x4C);
      writeByte(0x4F);
      writeByte(0x20);
      writeByte(0x57);
      writeByte(0x4F);
      writeByte(0x52);
      writeByte(0x4C);
      writeByte(0x44);
      writeByte(0x21);
    }

    void loop() { }
    Без delay(10) выдавал ахинею.

    Ща буду писать под него библиотеку. Попробую все же использовать любой другой пин, нежели TX
     
    Последнее редактирование: 29 июн 2019
  11. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вы delay(10) заменили проверку состояния БИЗИ. Всё логично.
     
  12. iZont

    iZont Нерд

    а что не так с
    Код (C++):
    while(digitalRead(PIN_BUSY)!= LOW) { }
    ?

    UPD: Как оказалось, SoftwareSerial таки научился работать с нестандартными баудами. Теперь использую его, все работает. А на сайте ардуино не актуальная инфа.

    UPD2: Магия, с SoftwareSerial и моя проверка на BUSY стала работать, delay() теперь не нужен.
     
    Последнее редактирование: 29 июн 2019