MCP23017 Управление общими командами

Sergius0000
Offline
Зарегистрирован: 04.01.2019

Использую Ардуино Нано в паре с расширителем портов MCP23017. С управлением пинами расширителя через класс проблем нет, там всё понятно, но это несколько неудобно для моих задач. Наткнулся на одном сайте (не знаю, как здесь относятся к ссылкам на сторонние ресурсы) на библиотеку со скетчем идея которого меня полностью устраивает.

Вся загвоздка в том, что это создано для PCA9534D. Я попробовал "поморгать" первой тысячей портов на 23017 с помощью этого скетча, но фокус не удался. 

Может кто-нибудь знает аналогичную библиотеку для MCP23017? Я попытался вникнуть в суть самой библиотеки, но понял, что это совсем не мой уровень. Или все же эта библиотека подходит и для 23017, но я чего-то напортачил?

#include <iarduino_I2C_IO_Global.h> // Подключаем библиотеку, разрешая использовать обычные функции для управления выводами модуля
                                     // При этом, адрес 1 модуля должен быть 0x20, следующего 0x21 и т.д.
                                     // Тогда выводы 0-7 принадлежат 1 модулю, 8-15 второму и т.д.
                                     // Номера выводов Arduino указываются типом uint8_t, а модулей uint16_t.
void setup() {
    iarduino_I2C_IO_Global.begin();  // Инициируем раборту с модулями расширения выводов
    pinMode(uint8_t(3),  OUTPUT);    // Конфигурируем 3 вывод Arduino как выход
    pinMode(uint8_t(7),  INPUT );    // Конфигурируем 7 вывод Arduino как вход
    pinMode(uint16_t(3), OUTPUT);    // Конфигурируем 3 вывод модуля  как выход
    pinMode(uint16_t(7), INPUT );    // Конфигурируем 7 вывод модуля  как вход
}
void loop(){
    digitalWrite(uint8_t(3), HIGH);   // Устанавливаем на 3 выводе arduino, состояние логической 1
    digitalWrite(uint16_t(3), LOW);   // Устанавливаем на 3 выводе модуля , состояние логического 0
    int a = digitalRead(uint8_t(7));  // читаем состояние 7 вывода Arduino в переменную a
    int b = digitalRead(uint16_t(7)); // читаем состояние 7 вывода модуля  в переменную b
}

Еще я там наткнулся на таблицу номеров выходов модулей в зависимости от адреса. На 23017 подобного мне найти не удалось:

Номера выводов, указываемые в стандартных функциях, зависят от адреса модуля на шине I2C:

Адрес модуля: 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27
Вход/Выход № 0 0 8 16 24 32 40 48 56
Вход/Выход № 1 1 9 17 25 33 41 49 57
Вход/Выход № 2 2 10 18 26 34 42 50 58
Вход/Выход № 3 3 11 19 27 35 43 51 59
Вход/Выход № 4 4 12 20 28 36 44 52 60
Вход/Выход № 5 5 13 21 29 37 45 53 61
Вход/Выход № 6 6 14 22 30 38 46 54 62
Вход/Выход № 7 7 15 23 31 39 47 55 63

Ссылка на библиотеку https://iarduino.ru/file/285.html

b707
Offline
Зарегистрирован: 26.05.2017

я бы советовал вам с осторожностью относится к библиотекам с сайта iarduino - эту конкретно не знаю. но на многие другие отзывы не очень

Что касается идеи работы с экспандером через переопределение функции digitalWrite() - в этом ничего нового нет. Если в библиотеке нет поддержки какого-то конкретного экспандера - ее наверняка можно дописать по аналогии

 

Насчет "тысячи" выводов не понял - вы что там курите то? :)

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

Sergius0000 пишет:
"поморгать" первой тысячей портов на 23017
А сколькими моргает? С 16-ю нормально всё?

Sergius0000
Offline
Зарегистрирован: 04.01.2019

По поводу тысячи портов. Я не нашел таблицы выводов для 23017, поэтому при помощи простого цикла менял состояние тысячи портов, это был эксперимент, который не дал положительных результатов. Старался описать всё максимально понятно, но видать не преуспел в этом.

Я не вижу смысла публикации своего скетча в виду отсутствия в нем принципиальных отличий в управлении выводами, за исключением того, что я через цикл перебираю значительно большее количество портов.

Вопрос по прежнему актуален.

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

Sergius0000 пишет:
не вижу смысла публикации своего скетча
Ну, и я не вижу смысла в дальнейшем участии в этой теме :)

b707
Offline
Зарегистрирован: 26.05.2017

Sergius0000 пишет:

По поводу тысячи портов. Я не нашел таблицы выводов для 23017, поэтому при помощи простого цикла менял состояние тысячи портов,

Так и не увидел ответа, откуда в 23017 "тысяча портов". Судя по даташиту - их там всего два. Вам не приходит в голову. что если отправить что-то на заведомо неправильный адрес (например на сотый порт микросхемы, у которой их два) - оно заведомо не дойдет? :)

Цитата:
Я не вижу смысла публикации своего скетча в виду отсутствия в нем принципиальных отличий в управлении выводами, за исключением того, что я через цикл перебираю значительно большее количество портов.

Вопрос по прежнему актуален.

раз не видите смысла - не понятно, зачем вообще начали эту дискуссию. Без конкретного рассмотрения кода  это просто бессмысленное сотрясение воздуха. Теоретически я вам уже ответил - добавьте в библиотеку поддержку 23017. Если не можете сами - закажите это более умелому программисту

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Создаешь нужное количество объектов, каждый со своим адресом. Собираешь из них массив.
Пишешь функцию трассировки.
Сложностей возникнуть не должно.

Sergius0000
Offline
Зарегистрирован: 04.01.2019
#include <Wire.h> 
#include <iarduino_I2C_IO_Global.h> 

uint8_t  ardPin = 8; 
uint16_t exPin = 2;
uint16_t iMin = 0, iMax = 3200;

void setup()
{
	Serial.begin(9600);
	iarduino_I2C_IO_Global.begin();
	pinMode(ardPin, OUTPUT);
	for (int i = iMin; i < iMax; i++)
	{
		pinMode(exPin, OUTPUT);
	}
}


void loop()
{
	func_exPin();
}

void func_exPin()
{
	for (uint16_t i = iMin; i < iMax; i++)
	{
		digitalWrite(exPin, HIGH);
	}
	digitalWrite(ardPin, HIGH);
	delay(1500);
	for (uint16_t i = iMin; i < iMax; i++)
	{
		digitalWrite(exPin, LOW);
	}
	digitalWrite(ardPin, LOW);
	delay(1500);
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Мне кажется, что ответ находится в даташите на MCP23017. Если Вы не нашли библиотеку (или не искали?), то ее не существует. Пишите ручками. Кстати - можно не библиотеку, а подпрограмму.

Гля, ну что за народ - на все им библиотеки давай... А как мы, старперы, без них писали? Да еще на ассемблере?

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

mykaida пишет:
А как мы, старперы, без них писали?
А хрен вас старпёров знает! 21-век на дворе. Надо, што б шевельнул пальцем и всё написано! :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

А хрен вас старпёров знает!

Логично, Евгений. Но это не отменяет того, что адепты должны учится

Sirocco
Offline
Зарегистрирован: 28.09.2013

Вопрос по MCP23017-E/SP.

Использую с WT32-ETH01. Arduino IDE. Библиотека DFRobot_MCP23017.h. Суть вопроса в помехоустойчивости. Когда дотрагиваюсь до шины I2C, или когда есть помехи, например блок питания рядом в сеть вставляю, который даже не питает схему, а питает что-то отдельное, то MCP23017 реагирует как сработка пинов. Все пины сконфигурированы как вход, все подтянуты резисторами 3,3кОм к GND. Если входа трогаю - никакой реакции. Если докоснуться до шины I2C - то начинает сыпаться мусор типа входы хаотично срабатывают. 

MCP23017-E/SP - это голая микросхема. I2C полтянута к Vcc редисторами 4,7 кОм. Но это роли не играет. Также подключил в шину ещё 2 устройства - INA226 и PCF8575. И как бы я над шиной не издевался, ни одно устройство не мусорит данными и не имеет сбоев, а MCP23017 говорит, что сработали входы. Собирал и на макетке, и потом спаял модуль, три микрухи - все одинаково работают. Одна с Алика, две из чип и дип.

Что с ними не так? Почему помехи по шине интерпретируются как полезный сигнал? Такое происходит, даже если вообще отключить микруху. Просто скетч прошит, к I2C ничего не подключаем, трогаем её и происходит сработка входов отключенной микросхемы. 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Sirocco пишет:

 Такое происходит, даже если вообще отключить микруху. Просто скетч прошит, к I2C ничего не подключаем, трогаем её и происходит сработка входов отключенной микросхемы. 

То есть , исходя из этого проблема не в микросхеме , а в коде. Библиотеку поменяй , попробуй без библиотеки.