Нашел тут 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 Спойлер: Нормальная работа, подключены только пины +5V и GND TEST - HIGH, BUSY - LOW, RXD - NC / HIGH / LOW вышеперечисленные значения не влияют на результат Спойлер: TEST подключен к GND Спойлер: На BUSY подан HIGH, каретка носится по нижней строке Спойлер: Неудачное включение Символы рандомны, шанс на такое примерно 20%, если подключать +5V дисплея к 5V Arduino, и 100% - если к Vin на Arduino Ниже я напишу еще пару особенностей, с которыми мне пришлось столкнуться. Может быть, проблема в них. Спойлер: Подробнее о работе VFD Ардуино подключен в порт USB3.0 компа. В соответствии с распиновкой подключил один из входов +5V к соответствующему выходу на контроллере и землю к земле. Сразу начались проблемы: дисплей не с первого раза включался по-нормальному. Судя по даташиту, в режиме ожидания, у него должен появиться курсор в начале, но в моем случае он показывал рандомные символы, и только после нескольких включений-выключений он, наконец, выдавал один курсор. Я подозреваю, что это из-за того, что ему не хватает силы тока. Если подключить землю к пину TEST, когда дисплей нормально работает, он начнет показывать все символы, что у него есть, что означает, что его чипы в порядке. Я пробовал различные комбинации состояний BUSY с RXD - ничего не помогло.
Мне разбираца с дисплеем, который никогда в глаза не увижу, разбираца лень, поэтому дашик крутанул по диагонали. Сейчас буду пороть. 1. В таблице 9 указаны скорости последовательного интерфейса. Какая скорость выбрана? 2. В не имеет ничего общего с тем, что написано выше по тексту. 3. Где в коде настройки UART и работа с ним?
Джамперы не стоят - значит 1200, но в сноске написано, что нужно что-то еще присобачить, поэтому пробовал перемычкой замкнуть J3 и поменять скорость в коде с 1200 на 7812,5 - без толку. Джамперы там такие, что их паять надо чтобы оставить замкнутыми, пока что не рисковал этого делать. Спойлер: Джамперы J3 был покрыт каким-то лаком, пришлось отдирать, чтобы замкнуть. В данный момент он разомкнут, через камеру кажется, что нет. Для того сюда и написал - чтобы мне указали, где я не правильно интерпретировал документацию. Я вообще первый раз работаю с серийными портами на таком низком уровне. Можно ссылку на литературу, где вкратце объясняется то, что мне в данный момент нужно? Что мне в коде нужно для работы с UART кроме моей функции writeByte() или SoftwareSerial.write()? А еще мне стало казаться, что BUSY - это выход а не вход. Это так?
Сигнал BUSY - сроду был выходом. См. appendix 2 даташита. По нему хост видит что периферия его слушает или занята своими делами. Если вы его еще не спалили - вам повезло.
Кому не лень, можете написать код, который будет просто отправлять два символа на этот дисплей? Допустим, что 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 По моей задумке, он должен был заполняться символом α
С линии БИЗИ читаете состояние дисплея. Если 0 - дисплей ждет команд. Если 1 - дисплей занят внутренней работой. Встроенные Частоты ввода последовательного интерфейса этого дисплея - нестандартные (при замкнутом J3), При разомкнутом - надо впаивать кварц, иначе интерфейс не будет работать. Поддерживает ли СофтСериал нестандартные частоты - не знаю. Это надо Паровоза спросить. Не мудрите с делаями и диджиталВрайтами в протоколе, используйте только библиотечные функции. Тут важны тайминги. Или пишите полностью свою полноценную функцию вывода.
На сайте arduino.cc написано, что софтсериал поддерживает только стандартные бауды. А вот обычный сериал - любой. Сейчас попробую запаять J3 (не знаю, как иначе его замкнуть), подключить RXD дисплея к пину ТX (1) ардуино и воспользоваться обычным Serial.write().
Сделал как сказал ранее - все заработало. Огромное вам спасибо за наводку. Идею использовать хардвейрсериал я взял у человека с похожей проблемой - https://forum.arduino.cc/index.php?topic=408263.0
Эээ, колИтесь. Вы как, прямо в настройках вписывали нестандартные частоты Serial.begin(xxxxx). и всё заработало ?
Код (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
а что не так с Код (C++): while(digitalRead(PIN_BUSY)!= LOW) { } ? UPD: Как оказалось, SoftwareSerial таки научился работать с нестандартными баудами. Теперь использую его, все работает. А на сайте ардуино не актуальная инфа. UPD2: Магия, с SoftwareSerial и моя проверка на BUSY стала работать, delay() теперь не нужен.