Страница 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
спасибо. будет тестить