Read с PCF8574 с использованием attachInterrupt

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

sadman41 пишет:

На ёлке лампочки зажигать.

по одной кнопке на лампочку? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

На ёлке лампочки зажигать.

Каждую своей кнопкой?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

теперь всю ночь не спать буду, варочаца, думать, кудыж в Ардуине 100 кнопок надо. 

Да, ладно, спите спокойно. Вон, в соседней теме перцу надо "больше 200 модулей датчиков сервомеханизмов и т д", и ничего :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

по одной кнопке на лампочку? 

По две. Одной кнопкой включать, а другой - выключать.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Ахтыжёёё....

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вон оно как... Звери разные, а мысли одинаковые.

Ну и пусть на кажну кнопку лампочку. У органа вон сколько клавиш - но красиво ж получается.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Если кнопок многа, то делают программный "опорос", ставя на выход мультиплексор, типа 3->8 или 4->16 на "столбцы" кнопочной матрицы, а читают строки, можно и таким вот расширителем. Кстати PCF8574 согласно даташиту может работать на вход, а вот может ли работать на прием MCP23017 - не смотрел.

Итого имеем мультиплексор 4->16 = 16 "столбцов", 8 входов (PCF8574 или прямо входы Ардуино) = 8 строк, итого 8*16 = 128 кнопок. Достаточно?

Алгоритм прост: подаем "код" от 0 до 15 на 4 управляющих входа мультиплексора, он формирует на соотв. столбе "1" и опрашиваем (если взять 1 порт целиком, то ровно 1 чтение) строчные входы. Смотрим "где" проскочила наша "1" и на пересечении стало быть кнопку и нажали. А может и в двух строках сразу .. дыве кнопки .. или больше.

Есть готовые "контроллеры клавиатуры" на этом принципе. Например КР580ВВ79, она ещё и индикатором типа LCD1602 (2 строки по 16 символов) .. есть "буржуйские аналоги", но я их не знаю.

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Arhat109-2 пишет:

 а вот может ли работать на прием MCP23017 - не смотрел.

И MCP23017 , и MCP23016 отлично работают и на вход  , и на выход.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пасибки, буду иметь ввиду. Тем не менее, для такого количества кнопок я бы пошукал готовые модули контроллеров клавиатур. Наверняка есть такие матричные опросники в виде мелкосхемы... одной.

.. чем-то же клавиатуры детских музыкальных синтезаторов как-то опрашивают .. а там сейчас в основном игрушки с 8-ю "одновременными нажатиями" и до 4-5 октав по 12 клавиш...

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

А у 8574 еще прерыванье есть по изменению входа

sadman41
Онлайн
Зарегистрирован: 19.10.2016

MCP23017:

• INTA and INTB Can Be Configured to Operate Independently or Together

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Вот и это теперь буду знать :-)

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Еще, по-моему, MCP-шке можно наказать на какие входы прерываньем реагировать, а на какие - нет. PCF такого не могёт.  

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Для меня слепошарого недостаток только корпус, а у 8574 он dip. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Так я тоже модулем-переходником на DIP использую ;)

bwn
Offline
Зарегистрирован: 25.08.2014

DetSimen пишет:

Для меня слепошарого недостаток только корпус, а у 8574 он dip. 

Ниправда Ваша, и в SO16 очень даже хороши.)))) А вот когда 8575 в ssop24 приехала, тут напрягся, принтер тоже, у него разрешение малое оказалось, лапы в один полигон слились, теперь на 1200dpi поглядываю, только от цен шалею.((((

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

DetSimen пишет:

Для меня слепошарого недостаток только корпус, а у 8574 он dip. 

Диду! так MCP23016 /17 тоже есть в DIP. Я поначалу с ними делал платы.Еще у 23016 есть внешняя RC -цепочка(больше элементов при пайке), а у 23017 -нет.На выходы им  не нужна подтяжка к плюсу как у PCF8574(у PCF Quasi-bidirectional I/Os). Но цены на них высоковастые.

bwn
Offline
Зарегистрирован: 25.08.2014

nikolaki пишет:

На выходы им  не нужна подтяжка к плюсу как у PCF8574(у PCF Quasi-bidirectional I/Os). 

Та не, 8574 все нормальные попадались, в обе стороны тянут.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Думаю что ТС-у стоит поискать что-то похожее на MAX7370 и сразу подключение по I2C.

Ещё вот нашел ADP5588 - до 80 клавиш и тоже I2C.

AleksSF
Offline
Зарегистрирован: 06.03.2019

Здрасте.

У меня Эластичная клавиатура 4x4 , подключена через PCF8574. Код следующий:

// Подключение библиотек
#include <Wire.h>
#include <i2ckeypad.h>

// Создание объектов
i2ckeypad kpd = i2ckeypad(0x20, 4, 4);

// Объявление глобальных переменных и констант
volatile boolean flagKeypad = false;  // флаг нажатия клавиатуры

//---------- Обработка прерывания ----------
void reciveKey(){
  flagKeypad = true;
  Serial.println("Interrupt");
}
//------------------------------------------
//---------- Начальные установки ----------
void setupKeypad(){
  Wire.begin();
  kpd.init();         // Инициализируем объект keypad
  attachInterrupt(1, reciveKey, FALLING); // назначаем прерывание
}
//-----------------------------------------

Так вот прерывание срабатывает постоянно, с частотой раз 10-20 в сек, хотя я никакую кнопку не нажимаю. Пробовал разные условия срабатывания, пробовал подтягтвать к +5. Никакого эффекта. Что я не так делаю ?

vvadim
Offline
Зарегистрирован: 23.05.2012

а зачем там прерывания

скачайте  Keypad_I2C, отлично работает и всё просто.

AleksSF
Offline
Зарегистрирован: 06.03.2019

vvadim пишет:

скачайте  Keypad_I2C, отлично работает и всё просто.

Библиотека у меня стоит, но тогда нужно делать опрос клавиатуры. А хочется сделать красиво, тем более что аппаратно все есть. Ну и разобраться хочется.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

MCP23S17, как включить работы пинов INTA(B)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, там много вариантов. Их можно зазркалить, можно назначить прерывание на изменени, совпадение, чего надо-то?

Давайте, Вы посмотрите даташит (раздел 1.7) или другой даташит (раздел 3.6), а если вопросы останутся, тогда отпишитесь

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

ЕвгенийП пишет:

Ну, там много вариантов. Их можно зазркалить, можно назначить прерывание на изменени, совпадение, чего надо-то?

Давайте, Вы посмотрите даташит (раздел 1.7) или другой даташит (раздел 3.6), а если вопросы останутся, тогда отпишитесь

Нужно прерывание при изменении

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
Wire.begin();
Wire.beginTransmission(0x05);
Wire.write("0b00000000");
Wire.endTransmission();

 

И выбираем нужный бит настройки?

Wire.write("0b10000000");

выбран 7 бит

БАНК: контролирует, как регистры адресованы
1 = Регистры, связанные с каждым портом, разделены на разные банки.
0 = регистры находятся в одном и том же банке (адреса последовательные).
sadman41
Онлайн
Зарегистрирован: 19.10.2016

А что, Wire.write() умеет строку в число превращать?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
Wire.write(0b10000000);

Исправилась)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

ЕвгенийП пишет:

Ну, там много вариантов. Их можно зазркалить, можно назначить прерывание на изменени, совпадение, чего надо-то?

Давайте, Вы посмотрите даташит (раздел 1.7) или другой даташит (раздел 3.6), а если вопросы останутся, тогда отпишитесь

Как выполнить нужную мне настройку?

  Wire.beginTransmission(0x20);
  Wire.write(0x13);
  Wire.endTransmission();
  Wire.requestFrom(0x20,1);
reads=Wire.read();

Правильно считываю с порта б?

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Wire.write(0b11111111);
Ещё вопрос.
Как записать, т.е. включить только один нужный пин, не трогая состояние остальных.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Интересно, как вы с ним по I2C работаете, если MCP23S17 - High-Speed SPI Interface?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

MCP23017, невнимательная...

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

bitWrite(x, n, b)
Так записывать отдельный бит для управления нужным пином?

sadman41
Онлайн
Зарегистрирован: 19.10.2016
...
byte mcpPins = Wire.read();

bitSet(mcpPins, 3); // Set bit #3
bitClear(mcpPins, 5); // Clear bit #5
...
Wire.write(mcpPins);
...


 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

sadman41 пишет:

...
byte mcpPins = Wire.read();

bitSet(mcpPins, 3); // Set bit #3
bitClear(mcpPins, 5); // Clear bit #5
...
Wire.write(mcpPins);
...


 

Благодарна

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

С настройкой прерываний на INT А и B не разобралась

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Столкнулась с проблемой:

void SETTING_MCP1(){
//Пины с 1 по 7 выходы  
Wire.beginTransmission(ADR_MCP1);
Wire.write(PORT_A);
Wire.write(MCP_OUT);
Wire.endTransmission();
//Пины с 1 по 7 выключены  
Wire.beginTransmission(ADR_MCP1);
Wire.write(PINS_A);
Wire.write(0xFF);
Wire.endTransmission();
//Пины с 8 по 15 входы
Wire.beginTransmission(ADR_MCP1);
Wire.write(PORT_B);
Wire.write(MCP_INP);
Wire.endTransmission();
}

void setup() {
Wire.begin(); 
SETTING_MCP1;
}

Всё работает. Хорошо.

При отключении питания и последующем включении, MCP не включает ножки с 0 по 7.

Но если текст функции SETTING_MCP1() переместить в setup(), то при перезагрузке всё работает как надо.

Почему так происходит?

nik182
Offline
Зарегистрирован: 04.05.2015

Может быть пустые скобки после функции добавить в строке 21?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Невнимательна...а я то у же думала...Спасибо.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Снова появилась необходимость чтения с MCP по прерыванию, а в прошлый раз я так и не разобралась как это сделать, научите пожалуйста