MCP23017 по i2c - загадочная нестабильная работа

Поиском “Ничего не найдено”, поэтому новым топиком.

На шине также висит LCD1602, есть подтяжка 4.7к (делал и на 5в и на 3.3, модуль LCD тоже отключал). MCP SOIC, собрана на перфорированной макетке через адаптер с обычными пинами через 2,54. Все адреса на землю. Соединена обычным 4х шлейфом (земля-питание-данные-часики) длиной 18см с основной макеткой.

Скетч предельно простой: инициализация и блинк (всё завёрнуто в функции, поэтому здесь условно развернул)

setup()
  Wire.beginTransmission(0x20);
  Wire.write((byte)bank);           // два вызова с 0x00 банк и 0x01
  Wire.write((byte)mask);           // здесь 0х00 в обоих случаях
  Wire.endTransmission()

  Wire.beginTransmission(0x20);
  Wire.write((byte)bank);           // два вызова с 0x00 банк и 0x01
  Wire.write((byte)mask);           // здесь 0х00 в обоих случаях
  Wire.endTransmission()


loop()
  Wire.beginTransmission(0х20);
  Wire.write((byte)bank);           // здесь 0x12
  Wire.write((byte)mask);           // 0xAA
  Wire.endTransmission();

  Wire.beginTransmission(0х20);
  Wire.write((byte)bank);           // здесь 0x13
  Wire.write((byte)mask);           // 0xAA
  Wire.endTransmission();
  delay(500);

  Wire.beginTransmission(0х20);
  Wire.write((byte)bank);           // здесь 0x12
  Wire.write((byte)mask);           // 0x55
  Wire.endTransmission();

  Wire.beginTransmission(0х20);
  Wire.write((byte)bank);           // здесь 0x13
  Wire.write((byte)mask);           // 0x55
  Wire.endTransmission();
  delay(500);

То есть, мигаем в шахматном порядке. Напаял несколько диодов - в пределах этих портов всё отлично (полностью не проверял, проблема не в этом).

Сама проблема:

  • рандомно после 30-100 циклов мигать перестаёт.
  • если прикоснуться к корпусу или к распаянным портам - мигать перестаёт.
  • если прикасаться к нераспаянным портам - пофиг.
  • если сжать шлейф в руке - пофиг.
  • покачивать соединительный разъём - пофиг.
  • убрать-вернуть инициализацию дисплея - пофиг.

Кроме того, иногда мигалка не запускается и при ребуте.

ЧЯДНТ?

тем несчастным,которые захотят Вам помочь придеться сломать себе мозк

Я бы с удовольствием ответил, но, к сожалению, @Alexey_Rem прав.

Давайте Вы сделаете так:

  1. приведёте не многословное непонятное описание, а нормальную принципиальную схему;
  2. приведёте не “условно сокращённый” некомпилирующийся скетч, а короткий, но полный скетч, который можно запустить и увидеть в чём Ваша проблема
  3. приведёте фото всех соплей и покажете к чему именно надо прикоснуться, чтобы всё сломалось.

Если Вы это сделаете, то Ваши шансы на вразумительный ответ резко возрастут.

Ну, а если нет - сегодня пятница.

1 лайк

сегодня пятница вне зависимости от того, сделает ТС что просят или нет )))

Плата с контроллером своя или нет? Какая?
Конденсаторы по питанию электролит и керамика стоят? От чего питается?

1 лайк

Диоды без резисторов ?

На данный момент заводская нано, в будущем проект переедет на камень. Питание по USB.

Диоды в сборке с резисторами порядка 180 (или 250) ом, переезжают от теста к тесту, к ним претензий не должно быть, по идее. Горят с обычной яркостью, все. Могу замерить, но надо термоусадки резать, немного жалко.

upd замерил рандомно - 240 ом.

По пунктам Евгения скину чуть позже схему со скетчем.

Во фразе

нет никакой причинно-следственной связи между “нет” и “пятница”. По крайней мере на моём уровне знания и понимания русского языка.

1 лайк

Про касания уже написал: к корпусу чипа сверху или к уже распаянным портам, что странно. Соплями не паяю с детства, уж извините. К тому же места пайки никакого влияния не оказывают.

Схема (без LCD, так как его полное электрическое отключение не спасает):

  • A0 также на массе, на схеме точки нет, пропустил.

Скетч под спойлером. Пришлось слить несколько файлов, но это фактический код.

Здесь

#include <Wire.h>

const uint8_t
MCP_addr = 0x20,
bank_A_port = 0,
bank_B_port = 1,
bank_A_addr = 0x12,
bank_B_addr = 0x13;

void setup() {
Wire.begin();

InitMCP23017(bank_A_port);
InitMCP23017(bank_B_port);
}

void loop() {
writeMCP23017(bank_A_addr, 0xAA);
writeMCP23017(bank_B_addr, 0xAA);
delay(500);

writeMCP23017(bank_A_addr, 0x55);
writeMCP23017(bank_B_addr, 0x55);
delay(500);
}

void InitMCP23017(uint8_t bank = 0x00, uint8_t mask = 0x00) {
Wire.beginTransmission(MCP_addr);
Wire.write((byte)bank);
Wire.write((byte)mask);
Wire.endTransmission();
}

void writeMCP23017(uint8_t bank = 0x12, uint8_t mask = 0x00) {
Wire.beginTransmission(MCP_addr);
Wire.write((byte)bank);
Wire.write((byte)mask);
Wire.endTransmission();
}

я бы прверил пропайку земли- особенно и питания на ногах микрухи, вера в качество пайки не раз меня подводила, reset висит в воздухе?

Есть догадка, почему.

кто научил резисторы подтяжки на 3.3 повесить?

Вот в точечку. Ресет и пакостил. Я вообще про него не вспомнил, ломаю голову, явно дело в каких-то наводках - а в чём… замылился глаз, пока схему не прорисовал. Смотрю и думаю: а чего это он у меня нигде? )))))

1 лайк

была б ТТЛ логика было бы проще))

1 лайк

Да всё потому что уже перебрал. А на 3.3 часто советуют и адреса и ресет подтягивать.

Кто и где? В любом случае у наны 3.3 не для питания или подтяжек. 3.3 используют если плата питается от силовых 3.3, но тогда между наной и платой нужно ставит преобразователь 3.3-5 вольт.

хоть один пруф будет? иначе я буду считать, что вы очередной …
и если советуют, чеж ресет не притянут?

и еще куда резисторы 240 ом подсоединены, или так тоже “советуют”?

Про ресет - всё стопудово. Я бы ещё поставил конденсаторы по питанию MCP - а то при резких изменениях нагрузки глюки более, чем вероятны.

1 лайк

Кстати, к подтяжке на 3.3 - при всей неумелой игре в сарказм, пубертатной агрессии и некоторой ограниченности в понимании матчасти в двух вопросах, есть пара рассуждений. Самая очевидная версия, конечно, бездумное тиражирование по интернетам. Тем более, что по даташиту 0.8Vdd, а это заметно выше, как ни крути (хотя второй день тестов показывает стабильную работу). Сэкономить потребление на два миллиампера на подтяжках тоже не довод, так как намного проще поднять токоограничивающие до 500 ом и вписаться в лимит по Vdd со всеми 16 портами (но не по Vss, там понадобится поднять ещё немного выше). Отмечу, что чип начинает некомфортно греться при длительной работе далеко до достижения лимита. Для AMS эти два миллиампера тоже не делают никакой погоды, так что да.

А что по вашему является источником этих 3.3 ? Вы где то нашли LDO на плате ?