Имитатор сигналов на контроллр ЖКИ.
- Войдите на сайт для отправки комментариев
Ардуино пользовался несколько раз и всегда удавалось подобрать готовый скетч, но вэтот раз не получается.
Вышел из строя ЖКИ на измерителе уровня. ЖКИ управляется микроосхемой MM145453V (https://pdf1.alldatasheet.com/datasheet ... 5453V.html) Почитал даташит получается инфа на микросхему приходит по двум проводам clock и data. в соответствии с этой картинкой https://htmlimg2.alldatasheet.com/htmldatasheet/560442/TI/MM145453V/154/5/MM145453V.png.
Всего там 36 бит.
1-й бит стартовый всегда 1.
Дальше идут 33 бита информации и затем 2 бита как бы для синхронизации между сигналами clock и data они написано желательно должны быть 0-ми.
Моя задача написать программу для arduino nano , которая имитиравала бы сигналы приходящие на контроллер ЖКИ. И чтоб я мог сам устанавливать значения этих 33-х значащих бит. Это мне нужно для соответствия таблицы соответствия между входным сигналом и отображаемой на ЖКИ информации. Есть идея перенаправить эту инфу потом на ЖКИ 1602.
Но повторюсь в arduino пока практически ноль.
Прошу помощи составить алгоритм по котораму бы мог работать данный имиттатор. А затем пользуясь алгоритмом я попытался бы освайвать нужные мне темы и пробовать мисать программу. Буду очень признателен тем кто откликнется.
Немного поразмыслил мне нужно просто создать 36 переменных типа булеан. Затем присвоить каждой из них значение и вывести на как-нибудь цифровой выход. В цикле и в этом же цикле на другой цифровой выход выводить импульс clook. Это у меня будут биты данных. Но как мне привязать к ним синхроимпульсы на пине clock с точным значением как в даташите. И как задать частоту прохождения пачек моих импульсов? Использовать delay?
Хотел создать массив из переменнх булеан
// присваиваю переменным значения. boolean nMassiv[5]= {true,false,true,false,false}; void setup() { pinMode(13, OUTPUT); // определяем вывод 13 (светодиод) как выход DATA pinMode(11, OUTPUT); // определяем вывод 11 как выход CLOCK } void loop() { // вывожу на светодиод значения. for (nMassiv i=1; i<5; i++) Serial.print(""); }Компилятор ругается Как правильно создать массив булеан?
boolean это тоже просто байты в которых может храниться только два значения 0 и 1
boolean это тоже просто байты в которых может храниться только два значения 0 и 1
Так кактогда мнеправильно массивто оформить?
boolean это тоже просто байты в которых может храниться только два значения 0 и 1
Так кактогда мнеправильно массивто оформить?
В инете про булевые массивы примеры не нашел.
Писать вместо тру и фэлсе сразу 1 и 0 ?
думаю да
void loop() { // вывожу на светодиод значения. for (uint8_t i=0; i<5; i++) { Serial.println(nMassiv[i]); } }продолжите дальше в таком духе, вас пошлют читать азы языка С.
ОТвет не понял можно подробнее. это комментарий не убрал . хотел в сериал вывести.
я предупреждал, изучайте основы, начните с Blink.
Согласен с вами про BLINK. Но у меня прибор стоит сломаннный ультразвуковой измеритель уровня. Мне нужно его починить. ВЫше все писал. Да и существует мнение что если начинаешь делать сразу что-то полезное и знания лучше закрепляются. А информацию про организацию правильную булевых массивов действительно не нашел в интернете. Если имеете скиньте ссылочку.
Всавил кусок вашего скетча и весь скетч собрался без ошибок. НО в мониторе порта никакие циферки не пробежали. Извините я действительно в СИ еще сильно дубоват. Так же буду признателен за ссылку на подробный справочник по командам СИ.
Прошу прощения не прописал скорость обмена с портом теперь циферки бегут.
НА пине 13 который будет имитировать DATA импулсы получить удалось правда под нагрузкой не смотрел. Теперь нужно организовать импульсы CLOCK и если получится можно будет составлять карту индикатора.
Ардуино пользовался несколько раз и всегда удавалось подобрать готовый скетч.....
Есть идея перенаправить эту инфу потом на ЖКИ 1602.
Задача не распространенная трудно найти готовый скетч. Так что извините наверное помучаю вас еще глупыми вопросами. И вообще есть желание повникать в тему.
Так вам шашечки или ехать? т.к. задачи принципиально разного уровня сложности.
поищите примеры на 1602 особенно с I2C, прежде чем с шашкой наголо
Справочник в шапке форума -Пограммирование
Поменять
на
for (byte nMassiv=0; nMassiv<5; nMassiv++){ // код }Плюсую вышеотписавшимся, Вы не знаете синтаксис. Читать учебник - неважно, пишете ли на Wiring или C++.
Так вам шашечки или ехать? т.к. задачи принципиально разного уровня сложности.
поищите примеры на 1602 особенно с I2C, прежде чем с шашкой наголо
Справочник в шапке форума -Пограммирование
Я же написал нужно сделать генератор имитирующий сигнал на старый контроллер ЖКИ . Там два сигнала DATA и CLOCK и скорее всего это ближе к SPI . Мне нужно составить таблицу соответствия какой бит за какой символ на индикаторе отвечает. Индикатор был семисегментный со спец символами. А уж как подключить 1602 примеров действительно достаточно и изобретать велосипед не стоит.
Плюсую вышеотписавшимся, Вы не знаете синтаксис. Читать учебник - неважно, пишете ли на Wiring или C++.
Вы помогите мне с моим плохим знанием синтаксиса написать нужный мне генератор а потом я обязательно пойду читать учебник. Хочетсяприбор поскорее восстановить.
В общем я задал свой вопрос в разделе для начинающих. Что я думал предполагает плохое знание синтаксиса.
Здесь не форум по Си, здесь форум по Ардуино. Следовательно, предполагается, что Си Вы либо знаете, либо изучаете при помощи другого - специализированного форума.
И, в конце концов, решите, что именно Вам нужно:
- если побустрее починить устройство - это в раздел "Ищу исполнителя",
- если чему-то научиться, то начинать с задач попроще - с которыми в состоянии справиться при Вашем нынешнем уровне. (ну и само собой - учить язык, только где-то за пределами этого форума)
Мне нужно чтоб ардуино выдавал такой сигнал https://yadi.sk/i/PfvFoCdPLIn86A И я хотел узнать как мне этого добиться на уровне алгоритма. А зная алгоритм я бы сам перевел в СИ возможно и без этого форума.
Всех выслушал понял закрывайте тему. Кроме рассуждений о моем слабом знании СИ я не услышал ничего полезного.
я бы сказал, НАСТОЙЧИВО не желали слышать, что-то полезное.
я бы сказал, НАСТОЙЧИВО не желали слышать, что-то полезное.
Ну как же, он критерий полезности обозначил: "Вы помогите мне с моим плохим знанием синтаксиса написать нужный мне генератор а потом я обязательно пойду читать учебник."
Переведу: "Пошли вы нах, с вашими синтаксисами, мне код на халяву нужен".
я бы сказал, НАСТОЙЧИВО не желали слышать, что-то полезное.
Ну как же, он критерий полезности обозначил: "Вы помогите мне с моим плохим знанием синтаксиса написать нужный мне генератор а потом я обязательно пойду читать учебник."
Переведу: "Пошли вы нах, с вашими синтаксисами, мне код на халяву нужен".
Вообще я писал мне нужен алгоритм а не код готовыйюю Одну и туже задачу можно решить несколькими вариантами. Но только один из них будет изящен прост тоесть гениален. Я думал вы мне посоветуете используй внутренние таймеры внутренние прерывания я начал на delay скетч делать Меанндр идет но это не лучший вариант. А вы про готовые коды а сами наверное даже не удосужились картинку посмотреть какой сигнал нужен. Печаль.
Я вот только что закончил ковырять LCD дисплей. Начинал с самого элементарного посылал на нужный пин "0" или "1" и между ними задержки. Когда все заработало, начал окультуривать. Начинал - типа этого:
Сначала подобрал оптимальное время, чтобы данные шли без искажений, ну а потом уже дело техники.
Я хочу как вы отправлять 0 и 1 но дисплей будет другой 1602 у него 4 вывода и другая система кодировки. а у старого дисплея 33 вывода и своя кодировка.
Старым дисплеем управляла микросхема MM145453V и она раскидывала нужные 0 и 1 по нужным сегментам. А на нее информация приходит в виде 36 бит по двум ногам DATA и CLOCK. И теперь чтоб нужный 0 или 1 отправить в нужное место мне нужно узнать какой из 36 бит какой символ зажигает. И перекодировать эту последовательность под кодировку ЖКИ 1602. А для этого мне нужен имитатор или генератор. Который отправлял бы мне 36 бит. Допустим сначала 36 нуликов. Потом 35 нуликов и одна 1 так я разберусь какой бит за какой символ отвечает.
Я хочу как вы отправлять 0 и 1 но дисплей будет другой 1602 у него 4 вывода и другая система кодировки. а у старого дисплея 33 вывода и своя кодировка.
Чего Вы хотите от окружающих?
Чтобы они вместо Вас выучили Си? - так это невозможно.
Или чтобы вместо Вас по очевидному алгоритму сделали его программную реализацию? - так это в раздел "Ищу исполнителя".
Чтобы они посоветовали Вам, с чего начать? - так это уже сделано: "Учите язык программирования".
Чего еще?
Держи, не жалко:
#define clockPin 2 #define dataPin 3 #define timeSend 2 //время на одну посылку секунд uint64_t data = 0x01; uint32_t times; uint8_t razrjad = 0; void setup() { pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); Serial.begin(9600); times = millis(); } void loop() { if((millis()-times)>(timeSend*1000)) { digitalWrite(dataPin, HIGH); //start strobe(); for(uint8_t i=0; i<33; i++) //передача 33 бит данных { if(bitRead(data, i)) { digitalWrite(dataPin, HIGH); } else { digitalWrite(dataPin, LOW); } strobe(); } digitalWrite(dataPin, LOW); //конец посылки strobe(); delayMicroseconds(2); strobe(); Serial.write(razrjad); //отправляем в монитор times = millis(); data <<=1; //перемещаем 1 в следующий разряд razrjad++; if((data>=0x200000000)||(razrjad>=33)) //если прошли все разряды то заново { data=0x01; } } } void strobe () { digitalWrite(clockPin, HIGH); //delayMicroseconds(1); //возможно понадобится digitalWrite(clockPin, LOW); //delayMicroseconds(1); //возможно понадобится }<del>
не, у него это было честно расписано
Всего там 36 бит.
1-й бит стартовый всегда 1.
Дальше идут 33 бита информации и затем 2 бита как бы для синхронизации между сигналами clock и data они написано желательно должны быть 0-ми.
Держи не жалко
Мне подсказали еще вот такой вариант
uint8_t bits[] = { 1, // start bit // 33 bits data to lcd 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // end bit 0, // end bit }; void setup() { pinMode(13, OUTPUT); pinMode(11, OUTPUT); } void loop() { int i; for (i = 0; i < sizeof(bits); ++i) { digitalWrite(13, bits[i]); digitalWrite(11, 1); // delayMicroseconds(1); digitalWrite(11, 0); // delayMicroseconds(1); } }Проверил работает. Ваш тоже обязательно прохверю. Выложил может кому понадобится для подобных целей.
А вопросы значит по коду людям плохо знающим СИ в этом форуме нельзя задавать ?
http://lurkmore.to/%D0%A2%D1%80%D0%BE%D0%BB%D0%BB%D1%8C
А вопросы значит по коду людям плохо знающим СИ в этом форуме нельзя задавать ?
Можно, но с непредсказуемым результатом. Попадете под хорошее настроение, может и ответят.
А вопросы значит по коду людям плохо знающим СИ в этом форуме нельзя задавать ?
Можно, но с непредсказуемым результатом. Попадете под хорошее настроение, может и ответят.
Думаете там есть вопросы? Массив из 33 палок в здравом уме придумать низзя (посоветовать тоже) )))
Думаете там есть вопросы? Массив из 33 палок в здравом уме придумать низзя (посоветовать тоже) )))
Все гениальное просто. Предложите свой изящный и простой вариант а то вы все время только задеть меня пытаетесь.
Все же попытаюсь задать вопрос что означает запись
04uint64_t data = 0x01;Переменная data, содержащая целое число, состоящая из 64 бит или 8 байт, беззнаковая, при инициализации ей присваивается значение 1. В книжках по си это рассматривается на первых страницах.
Все же попытаюсь задать вопрос что означает запись
04uint64_t data = 0x01;раз гугл запрещён - держите - https://ru.wikipedia.org/wiki/Stdint.h
Тоесть в коде anatoli_nik. сразу зарезервировали 64 бит и заполнили 0 кроме первого (000000...001)?
Еще не понял стоповых бита должно быть два а в коде вроде один?
Еще не понял стоповых бита должно быть два а в коде вроде один?
два, и один стартовый, стоповые нули (строка 32), как и просили
Скетч залил в ардуинку подцепил индикатор что-то не работает не перебирает сегменты. Видимо или задержки или скорость нужно менять.
Поясню, немного по коду выше.
Как и было запрошено, и уже пояснили другие, стартовый бит есть, есть два стоповых "нуля".
Каждую посылку передается единица только одному разряду (на сколько я понял хотелку), номер разряда отсылается в UART (надо же как-то следить), затем разряд меняется (в данном случае тупой сдвиг), затем задержка, для раздупления юзера, в данном случае две секунды (меняется в макросе timeSend).
Почему переменная (data) 64 битная? - потому что, с*ка разрабы придумали 33 битную посылку, котоая не влезает в uint32_t.
Почему я применил millis() для задержки? - Потому что нелюблю я эти delay(ms).
П.С. пока писал появилось сообщения от ТС. На каком дисплее не появляются сегменты?
Скетч из 34 поста работает?
У меня есть рабочий индикатор снят с донора . Так вот при включении загораются сразу все сегменты. Хотя просто при подаче питания на индикатор и без сигналов на DATA и CLOCK они тоже все загораются. Перебора сегментов не происходит.
Скетч из 34 поста работает. Записал все 0 и потом с краю начинаю добавлять 1 по одной и вижу какой сегмент загорается.
Нашел косяк, со строки 40 нужно заменить:
if((data>=0x200000000)||(razrjad>=33)) //если прошли все разряды то заново { data=0x01; }на:
if((data>=0x200000000)||(razrjad>=33)) //если прошли все разряды то заново { data=0x01; razrjad=0; }