Arduino и RZ код

andrey_kh
Offline
Зарегистрирован: 15.01.2018

Добрый день, уважаемые форумчане.

Требуется помощь знающих людей в непонятном для меня вопросе. Необходимо передать данные с адруино на устройство в формате RZ кода (Zero return). В данном случае код униполярный, логика CMOS(+5В/0,1). Может есть у кого, или кто может написать, пример отправки данных. Например последовательность 10100111.

Заранее благодарен

5N62V
Offline
Зарегистрирован: 25.02.2016

andrey_kh пишет:

Добрый день, уважаемые форумчане.

Требуется помощь знающих людей в непонятном для меня вопросе. Необходимо передать данные с адруино на устройство в формате RZ кода (Zero return). В данном случае код униполярный, логика CMOS(+5В/0,1). Может есть у кого, или кто может написать, пример отправки данных. Например последовательность 10100111.

Заранее благодарен

Так если он униполярный, то просто дрыгаете каким-нить пином и получаете желаемую последовательность. Ни разу не сталкивался, но "я так думаю!" (с)

sadman41
Offline
Зарегистрирован: 19.10.2016

Не, там, вроде как три уровня нужно. Простым ногодрыгом не реализовать. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andrey_kh, а как в Вашем RTZ устройстве ноль кодируется? В тех, что я видел (а видел я всего два) нулю соответствовало напряжение, равное половине напряжения единицы. Т.е. было три уровня: 0В, U0 и U1=2xU0.

У Вас так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Не, там, вроде как три уровня нужно. Простым ногодрыгом не реализовать. 

Ну, почему? Пины-то у контроллера tri-state!

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:

Не, там, вроде как три уровня нужно. Простым ногодрыгом не реализовать. 

Ну, почему, пины-то у контроллера tri-state

Глянул по диагонали. Т.е. вывод подключить через эквивалентный резистивный делитель и чередовать OUTPUT_HIGH > INPUT > OUTPUT_LOW для нуля и OUTPUT_LOW > INPUT > OUTPUT_HIGH для единицы?

P.S. вижу, что посложнее кодирование, но принцип такой?

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

ЕвгенийП пишет:
Ну, почему? Пины-то у контроллера tri-state!
ну да OUTPUT+HIGH,INPUT,OUTPUT+LOW

ПС:https://ru.wikipedia.org/wiki/RZ

andrey_kh
Offline
Зарегистрирован: 15.01.2018

В общем простым дрыганием получается передать только высокий уровень, низкий уровень не видит. Ещё и по микросхеме, которая принимает сигнал полный капец, инфы почти нет (SM16188). Судя по китайскому даташиту она видит только 2 положения - высокое и низкое. 

andrey_kh
Offline
Зарегистрирован: 15.01.2018

qwone пишет:

ЕвгенийП пишет:
Ну, почему? Пины-то у контроллера tri-state!
ну да OUTPUT+HIGH,INPUT,OUTPUT+LOW

ПС:https://ru.wikipedia.org/wiki/RZ

так пробовал, видит только высокое положение

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

А чем вы смотрите. Смотреть надо аналоговым входом 

andrey_kh
Offline
Зарегистрирован: 15.01.2018

qwone пишет:

А чем вы смотрите. Смотреть надо аналоговым входом 

вы привели пример биполярного варианта RZ кода

sadman41
Offline
Зарегистрирован: 19.10.2016

andrey_kh пишет:

вы привели пример биполярного варианта RZ кода

А как вы выход подключаете к сигнальной линии (просто интересно)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Глянул по диагонали. Т.е. вывод подключить через эквивалентный резистивный делитель и чередовать OUTPUT_HIGH > INPUT > OUTPUT_LOW для нуля и OUTPUT_LOW > INPUT > OUTPUT_HIGH для единицы?

Думаю, нет, Z-state - для 0, а LOW - разделитель. Делитель, да эквивалентный и, если у устройства вход не высокоимпедансный, то поставить ещё поаторитель напряжения после средней точки делителя.

По крайней мере в моих устройствах было так.

Но ТС пока не ответил на мой вопрос, как у него. 

ТС - Вы собираетесь отвечать? Как у Вас кодируется 0?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, перепутал.

Дайте ссылку на даташит. Если у неё два уровня, то это не RTZ

Может у Вас наоборот NRZ (Non Return to Zero)?

Тогда действительно два уровня, но надо время битового интервала (BT).

andrey_kh
Offline
Зарегистрирован: 15.01.2018

Нет, не перепутал, сейчас скину данные

andrey_kh
Offline
Зарегистрирован: 15.01.2018

ЕвгенийП пишет:

Простите, перепутал.

Дайте ссылку на даташит. Если у неё два уровня, то это не RTZ

Может у Вас наоборот NRZ (Non Return to Zero)?

Тогда действительно два уровня, но надо время битового интервала (BT).

Вот все имеющиеся данные. 

https://yadi.sk/i/bdcz5o3R3RUmMh

http://chinaasic.com/product.jsp#item=leddisplay#style=25

Микросхема SM16188B

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я оставил запрос на сайте производителя (http://www.chinaasic.com/support.jsp#item=askforTech). Посмотрим, ответят ли и что именно.

andrey_kh
Offline
Зарегистрирован: 15.01.2018

ЕвгенийП пишет:

Я оставил запрос на сайте производителя (http://www.chinaasic.com/support.jsp#item=askforTech). Посмотрим, ответят ли и что именно.

спасибо, напишите, если производитель даст информацию 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

 

Ясно? 1 передается как 10, ноль - как 00. Это часто используется.

Не путать с Манчестером, где  0 и 1 - 01 и 10 (или наоборот)!!!!!

andrey_kh
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

 

Ясно? 1 передается как 10, ноль - как 00. Это часто используется.

Не путать с Манчестером, где  0 и 1 - 01 и 10 (или наоборот)!!!!!

Большое спасибо. Попробовал управлять через ПЛИС алтера, всё отлично работает на 1 МГц. Теперь вопрос, не могли бы Вы подсказать, как это реализовать на wiring? Побитную отправку на частоте 1 МГц в формате 10 и 00

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Влад попал :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Влад попал :)

Гы! Не-а! Я просто не стану кодить. ;)

Я совет дам: SPI на 2МГц, предваительно перекодировать 1 в 10 и 0 в 00. Любой доугой способ на AVR съест все ресурсы.

Или писать блокирующий код - тут вроде как все совсем очевидно.

andrey_kh
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

ЕвгенийП пишет:

Влад попал :)

Гы! Не-а! Я просто не стану кодить. ;)

Я совет дам: SPI на 2МГц, предваительно перекодировать 1 в 10 и 0 в 00. Любой доугой способ на AVR съест все ресурсы.

Или писать блокирующий код - тут вроде как все совсем очевидно.

и на том спасибо

andrey_kh
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

ЕвгенийП пишет:

Влад попал :)

Гы! Не-а! Я просто не стану кодить. ;)

Я совет дам: SPI на 2МГц, предваительно перекодировать 1 в 10 и 0 в 00. Любой доугой способ на AVR съест все ресурсы.

Или писать блокирующий код - тут вроде как все совсем очевидно.

если можно, то дайте ссылку на статью о блокирующем коде

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Sorry, man, but my russian stickers on my keybord are completely swept off. So I'll use english, OK?

I suppose the data to be sent are in the byte d2s and you need to send all 8 bits of them, OK?

Let us use PORTD and pin PD4.

inline __attribute__((gnu_inline)) void Delay05(void){
byte dl = 3;// tune 1 MHz here,  it will not be very accurate :) ;)
do _NOP(); while(dl--);
}

byte d2s = 0b00110101; //data to send. MSB - firts
byte i;
DDRD |= (1<< PD4);

for (i = 0x80; i>0; i>>=1)
   {
    if( i&d2s )    PORTD  |=  (1<< PD4);
    else            PORTD &=~(1<< PD4);
    Delay05();
    PORTD &=~(1<< PD4);
    Delay05();
   }

Sorry again!!! russkie bukvy sterlis na kuhne ;) ;)

andrey_kh
Offline
Зарегистрирован: 15.01.2018

Большое спасибо, сегодня попробую

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В мастерской у меня нормальная клавиатура, а не этот китайский моющийся кошмар, поэтому снова "здравствуй родной язык"!

Я примерно подобрал зарержки на логанализаторе. пробуй.

Вот вариант :


#define _NOP() asm volatile("nop")

inline __attribute__((gnu_inline)) void Delay05(byte dl){
do _NOP(); while(dl--);
}

void setup() {

byte d2s = 0b11010001; //data to send. MSB - firts
byte i;

DDRD |= (1<< PD4);

while(1)
 {
 for (i = 0x80; i>0; i>>=1)
   {
    if( i&d2s )    
       {
        PORTD  |=  (1<< PD4);
       Delay05(4);
       }
    else 
       {
        PORTD &=~(1<< PD4);
       Delay05(4);
       }
    PORTD &=~(1<< PD4);
   }
 Delay05(20);
 }
}

void loop() {
  // put your main code here, to run repeatedly:

}

Вот картинка с логаналайзера:

при подборе задержек в обычной, т.е. блокирующей, передаче длительность 0 и 1 всегда будут немного разные. Выровнять можно только на ассемблере.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

вот так лучше.. и ассемблера не нужно.

#define _NOP() asm volatile("nop")

inline __attribute__((gnu_inline)) void Delay05(byte dl){
do _NOP(); while(dl--);
}

void setup() {

byte d2s = 0b11010001; //data to send. MSB - firts
byte i;

DDRD |= (1<< PD4);

while(1)
 {
 for (i = 0x80; i>0; i>>=1)
   {
    if( i&d2s )    
       {
        PORTD  |=  (1<< PD4);
       _NOP();
       }
    else 
       {
        PORTD &=~(1<< PD4);
       
       }
    _NOP();_NOP();_NOP();
    PORTD &=~(1<< PD4);
   }
 Delay05(20);
 }
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

wdrakula пишет:

ЕвгенийП пишет:

Влад попал :)

Гы! Не-а! Я просто не стану кодить. ;)

)

wdrakula пишет:
Я примерно подобрал зарержки на логанализаторе. пробуй.

wdrakula пишет:
вот так лучше.. и ассемблера не нужно.
 
Я знал, что где то в глубине вы добрейший человек. 
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

MaksVV пишет:

 
Я знал, что где то в глубине вы добрейший человек. 

Это утро было... время трезвости и философского взгдяда на себя в мире и мир в себе...

А так да... в глубине... руки в кровь стереть можно, пока докопаешься... ;)

andrey_kh
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

вот так лучше.. и ассемблера не нужно.

#define _NOP() asm volatile("nop")

inline __attribute__((gnu_inline)) void Delay05(byte dl){
do _NOP(); while(dl--);
}

void setup() {

byte d2s = 0b11010001; //data to send. MSB - firts
byte i;

DDRD |= (1<< PD4);

while(1)
 {
 for (i = 0x80; i>0; i>>=1)
   {
    if( i&d2s )    
       {
        PORTD  |=  (1<< PD4);
       _NOP();
       }
    else 
       {
        PORTD &=~(1<< PD4);
       
       }
    _NOP();_NOP();_NOP();
    PORTD &=~(1<< PD4);
   }
 Delay05(20);
 }
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

Через блокировку я не особо понял, как реализовать это чудо, так что решил попробовать через SPI. Делаю всё как Вы и сказали, поставил делитель такта 8 (рабочая частота 16), отправляю последовательность бит 10101010, что по идеи должно быть понято микросхемой как 1-1-1-1, но в итоге результата нет. Но, если подключить ко входу синхронизации (clock), то микросхема видит последовательность единиц. Кстати, тот же самый эффект возникает при передачи данных через shiftOut. 

P.S. Не кидайтесь тапками за непонимание, так как чудо wiring установил и начал пробовать совсем недавно

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. С SPI у тебя, похоже, не получится. У  SPI в нормальном состоянии - 1. А тебе нужно 0, то есть нужно инвертировать сигнал. Если  знаешь, через какую букву слова "транзист?р" и "паяльн?к" пишутся - то попробуй. И смотри на лог.аналайзер или осцилограф, что там у тебя есть?

2. Стесняюсь спросить: а что такое wiring? То есть я догадываюсь, что ты так хочешь назвать то, на чем написана программа для Ардуино.

Боюсь тебя удивить, но для Ардуино пишут на обычном С++. А "wiring" - это наименование библиотеки с самыми простыми функциями для работы с внешними (и внутренними) устройствами контроллера. Использовать ее, по крайней мере частично, весьма удобно.

------------------

Какой-то долбо@б, на этом сайте, когда-то давно написал, что wiring - это язык. Так вот это чушь собачья. Поскольку авторы сайта НИКАК не связаны с "гуру" форума, то исправить этот бред невозможно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Какой-то долбо@б, на этом сайте, когда-то давно написал, что wiring - это язык. 

Скорее не долбо@б, а википедик. А вообще, этот бред имеет очень широкое распространение (википедия, научёбе, амперка)

andrey_kh
Offline
Зарегистрирован: 15.01.2018

Методом тыка удалось победить. Ответ оказался прост - китайское чудо единицу кушает как 1110, а ноль как 1000. Всем большое спасибо. Отдельное спасибо wdrakula

P.S.Победа одержена с использованием SPI

P.P.S. Под wiring понимаю всякую ересь, которая отличает данную оболочку от класического C++

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

круто! нихрена бы не догадался!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да! Чуть не забыл, публикуй ТУТ код, который работает с текстом, вроде "код для миркросхемы ....такой-то... применяемой в китайской матрице 4 на 8" или где-там-она используется?

Это чтобы Яндех и Гугль проиндексировали и потом люди могли найти решение.

andrey_kh
Offline
Зарегистрирован: 15.01.2018

Да это кодом то сложно назвать. Просто испытание. Завтра привяжу всё это дело к Serial и dll для отправки монохромных BMP нарисую. Всё до кучи выложу. А пока это выглядит вот так)

#include <SPI.h>

void setup() {

  SPI.begin();
  SPI.setDataMode(SPI_MODE3);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
}

void loop() {
 


for (int i = 0; i<64; i++){

  SPI.transfer(252);
  SPI.transfer(128);
  SPI.transfer(252);
  SPI.transfer(128);


  
  }

    
  delay(100000);
}

 

andrey_kh
Offline
Зарегистрирован: 15.01.2018

Результат (только цикл до 512)

demoss
Offline
Зарегистрирован: 03.12.2019

Доброго дня! Столкнулся с этими модулями тоже. Подскажите, а как выполняли подключение? К каким пинам? Хаб12 не стандартный.

Если тут spi то должны быть линии sclk, mosi? cs? Как мне тоже подключиться?

 

demoss
Offline
Зарегистрирован: 03.12.2019

Все, я все раскопал. У меня есть доступ к полной документации драйверов и модулей. Теперь будем делать кастомный контроллер.

llans
Offline
Зарегистрирован: 24.03.2020

demoss пишет:
Все, я все раскопал. У меня есть доступ к полной документации драйверов и модулей. Теперь будем делать кастомный контроллер.

Не поделитесь информацией?

demoss
Offline
Зарегистрирован: 03.12.2019

Напишите мне на почту demozz@mail.ru