Пользовательский блок ( Помощь )
Пользовательский блок ( Помощь )
я сделал блок с физическим i2c там с микрухи считывается 2 байта, адреса регистра нет.
Wire.requestFrom(adr,2,true);
data1=Wire.read();
data2=Wire.read();
хочу посадить на программный i2c с выбором пинов
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 раз
- Контактная информация:
Пользовательский блок ( Помощь )
Надо глянуть библиотеку Wire.h
Сейчас посмотрю.
Сейчас посмотрю.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Пользовательский блок ( Помощь )
Посмотрел. Ничего о пинах нет.
Как и для второго уарта...
Думаю, да.pan писал(а):для программного случайно не другая библиотека нужна?
Как и для второго уарта...
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Dev1
- Майор
- Сообщения: 1045
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 3 раза
Пользовательский блок ( Помощь )
Цитата с форума амперки
Программно можно сделать и SPI, и serial, и все остальное. Разница только в количестве времени, требуемого для выполнения пересылки. В случае аппаратного интерфейса можно запустить передачу и продолжать выполнять другие задачи, а об окончании передачи можно узнать по прерыванию либо периодически проверяя флаги в статусном регистре. В случае же программного формирования сигналов контроллер занят в течение всей пересылки и других действий в это время выполнять не может.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x 

Пользовательский блок ( Помощь )
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 бит ?
Добавлено (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 раза
Пользовательский блок ( Помощь )
Операции с битами - дешифратор не пойдет?pan писал(а):как правильно принять не номер а все 16 бит ?
Блок служит для выдачи высокого логического уровня на выход с номером соответствующим значению, подаваемому на вход блока. При подаче на вход блока значения 0, на всех выходах будет низкий логический уровень.
В редакторе блока можно настроить количество выходов.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x 

Пользовательский блок ( Помощь )
Dev1, можно конечно подать на стандартный дешифратор. но это не то. если принять все биты то можно будет отслеживать одновременно нажатие любой комбинации кнопок.
так правильно?
for(int Count = 0; Count < 16; Count++)
{
digitalWrite(SCL_PIN, LOW);
if (digitalRead(SDO_PIN)) { Key_State |= 1 << Count);}
digitalWrite(SCL_PIN, HIGH);
}
так правильно?
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 раз
- Контактная информация:
Пользовательский блок ( Помощь )
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)
---------------------------------------------
Что это ты такое мудришь? Что и откуда считываешь?
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, если что. запомните на всякий. многие знают номер тлф.
Пользовательский блок ( Помощь )
Sancho, ни чего не мудрю. нужно считать 2 байта по последовательному порту. программно , ногодрыгом
Добавлено (16.07.2017, 12:52)
---------------------------------------------
ни кто не знает чтоли?
Добавлено (16.07.2017, 17:03)
---------------------------------------------
ребят , ну давайте осилим вместе . помогите )
Добавлено (16.07.2017, 12:52)
---------------------------------------------
ни кто не знает чтоли?
Добавлено (16.07.2017, 17:03)
---------------------------------------------
ребят , ну давайте осилим вместе . помогите )
Пользовательский блок ( Помощь )
В блоках пользователей не похожее лежит?
Еще завтра посмотрю на компе, что то из старых веток форума блок попадался "отправка и прием 2байта в уарт".
Еще завтра посмотрю на компе, что то из старых веток форума блок попадался "отправка и прием 2байта в уарт".
Пользовательский блок ( Помощь )
уже сам накопал инфы и благодаря (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)
---------------------------------------------
когда наверняка не умеешь пипец как без железа изобретать..)
вот код который работает:
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)
---------------------------------------------
когда наверняка не умеешь пипец как без железа изобретать..)
Пользовательский блок ( Помощь )
А почему 16? Отсчет разве не идет с ноля? Интересно откуда он лишний байт берет?
- Dev1
- Майор
- Сообщения: 1045
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 3 раза
Пользовательский блок ( Помощь )
Andrej писал(а):А почему 16? Отсчет разве не идет с ноля?
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x 

Пользовательский блок ( Помощь )
явно засада с этой строчкой { Key |= 1 << Count; }
но честно говоря не понимаю что в этой строке происходит
но честно говоря не понимаю что в этой строке происходит
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Пользовательский блок ( Помощь )
№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);}
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, если что. запомните на всякий. многие знают номер тлф.
Пользовательский блок ( Помощь )
а при разных комбинациях одновременного нажатия нескольких кнопок работать будет?
Добавлено (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);
}
имеет право на жизнь?))
Добавлено (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 раз
- Контактная информация:
Пользовательский блок ( Помощь )
будет.an писал(а):а при разных комбинациях одновременного нажатия нескольких кнопок работать будет?
Возможно да. Но перед циклом Key придётся обнулять, иначе единицы по "или" так и останутся.pan писал(а):а так правильно ?
Добавлено (17.07.2017, 09:37)
---------------------------------------------
Да.pan писал(а):имеет право на жизнь?))
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя