Проблема GPA7, GPB7 MCP23017

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Коллеги,

встречался ли кто-нибудь с проблемой https://www.microchip.com/forums/m831656.aspx?

По всем признакам, мы тоже столкнулись с непонятным поведением расширителя - используем GPA и GPB в качестве входов и иногда состояния сбрасываются в противоположное. Обычно по 8 входов, но бывает и сразу все. Ситуация повторяется нерегулярно - может пару суток проработать, а может несколько раз за день.

Как думаете, причина та, что описана в ссылке?

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Причину, кажется, нашли - это импульсная помеха. Как она проходит - по входу или питанию, пока неясно. На питающей - шине танталовый конденсатор 100 мкФ, вход - с оптической развязкой.

Помеха вызывает сброс регистров IPOLA, IPOLB с дефолтного состояния в FF. Пока сделали в каждом цикле чтение этих регистров и при ненулевых значениях их перезапись в 0. Для этого пришлось в библиотеке Adafruit_MCP23017 перенести объявления readRegister и writeRegister в открытую часть класса.

Кстати, по этой причине, вероятно, библиотека https://github.com/blemasle/arduino-mcp23017 удобнее.

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Коллеги,

простой вопрос, касается не только MCP23017, но вообще работы с подобными микросхемами. Как правило, начальные установки регистров выполняются в setup. А какие минусы, если это делать в loop перед операциями чтения/записи данных. Применительно к MCP23017 - например, установка режима адресации, режима пинов, полярности и т.д. Например:

#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp_1;

void setup() {
    mcp_1.begin(0);
}  

void loop() {

    mcp_1.writeRegister(MCP23017_IOCONA, 0x20); 

    mcp_1.writeRegister(MCP23017_IODIRA, 0xFF); 
    mcp_1.writeRegister(MCP23017_IODIRB, 0xFF); 
    
    mcp_1.writeRegister(MCP23017_IPOLA, 0x0); 
    mcp_1.writeRegister(MCP23017_IPOLB, 0x0); 

    uint16_t gpioState = mcp_1.readGPIOAB();
}

Понятно, что с прерываниями этого делать нельзя.

Есть ли минусы у такого подхода?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

sergek пишет:
По всем признакам, мы тоже столкнулись с непонятным поведением расширителя - используем GPA и GPB в качестве входов и иногда состояния сбрасываются в противоположное.
Железку покажи. Поди собрана из говна и палок...

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Сама mcp - на обратной стороне платы.

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Что, мои палки не понравились? ;)

Меня все же интересует вопрос с инициализацией регистров в лупе.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

sergek пишет:
Что, мои палки не понравились? ;)
Проблема скорее всего с питанием, надо топологию анализировать, а значит вид обратной стороны, да и под зеленкой дорог не разглядеть.

А инициализировать регистры можно где угодно, разницы нет. Хоть даже из прерывания... Только это костыль.

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Спасибо, понятно, что костыль. Ребята как раз занимаются и топологией, и землей, и конденсаторами. Плохо то, что и на осциллографе ничего плохого не увидели, и на питании чисто. Но однозначно - помеха откуда-то прилетает. На стенде помеху моделируют люминесцентными светильниками с дросселями.

rkit
Offline
Зарегистрирован: 23.11.2016

sergek пишет:

Ребята как раз занимаются и топологией, и землей, и конденсаторами.

Уволить "ребят", которые клеммники с шагом 5мм под переменный ток поставили.

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

rkit пишет:

Уволить "ребят", которые клеммники с шагом 5мм под переменный ток поставили.

Других нет. Но могу поругать - а в чем засада? Они утверждают, что все сделано - оптическая развязка, все дела. И на столе со всеми входами AC (~220 В) все нормально. А в бою регистры MCP, как к датчику случайных чисел подключены.

rkit
Offline
Зарегистрирован: 23.11.2016

Если работает на столе, то это не значит, что не загорится, когда в сети напряжение скакнет до 1200V.

https://m.habr.com/ru/post/428023/