Страница 2 из 3

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

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

хочу посадить на программный i2c с выбором пинов

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

Добавлено: 10 июл 2017, 15:00
Sancho
Надо глянуть библиотеку Wire.h
Сейчас посмотрю.

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

Добавлено: 10 июл 2017, 15:01
pan
для программного случайно не другая библиотека нужна?

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

Добавлено: 10 июл 2017, 15:07
Sancho
Посмотрел. Ничего о пинах нет.
pan писал(а):для программного случайно не другая библиотека нужна?
Думаю, да. 
Как и для второго уарта...

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

Добавлено: 10 июл 2017, 16:35
Dev1
Цитата с форума амперки  

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

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

Добавлено: 15 июл 2017, 13:19
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 бит ?

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

Добавлено: 15 июл 2017, 14:52
Dev1
pan писал(а):как правильно принять не номер а все 16 бит ?
Операции с битами - дешифратор не пойдет? 

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

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

Добавлено: 15 июл 2017, 14:57
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);
}

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

Добавлено: 15 июл 2017, 16:55
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)
---------------------------------------------
Что это ты такое мудришь? Что и откуда считываешь?

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

Добавлено: 16 июл 2017, 17:03
pan
Sancho, ни чего не мудрю. нужно считать 2 байта по последовательному порту. программно , ногодрыгом

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

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

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

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

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

Добавлено: 16 июл 2017, 21:58
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)
---------------------------------------------
когда наверняка не умеешь пипец как без железа изобретать..)

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

Добавлено: 16 июл 2017, 22:17
Andrej
А почему 16? Отсчет разве не идет с ноля? Интересно откуда он лишний байт берет?

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

Добавлено: 16 июл 2017, 22:21
Dev1
Andrej писал(а):А почему 16? Отсчет разве не идет с ноля?

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

Добавлено: 16 июл 2017, 22:25
Andrej
Хотя да. Ляпнул.

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

Добавлено: 16 июл 2017, 22:38
pan
явно засада с этой строчкой { Key |= 1 << Count; }
но честно говоря не понимаю что в этой строке происходит

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

Добавлено: 17 июл 2017, 09:17
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);}

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

Добавлено: 17 июл 2017, 09:33
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);
}

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

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

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

Добавлено (17.07.2017, 09:37)
---------------------------------------------
pan писал(а):имеет право на жизнь?))
Да.

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

Добавлено: 17 июл 2017, 09:42
pan
спасибо. будет тестить