Имитатор сигналов на контроллр ЖКИ.

kosta139
Offline
Зарегистрирован: 25.01.2019

Ардуино пользовался несколько раз и всегда удавалось подобрать готовый скетч, но вэтот раз не получается.

 Вышел из строя ЖКИ на измерителе уровня. ЖКИ управляется микроосхемой 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 пока практически ноль. 

Прошу помощи составить алгоритм по котораму бы мог работать данный имиттатор. А затем пользуясь алгоритмом я попытался бы освайвать нужные мне темы и пробовать мисать программу. Буду очень признателен тем кто откликнется.

kosta139
Offline
Зарегистрирован: 25.01.2019

Немного поразмыслил мне нужно просто создать 36 переменных типа булеан. Затем присвоить каждой из них значение и вывести на как-нибудь цифровой выход. В цикле и в этом же цикле на другой цифровой выход выводить импульс clook. Это у меня будут биты данных. Но как мне привязать к ним синхроимпульсы на пине clock  с точным значением как в даташите. И как задать частоту прохождения пачек моих импульсов? Использовать delay?

kosta139
Offline
Зарегистрирован: 25.01.2019

Хотел создать массив из переменнх булеан 

 // присваиваю переменным значения.
  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("");
}

Компилятор ругается Как правильно создать массив булеан?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

boolean это тоже просто байты в которых может храниться только два значения 0 и 1

kosta139
Offline
Зарегистрирован: 25.01.2019

ua6em пишет:

boolean это тоже просто байты в которых может храниться только два значения 0 и 1

Так кактогда мнеправильно массивто оформить?

kosta139
Offline
Зарегистрирован: 25.01.2019

ua6em пишет:

boolean это тоже просто байты в которых может храниться только два значения 0 и 1

Так кактогда мнеправильно массивто оформить?

В инете про булевые массивы примеры не нашел.

Писать вместо тру и фэлсе сразу 1 и 0 ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

думаю да

kosta139
Offline
Зарегистрирован: 25.01.2019
Поставил вместо тру и фелсе 1 и 0 .Вот что пишет компилятор
/home/kosta/Arduino/sketch_jan25_generator/sketch_jan25_generator.ino: In function 'void loop()':
sketch_jan25_generator:16:14: error: expected ';' before 'i'
 for (nMassiv i=0; i<5; i++);
              ^
sketch_jan25_generator:16:19: error: 'i' was not declared in this scope
 for (nMassiv i=0; i<5; i++);
                   ^
exit status 1
expected ';' before 'i'
Ругается он когда я пытаюсь выводить значения из созданного массива.
 
 
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
void loop() {
  // вывожу на светодиод значения.
  for (uint8_t i=0; i<5; i++) {
    Serial.println(nMassiv[i]);
  }
}

продолжите дальше в таком духе, вас пошлют читать азы языка С.

kosta139
Offline
Зарегистрирован: 25.01.2019

ОТвет не понял можно подробнее. это комментарий не убрал . хотел в сериал вывести.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я предупреждал, изучайте основы, начните с Blink.

kosta139
Offline
Зарегистрирован: 25.01.2019

Согласен с вами про BLINK. Но у меня прибор стоит сломаннный ультразвуковой измеритель уровня. Мне нужно его починить. ВЫше все писал. Да и существует мнение что если начинаешь делать сразу что-то полезное и знания лучше закрепляются. А информацию про организацию правильную булевых массивов действительно не нашел в интернете. Если имеете скиньте ссылочку. 

Всавил кусок вашего скетча и весь скетч собрался без ошибок. НО в мониторе порта никакие циферки не пробежали. Извините я действительно в СИ еще сильно дубоват. Так же буду признателен за ссылку на подробный справочник по командам СИ.

Прошу прощения не прописал скорость обмена с портом теперь циферки бегут.

kosta139
Offline
Зарегистрирован: 25.01.2019

 НА пине 13 который будет имитировать DATA импулсы получить удалось правда под нагрузкой не смотрел. Теперь нужно организовать импульсы CLOCK и если получится можно будет составлять карту индикатора.

ВН
Offline
Зарегистрирован: 25.02.2016

kosta139 пишет:

Ардуино пользовался несколько раз и всегда удавалось подобрать готовый скетч..... 

Есть идея перенаправить эту инфу потом на ЖКИ 1602.

Похоже в вашем случае это наиболе здравая идея.

kosta139
Offline
Зарегистрирован: 25.01.2019

Задача не распространенная трудно найти готовый скетч. Так что извините наверное помучаю вас еще глупыми вопросами. И вообще есть желание повникать в тему.

ВН
Offline
Зарегистрирован: 25.02.2016

Так вам шашечки или ехать?  т.к. задачи принципиально разного уровня сложности.

поищите примеры на 1602 особенно с I2C, прежде чем с шашкой наголо

Справочник в шапке форума -Пограммирование

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Поменять

for (nMassiv i=0; i<5; i++);

на

for (byte nMassiv=0; nMassiv<5; nMassiv++){
  // код
}

Плюсую вышеотписавшимся, Вы не знаете синтаксис. Читать учебник - неважно, пишете ли на Wiring или C++.

kosta139
Offline
Зарегистрирован: 25.01.2019

ВН пишет:

Так вам шашечки или ехать?  т.к. задачи принципиально разного уровня сложности.

поищите примеры на 1602 особенно с I2C, прежде чем с шашкой наголо

Справочник в шапке форума -Пограммирование

 

Я же написал нужно сделать генератор имитирующий сигнал на старый контроллер ЖКИ . Там два сигнала DATA и CLOCK и скорее всего это ближе к SPI . Мне нужно составить таблицу соответствия какой бит за какой символ на индикаторе отвечает. Индикатор был семисегментный со спец символами. А уж как подключить 1602 примеров действительно достаточно и изобретать велосипед не стоит.

kosta139
Offline
Зарегистрирован: 25.01.2019

Voodoo Doll пишет:

 

Плюсую вышеотписавшимся, Вы не знаете синтаксис. Читать учебник - неважно, пишете ли на Wiring или C++.

Вы помогите мне с моим плохим знанием синтаксиса написать нужный мне генератор а потом я обязательно пойду читать учебник. Хочетсяприбор поскорее восстановить.

kosta139
Offline
Зарегистрирован: 25.01.2019

В общем я задал свой вопрос в разделе для начинающих. Что я думал предполагает плохое знание синтаксиса. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Здесь не форум по Си, здесь форум по Ардуино. Следовательно, предполагается, что Си Вы либо знаете, либо изучаете при помощи другого - специализированного форума.

И, в конце концов, решите, что именно Вам нужно:

- если побустрее починить устройство - это в раздел "Ищу исполнителя",

- если чему-то научиться, то начинать с задач попроще - с которыми в состоянии справиться при Вашем нынешнем уровне. (ну и само собой - учить язык, только где-то за пределами этого форума)

kosta139
Offline
Зарегистрирован: 25.01.2019

Мне нужно чтоб ардуино выдавал такой сигнал https://yadi.sk/i/PfvFoCdPLIn86A И я хотел узнать как мне этого добиться на уровне алгоритма. А зная алгоритм я бы сам перевел в СИ возможно и без этого форума.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

wdrakula пишет:

Присоединяюсь.

kosta139
Offline
Зарегистрирован: 25.01.2019

Всех выслушал понял закрывайте тему. Кроме рассуждений о моем слабом знании СИ я не услышал ничего полезного.

ВН
Offline
Зарегистрирован: 25.02.2016

kosta139 пишет:
Кроме рассуждений о моем слабом знании СИ я не услышал ничего полезного.

я бы сказал, НАСТОЙЧИВО не желали слышать, что-то полезное.

bwn
Offline
Зарегистрирован: 25.08.2014

ВН пишет:

kosta139 пишет:
Кроме рассуждений о моем слабом знании СИ я не услышал ничего полезного.

я бы сказал, НАСТОЙЧИВО не желали слышать, что-то полезное.

Ну как же, он критерий полезности обозначил: "Вы помогите мне с моим плохим знанием синтаксиса написать нужный мне генератор а потом я обязательно пойду читать учебник."

Переведу: "Пошли вы нах, с вашими синтаксисами, мне код на халяву нужен".

kosta139
Offline
Зарегистрирован: 25.01.2019

bwn пишет:

ВН пишет:

kosta139 пишет:
Кроме рассуждений о моем слабом знании СИ я не услышал ничего полезного.

я бы сказал, НАСТОЙЧИВО не желали слышать, что-то полезное.

Ну как же, он критерий полезности обозначил: "Вы помогите мне с моим плохим знанием синтаксиса написать нужный мне генератор а потом я обязательно пойду читать учебник."

Переведу: "Пошли вы нах, с вашими синтаксисами, мне код на халяву нужен".

Вообще я писал мне нужен алгоритм а не код готовыйюю Одну и туже задачу можно решить несколькими вариантами. Но только один из них будет изящен прост тоесть гениален. Я думал вы мне посоветуете используй внутренние таймеры внутренние прерывания я начал на delay скетч делать Меанндр идет но это не лучший вариант. А вы про готовые коды а сами наверное даже не удосужились картинку посмотреть какой сигнал нужен. Печаль.

svm
Offline
Зарегистрирован: 06.11.2016

Я вот только что закончил ковырять LCD дисплей. Начинал с самого элементарного посылал на нужный пин "0" или "1" и между ними задержки. Когда все заработало, начал окультуривать. Начинал - типа этого:

digitalWrite(RW_pin, LOW);
delayMicroseconds(t);
digitalWrite(DATA_pin, HIGH);
delayMicroseconds(t);// 1
digitalWrite(RW_pin, HIGH);
delayMicroseconds(t*2);

Сначала подобрал оптимальное время, чтобы данные шли без искажений, ну а потом уже дело техники.

kosta139
Offline
Зарегистрирован: 25.01.2019

Я хочу как вы отправлять 0 и 1 но дисплей будет другой 1602 у него 4 вывода и другая система кодировки. а у старого дисплея 33 вывода и своя кодировка.

Старым дисплеем управляла микросхема MM145453V и она раскидывала нужные 0 и 1 по нужным сегментам. А на нее информация приходит в виде 36 бит по двум ногам DATA и CLOCK. И теперь чтоб нужный 0 или 1 отправить в нужное место мне нужно узнать какой из 36 бит какой символ зажигает. И перекодировать эту последовательность под кодировку ЖКИ 1602. А для этого мне нужен имитатор или генератор. Который отправлял бы мне 36 бит. Допустим сначала 36 нуликов. Потом 35 нуликов и одна 1 так я разберусь какой бит за какой символ отвечает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kosta139 пишет:

Я хочу как вы отправлять 0 и 1 но дисплей будет другой 1602 у него 4 вывода и другая система кодировки. а у старого дисплея 33 вывода и своя кодировка.

Указанное обстоятельство никак не влияет на алгоритм: какова бы ни была "система кодировки", все равно нужно, выдерживая определенные временнЫе интервалы, устанавливать ноги контроллера в нужные ("0" или "1") состояния.

Чего Вы хотите от окружающих?

Чтобы они вместо Вас выучили Си? - так это невозможно.

Или чтобы вместо Вас по очевидному алгоритму сделали его программную реализацию? - так это в раздел "Ищу исполнителя".

Чтобы они посоветовали Вам, с чего начать? - так это уже сделано: "Учите язык программирования".

Чего еще?

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Держи, не жалко:


#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);       //возможно понадобится
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

<del>

ВН
Offline
Зарегистрирован: 25.02.2016

не, у него это было честно расписано

kosta139 пишет:

Всего там 36 бит.

1-й бит стартовый всегда 1.

Дальше идут 33 бита информации и затем 2 бита как бы для синхронизации между сигналами clock и data они написано желательно должны быть 0-ми.

kosta139
Offline
Зарегистрирован: 25.01.2019

anatoli_nik пишет:

Держи не жалко

      

Мне подсказали еще вот такой вариант 

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);
   }
}

Проверил работает. Ваш тоже обязательно прохверю. Выложил может кому понадобится для подобных целей.

kosta139
Offline
Зарегистрирован: 25.01.2019

А вопросы значит по коду людям плохо знающим СИ в этом форуме нельзя задавать ?

anatoli_nik
Offline
Зарегистрирован: 17.01.2019
bwn
Offline
Зарегистрирован: 25.08.2014

kosta139 пишет:

А вопросы значит по коду людям плохо знающим СИ в этом форуме нельзя задавать ?

Можно, но с непредсказуемым результатом. Попадете под хорошее настроение, может и ответят. 

RG22EM
Offline
Зарегистрирован: 27.08.2016

bwn пишет:

kosta139 пишет:

А вопросы значит по коду людям плохо знающим СИ в этом форуме нельзя задавать ?

Можно, но с непредсказуемым результатом. Попадете под хорошее настроение, может и ответят. 


Думаете там есть вопросы? Массив из 33 палок в здравом уме придумать низзя (посоветовать тоже) )))

kosta139
Offline
Зарегистрирован: 25.01.2019

RG22EM пишет:

Думаете там есть вопросы? Массив из 33 палок в здравом уме придумать низзя (посоветовать тоже) )))

Все гениальное просто. Предложите свой изящный и простой вариант а то вы все время только задеть меня пытаетесь.

kosta139
Offline
Зарегистрирован: 25.01.2019

Все же попытаюсь задать вопрос что означает запись    

04 uint64_t data = 0x01;

 

nik182
Offline
Зарегистрирован: 04.05.2015

Переменная data, содержащая целое число, состоящая из 64 бит или 8 байт, беззнаковая, при инициализации ей присваивается значение 1. В книжках по си это рассматривается на первых страницах. 

RG22EM
Offline
Зарегистрирован: 27.08.2016

kosta139 пишет:

Все же попытаюсь задать вопрос что означает запись    

04 uint64_t data = 0x01;

раз гугл запрещён - держите - https://ru.wikipedia.org/wiki/Stdint.h

kosta139
Offline
Зарегистрирован: 25.01.2019

Тоесть в коде anatoli_nik.  сразу зарезервировали 64 бит и заполнили 0 кроме первого (000000...001)?

 

kosta139
Offline
Зарегистрирован: 25.01.2019

Еще не понял стоповых бита должно быть два а в коде вроде один?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

kosta139 пишет:

Еще не понял стоповых бита должно быть два а в коде вроде один?

два, и один стартовый, стоповые нули (строка 32), как и просили

kosta139
Offline
Зарегистрирован: 25.01.2019

Скетч залил в ардуинку подцепил индикатор что-то не работает не перебирает сегменты. Видимо или задержки или скорость нужно менять.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Поясню, немного по коду выше.

Как и было запрошено, и уже пояснили другие, стартовый бит есть, есть два стоповых "нуля".

Каждую посылку передается единица только одному разряду (на сколько я понял хотелку), номер разряда отсылается в UART (надо же как-то следить), затем разряд меняется (в данном случае тупой сдвиг), затем задержка, для раздупления юзера, в данном случае две секунды (меняется в макросе timeSend).

Почему переменная (data) 64 битная? - потому что, с*ка разрабы придумали 33 битную посылку, котоая не влезает в uint32_t. 

Почему я применил millis() для задержки? - Потому что нелюблю я эти delay(ms).

П.С. пока писал появилось сообщения от ТС. На каком дисплее не появляются сегменты?

Скетч из 34 поста работает?

kosta139
Offline
Зарегистрирован: 25.01.2019

У меня есть рабочий индикатор снят с донора . Так вот при включении загораются сразу все сегменты. Хотя просто при подаче питания на индикатор и без сигналов на DATA и CLOCK они тоже все загораются. Перебора сегментов не происходит.

kosta139
Offline
Зарегистрирован: 25.01.2019

Скетч из 34 поста работает. Записал все 0 и потом с краю начинаю добавлять 1 по одной и вижу какой сегмент загорается.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Нашел косяк, со строки 40 нужно заменить:

 if((data>=0x200000000)||(razrjad>=33))   //если прошли все разряды то заново
        {
          data=0x01;
        }

на:

 if((data>=0x200000000)||(razrjad>=33))   //если прошли все разряды то заново
        {
          data=0x01;
          razrjad=0;
        }