Пользовательский блок ( Помощь )

На этом форуме Вы можете задать вопросы знатокам программы и автору.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#21

Сообщение pan » 10.07.2017{, 14:57}

я сделал блок с физическим i2c  там с микрухи считывается 2 байта, адреса регистра нет.
Wire.requestFrom(adr,2,true);
data1=Wire.read();
data2=Wire.read();

хочу посадить на программный i2c с выбором пинов
Последний раз редактировалось pan 10.07.2017{, 14:57}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 3990
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательский блок ( Помощь )

#22

Сообщение Sancho » 10.07.2017{, 15:00}

Надо глянуть библиотеку Wire.h
Сейчас посмотрю.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#23

Сообщение pan » 10.07.2017{, 15:01}

для программного случайно не другая библиотека нужна?

Аватара пользователя
Sancho
Полковник
Сообщения: 3990
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательский блок ( Помощь )

#24

Сообщение Sancho » 10.07.2017{, 15:07}

Посмотрел. Ничего о пинах нет.
pan писал(а):для программного случайно не другая библиотека нужна?
Думаю, да. 
Как и для второго уарта...
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

Пользовательский блок ( Помощь )

#25

Сообщение Dev1 » 10.07.2017{, 16:35}

Цитата с форума амперки  

Программно можно сделать и SPI, и serial, и все остальное. Разница только в количестве времени, требуемого для выполнения пересылки. В случае аппаратного интерфейса можно запустить передачу и продолжать выполнять другие задачи, а об окончании передачи можно узнать по прерыванию либо периодически проверяя флаги в статусном регистре. В случае же программного формирования сигналов контроллер занят в течение всей пересылки и других действий в это время выполнять не может.
Win7-64 FLProg v7.2.2 Portable :fie:

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#26

Сообщение pan » 15.07.2017{, 13:19}

Dev1, это я и без амперки знаю. согласен не самая нужная вещь, но вдруг понадобится.

Добавлено (14.07.2017, 10:55)
---------------------------------------------
появилась проблемка с блоком. методом тыка выяснилось что из за кода в блоке такого вида
 pinMode(CAP_PIN, OUTPUT);
pinMode(CAP_PIN, INPUT);

отдельно блок работает а другим не дает.
эти строчки выполняются в цикле. может ли это влиять на работу остальной программы? или глюк в другом?

Добавлено (14.07.2017, 11:19)
---------------------------------------------
вопрос снят. всё работает. видимо был глюк где то

Добавлено (15.07.2017, 13:19)
---------------------------------------------
еще один вопрос)
 что то затупил вроде на простом . сть код
for(Count = 1; Count <= 16; Count++)
  {
    digitalWrite(SCL_PIN, LOW); 
    if (!digitalRead(SDO_PIN))
     Key_State = Count; 
     digitalWrite(SCL_PIN, HIGH);
  }  
по последовательному порту ногодрыгом смотрит какая кнопка нажата (из 16) и возвращает номер нажатой кнопки (при чем судя по коду если нажата не одна, то вернет значение кнопки с большим порядковым номером.
 как правильно принять не номер а все 16 бит ?

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

Пользовательский блок ( Помощь )

#27

Сообщение Dev1 » 15.07.2017{, 14:52}

pan писал(а):как правильно принять не номер а все 16 бит ?
Операции с битами - дешифратор не пойдет? 

Блок служит для выдачи высокого логического уровня на выход с номером соответствующим значению, подаваемому на вход блока. При подаче на вход блока значения 0, на всех выходах будет низкий логический уровень.
В редакторе блока можно настроить количество выходов.
Win7-64 FLProg v7.2.2 Portable :fie:

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#28

Сообщение pan » 15.07.2017{, 14:57}

Dev1, можно конечно подать на стандартный дешифратор. но это не то. если принять все биты то можно будет отслеживать одновременно нажатие любой комбинации кнопок.
так правильно?
for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW); 
if (digitalRead(SDO_PIN)) { Key_State |= 1 << Count);}
digitalWrite(SCL_PIN, HIGH);
}

Аватара пользователя
Sancho
Полковник
Сообщения: 3990
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательский блок ( Помощь )

#29

Сообщение Sancho » 15.07.2017{, 16:55}

pan, просто идея...
EPRST = 1;
Key_2_Byte = 0; // unsigned int два байта состояния клавиатуры
for(int Count = 0; Count < 16; Count++)
{
Key_2_Byte =Key_2_Byte + Key_Stat * EPRST; // Key_Stat - Нажата клавиша - 1, нет - 0
EPRST = EPRST * 2;

}

Добавлено (15.07.2017, 16:55)
---------------------------------------------
Что это ты такое мудришь? Что и откуда считываешь?
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#30

Сообщение pan » 16.07.2017{, 17:03}

Sancho, ни чего не мудрю. нужно считать 2 байта по последовательному порту. программно , ногодрыгом

Добавлено (16.07.2017, 12:52)
---------------------------------------------
ни кто не знает чтоли?

Добавлено (16.07.2017, 17:03)
---------------------------------------------
ребят , ну давайте осилим вместе . помогите )

Andrej
Рядовой
Сообщения: 84
Зарегистрирован: 13.07.2017{, 17:30}
Репутация: 0

Пользовательский блок ( Помощь )

#31

Сообщение Andrej » 16.07.2017{, 21:50}

В блоках пользователей не похожее лежит? 
Еще завтра посмотрю на компе, что то из старых веток форума блок попадался "отправка и прием 2байта в уарт".

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#32

Сообщение pan » 16.07.2017{, 21:58}

уже сам накопал инфы и благодаря (Marcony_V в качестве тестера) кое что получилось. но не совсем как надо.
вот код который работает:
for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW); 
if (!digitalRead(SDO_PIN)) { Key |= 1 << Count; }
digitalWrite(SCL_PIN, HIGH);
}

но вместо например 00000001 00000010 00000100  получаю 00000001 00000011 00000111
 чё лишнее убрать или добавить?))

Добавлено (16.07.2017, 21:58)
---------------------------------------------
когда наверняка не умеешь пипец как без железа изобретать..)

Andrej
Рядовой
Сообщения: 84
Зарегистрирован: 13.07.2017{, 17:30}
Репутация: 0

Пользовательский блок ( Помощь )

#33

Сообщение Andrej » 16.07.2017{, 22:17}

А почему 16? Отсчет разве не идет с ноля? Интересно откуда он лишний байт берет?

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

Пользовательский блок ( Помощь )

#34

Сообщение Dev1 » 16.07.2017{, 22:21}

Andrej писал(а):А почему 16? Отсчет разве не идет с ноля?
Win7-64 FLProg v7.2.2 Portable :fie:

Andrej
Рядовой
Сообщения: 84
Зарегистрирован: 13.07.2017{, 17:30}
Репутация: 0

Пользовательский блок ( Помощь )

#35

Сообщение Andrej » 16.07.2017{, 22:25}

Хотя да. Ляпнул.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#36

Сообщение pan » 16.07.2017{, 22:38}

явно засада с этой строчкой { Key |= 1 << Count; }
но честно говоря не понимаю что в этой строке происходит

Аватара пользователя
Sancho
Полковник
Сообщения: 3990
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательский блок ( Помощь )

#37

Сообщение Sancho » 17.07.2017{, 09:17}

№1
int EPRST = 1;
unsigned int Key_2_Byte = 0;
for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW);
if (digitalRead(SDO_PIN)) { Key_2_Byte = Key_2_Byte + EPRST;}
EPRST = EPRST * 2;
digitalWrite(SCL_PIN, HIGH);
}
№2
unsigned int Key_State = 0;
for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW);
if (digitalRead(SDO_PIN)) { Key_State << 1 + 1);}
else { Key_State << 1);}
digitalWrite(SCL_PIN, HIGH);
}

Добавлено (17.07.2017, 09:12)
---------------------------------------------
Думаю, вариант №2

Добавлено (17.07.2017, 09:17)
---------------------------------------------
так, наверно, правильнее
if (digitalRead(SDO_PIN)) { (Key_State << 1) + 1);}
else { Key_State << 1);}
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#38

Сообщение pan » 17.07.2017{, 09:33}

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

Добавлено (17.07.2017, 09:18)
---------------------------------------------
а так правильно ?

for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW); 
Key |= (digitalRead(SDO_PIN)) << Count;
digitalWrite(SCL_PIN, HIGH);
}

Добавлено (17.07.2017, 09:33)
---------------------------------------------
еще одна бредовая мысль)

for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW);
bitWrite(Key, Count, digitalRead(SDO_PIN))
digitalWrite(SCL_PIN, HIGH);
}

имеет право на жизнь?))

Аватара пользователя
Sancho
Полковник
Сообщения: 3990
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательский блок ( Помощь )

#39

Сообщение Sancho » 17.07.2017{, 09:37}

an писал(а):а при разных комбинациях одновременного нажатия нескольких кнопок работать будет?
будет.
pan писал(а):а так правильно ?
Возможно да. Но перед циклом Key придётся обнулять, иначе единицы по "или" так и останутся.

Добавлено (17.07.2017, 09:37)
---------------------------------------------
pan писал(а):имеет право на жизнь?))
Да.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Пользовательский блок ( Помощь )

#40

Сообщение pan » 17.07.2017{, 09:42}

спасибо. будет тестить

Ответить

Вернуться в «Спросить у знатоков»