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

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

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

Сообщение pan »

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

хочу посадить на программный i2c с выбором пинов
Последний раз редактировалось pan 10 июл 2017, 14:57, всего редактировалось 1 раз.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

Надо глянуть библиотеку Wire.h
Сейчас посмотрю.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

для программного случайно не другая библиотека нужна?
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

Посмотрел. Ничего о пинах нет.
pan писал(а):для программного случайно не другая библиотека нужна?
Думаю, да. 
Как и для второго уарта...
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Dev1
Майор
Сообщения: 1045
Зарегистрирован: 12 июл 2016, 18:04
Откуда: Гондурас
Поблагодарили: 3 раза

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

Сообщение Dev1 »

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

Программно можно сделать и SPI, и serial, и все остальное. Разница только в количестве времени, требуемого для выполнения пересылки. В случае аппаратного интерфейса можно запустить передачу и продолжать выполнять другие задачи, а об окончании передачи можно узнать по прерыванию либо периодически проверяя флаги в статусном регистре. В случае же программного формирования сигналов контроллер занят в течение всей пересылки и других действий в это время выполнять не может.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x :shok:
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

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
Майор
Сообщения: 1045
Зарегистрирован: 12 июл 2016, 18:04
Откуда: Гондурас
Поблагодарили: 3 раза

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

Сообщение Dev1 »

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

Блок служит для выдачи высокого логического уровня на выход с номером соответствующим значению, подаваемому на вход блока. При подаче на вход блока значения 0, на всех выходах будет низкий логический уровень.
В редакторе блока можно настроить количество выходов.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x :shok:
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

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
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

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)
---------------------------------------------
Что это ты такое мудришь? Что и откуда считываешь?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

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

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

Добавлено (16.07.2017, 17:03)
---------------------------------------------
ребят , ну давайте осилим вместе . помогите )
Andrej
Рядовой
Сообщения: 84
Зарегистрирован: 13 июл 2017, 17:30

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

Сообщение Andrej »

В блоках пользователей не похожее лежит? 
Еще завтра посмотрю на компе, что то из старых веток форума блок попадался "отправка и прием 2байта в уарт".
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

уже сам накопал инфы и благодаря (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 июл 2017, 17:30

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

Сообщение Andrej »

А почему 16? Отсчет разве не идет с ноля? Интересно откуда он лишний байт берет?
Аватара пользователя
Dev1
Майор
Сообщения: 1045
Зарегистрирован: 12 июл 2016, 18:04
Откуда: Гондурас
Поблагодарили: 3 раза

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

Сообщение Dev1 »

Andrej писал(а):А почему 16? Отсчет разве не идет с ноля?
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x :shok:
Andrej
Рядовой
Сообщения: 84
Зарегистрирован: 13 июл 2017, 17:30

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

Сообщение Andrej »

Хотя да. Ляпнул.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

явно засада с этой строчкой { Key |= 1 << Count; }
но честно говоря не понимаю что в этой строке происходит
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

№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);}
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

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

Добавлено (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
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

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

Добавлено (17.07.2017, 09:37)
---------------------------------------------
pan писал(а):имеет право на жизнь?))
Да.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей