Не работает INPUT на расширителе портов MCP23S17

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018
Добрый день. Прошу помощи.
Не могу считать данные с расширителя  портов Expander Shield на микросхеме  MCP23S17 
(два 16-разрядных расширителя портов ввода/вывода с SPI),
Использую библиотеку MCP23S17-master, 
Порты отлично устанавливаются как выходы, могу подать высокий или низкий уровень, тут все ОК.
Но как вход ( INPUT или INPUT_PULLUP)- ни хрена не работают. 
Ардуинка такая. (http://freeduino.ru/arduino/freeduino-mega-2560.html), переключатьель установлен в положение std( что соответствует 10/11/12/13 пину  SS, MISO, MOSI и SCK)
В чем может быть проблема?. Я грешу либо на библиотеку, либо на - линия для передачи данных MISO.
Библиотеку  могу выложить. 
Вот мой скетч. 
#include <MCP23S17.h>
#ifdef __PIC32MX__
// chipKIT uses the DSPI library instead of the SPI library as it's better
#include <DSPI.h>
DSPI0 SPI;
#else
// Everytying else uses the SPI library
#include <SPI.h>
#endif
const uint8_t chipSelect = 10;
// Create an object for each chip
// Bank 0 is address 0
// Bank 1 is address 1.
// Increase the addresses by 2 for each BA value.
MCP23S17 Bank1(&SPI, chipSelect, 0);
MCP23S17 Bank2(&SPI, chipSelect, 1);
void setup()
{
  Serial.begin(9600);
  Bank1.begin();
  Bank2.begin();
  //Bank2.pinMode(1, INPUT_PULLUP);
  for (int i = 0; i < 16; i++) {
    Bank1.pinMode(i, INPUT_PULLUP);
    Bank2.pinMode(i, INPUT_PULLUP);
   //Bank2.digitalWrite(1, HIGH);
   pinMode(14, INPUT);
  }
}

void loop()
{
  int value=Bank2.digitalRead(1);
  int value1=Bank1.digitalRead(1);
   int value2=digitalRead(14);
  Serial.println(); Serial.print("SIGNAL=  ");  Serial.print(value);
  Serial.print("   SIGNAL  2  =  ");  Serial.print(value1);
  Serial.print("   SIGNAL  3(14)  =  ");  Serial.print(value2);
  //delay(10);
           
}

PS. Пробывал как INPUT с подтягивающим резистором так и INPUT_PULLUP - не помогает. Также кучу других библиотек  - ни одна не подошла.

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

У меня есть такая микросхема и я могу вечером попробовать, но без шилда и без библиотеки. Вам это поможет? Впрочем, с библиотекой тоже могу, если Вы ссылку на неё дадите, а вот шилда у меня нет (и не будет).

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

ЕвгенийП, Спасибо. Давайте попробуем. Буду рад любой помощи. 2дня уже убил, я в тупике. Ссылку сброшу

 

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

https://github.com/MajenkoLibraries/MCP23S17

Вот ссылка на библиотеку

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

Хорошо, я постараюсь вечером запустить и посмотреть.

Волшебник
Offline
Зарегистрирован: 22.12.2016

На Уно точно 10-13 SPI пины, а на Меге другие. Напутали вы что-то, ни на вход ни на выход на Меге  без правильного подключение не поедет.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Согласен с предыдущим оратором. У меги SPI на перпендикулярном торцевом пинхидере и на ICSP-разъеме. Данный шилд ни к одному из них не коннектится.

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

У меня не ардуино, а фредуиномега. По сути таже самая ардуинамега, но 86 портов. Там есть джампер который переключает SPI  либо как у меги (51-53 пин) либо как UNO (10-13). У меня стоит на UNO.
Порты выставляются выходами. Устанавливаю 1. (digitalWrite(i, HIGH);) - появляется напряжение 4,6 в. (то же самое с INPUT_PULLUP. Т.е делаю вывод, что подключено верно. (10-13 пин)
НО прочетать не могу.   digitalRead(i) - не работает. Пробывал по разному как с подтягивающим резистором  так и  с INPUT_PULLUP.  - ничего

sadman41
Offline
Зарегистрирован: 19.10.2016

Gagarin_IV пишет:

У меня не ардуино, а фредуиномега. По сути таже самая ардуинамега, но 86 портов. Там есть джампер который переключает SPI  либо как у меги (51-53 пин) либо как UNO (10-13). У меня стоит на UNO.

Допустим, что Вы на какой-то там плате что-то переключили. Давайте теперь заглянем в библиотеку SPI.h:

void SPIClass::begin() {
...
    pinMode(SCK, OUTPUT);
    pinMode(MOSI, OUTPUT);
...
}

Посему сделаем на фридуине вот так, к примеру: Serial.println(MOSI) и посмотрим - действительно ли среда Arduino почуяла, что вы там джамперами нащёлкали.

 

Волшебник
Offline
Зарегистрирован: 22.12.2016

Ну если джамперы, тогда трудно сказать. Контакты? А SPI через джамперы на той плате уже ипользовалась, ну с каким-нить другим устройством? Она точно работает?

А библиотеку другую если, я как то проверял свои MCP23S08 с этой:

https://github.com/sumotoy/gpio_MCP23SXX

И вход и выход на ура читались.

 

 

 

 

 

 

 

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

sadman41 пишет:

Посему сделаем на фридуине вот так, к примеру: Serial.println(MOSI) и посмотрим - действительно ли среда Arduino почуяла, что вы там джамперами нащёлкали.

Сделал как сказали, блин получилось 51 - как у меги, подумаю как исправить. 
Спасибо

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

Переставление перемычки ни чего не меняет.  Может кто подскажет, как подключить этот шильд

(http://www.freeduino.ru/arduino/expander-shield.html)

к этому контроллеру

(http://www.freeduino.ru/arduino/freeduino-mega-2560.html)

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

Gagarin_IV пишет:

и, блин получилось 51 - как у меги, подумаю как исправить. 

Спасибо

А я как раз только собрался запускаться.

Значит, пока не буду :)

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

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

А я как раз только собрался запускаться.

Значит, пока не буду :)

Все равно спасибо, но еще не вечер)

sadman41
Offline
Зарегистрирован: 19.10.2016

Gagarin_IV пишет:

Переставление перемычки ни чего не меняет.  Может кто подскажет, как подключить этот шильд

Если умеете, то накатываете freeduino.ru_patch_arduino_1.6.3.zip и в pins_arduino.h правите на нужные 

static const uint8_t SS   = 53;
static const uint8_t MOSI = 51;
static const uint8_t MISO = 50;
static const uint8_t SCK  = 52;

 

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

sadman41 пишет:

Если умеете, то накатываете freeduino.ru_patch_arduino_1.6.3.zip и в pins_arduino.h правите на нужные 

static const uint8_t SS   = 53;
static const uint8_t MOSI = 51;
static const uint8_t MISO = 50;
static const uint8_t SCK  = 52;

 

Сделал вроде бы получилось. Mosi - стало 11, но появилась проблема с выводом в COM порт.  Сначала начинает выводить, потом все... тишина
Разбираемся дальше)

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018
// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)
// Only pins available for RECEIVE (TRANSMIT can be on any pin):
// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me)
// Pins: 10, 11, 12, 13,  50, 51, 52, 53,  62, 63, 64, 65, 66, 67, 68, 69

#define digitalPinToPCICR(p)    ( (((p) >= 10) && ((p) <= 13)) || \
                                  (((p) >= 50) && ((p) <= 53)) || \
                                  (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) )

#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \
                                ( (((p) >= 62) && ((p) <= 69)) ? 2 : \
                                0 ) )

#define digitalPinToPCMSK(p)    ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \
                                ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \
                                ((uint8_t *)0) ) )

#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \
                                ( ((p) == 50) ? 3 : \
                                ( ((p) == 51) ? 2 : \
                                ( ((p) == 52) ? 1 : \
                                ( ((p) == 53) ? 0 : \
                                ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \
                                0 ) ) ) ) ) )

#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT)))

 

Думаю что тут что то надо изменить.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Хотя, знаете, по схеме вроде как действительно перекидывается реальный D52 на D13 пинхидера (и остальные тоже).  Что-то пельмени на соображалку плохо повлияли.

Но тогда вопрос, конечно, почему тогда не работало, а сейчас работает. Мультиметр имеется ли в хозяйстве? Потыкайте с установленными джамперами на фридуине - действительно ли весь SPI появляется на шилде (D50 фиридуины звонится с D12 шилда и т.п. см нижний левый угол схемы).

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

Подскажите как найти библиотеку SPI.h, в C:\Program Files (x86)\Arduino\libraries -нет 

Есть только в WIFI

Но скетч при загрузке не ругается, значит она есть.

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

sadman41 пишет:

Но тогда вопрос, конечно, почему тогда не работало, а сейчас работает. Мультиметр имеется ли в хозяйстве? Потыкайте с установленными джамперами на фридуине - действительно ли весь SPI появляется на шилде (D50 фиридуины звонится с D12 шилда и т.п. см нижний левый угол схемы).

На работе мультиметр, приеду прозвоню.

Снес  библиотеку SPI.h - загруженной мною с гигхаба,  *(кривой имхо).
Но скетч все равно запускается, хотяя там 

#include <MCP23S17.h>
#ifdef __PIC32MX__
// chipKIT uses the DSPI library instead of the SPI library as it's better
#include <DSPI.h>
DSPI0 SPI;
#else
// Everytying else uses the SPI library
#include <SPI.h>
#endif
const uint8_t chipSelect = 10;
// Create an object for each chip
// Bank 0 is address 0
// Bank 1 is address 1.
// Increase the addresses by 2 for each BA value.
MCP23S17 Bank1(&SPI, chipSelect, 0);
MCP23S17 Bank2(&SPI, chipSelect, 1);

есть эта библиотека и он запускается. В папке библиотеки, больше SPI.h нет (только в папке WIFI)
Подскажите как его найти?

 

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

Gagarin_IV пишет:

Подскажите как найти библиотеку SPI.h, в C:\Program Files (x86)\Arduino\libraries -нет 

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

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI

Gagarin_IV
Offline
Зарегистрирован: 28.11.2018
 

Нашел))

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries
Gagarin_IV
Offline
Зарегистрирован: 28.11.2018

Вообщем решил проблему, которую сам и создал. Дело оказалось в том, что к 53-50 пинам я распаял витую пару . (планировал изначально использвать как выходы, а PSI у меня будет на 10-13 пине.). Когда сообразил что пины не те, а проводов у меня "уева туча" (портов 86+32) и практически все припаены, и всё это жестко связано и прикручено в коробку, разбирать и выпаивать было лень. (есть небольшой запас по пинам).  Думаю, что эти порты при подключении находилсь в высокоимпедансном состоянии и при считывании сигнало 0, менялся на 1 и обратно.  Все отключил  - сразу заработало.  Буду завтра заново паять).
Всем спасибо за помощь.