Не работает INPUT на расширителе портов MCP23S17
- Войдите на сайт для отправки комментариев
Ср, 23/01/2019 - 12:29
Добрый день. Прошу помощи.
Не могу считать данные с расширителя портов 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 - не помогает. Также кучу других библиотек - ни одна не подошла.
У меня есть такая микросхема и я могу вечером попробовать, но без шилда и без библиотеки. Вам это поможет? Впрочем, с библиотекой тоже могу, если Вы ссылку на неё дадите, а вот шилда у меня нет (и не будет).
ЕвгенийП, Спасибо. Давайте попробуем. Буду рад любой помощи. 2дня уже убил, я в тупике. Ссылку сброшу
https://github.com/MajenkoLibraries/MCP23S17
Вот ссылка на библиотеку
Хорошо, я постараюсь вечером запустить и посмотреть.
На Уно точно 10-13 SPI пины, а на Меге другие. Напутали вы что-то, ни на вход ни на выход на Меге без правильного подключение не поедет.
Согласен с предыдущим оратором. У меги SPI на перпендикулярном торцевом пинхидере и на ICSP-разъеме. Данный шилд ни к одному из них не коннектится.
У меня не ардуино, а фредуиномега. По сути таже самая ардуинамега, но 86 портов. Там есть джампер который переключает SPI либо как у меги (51-53 пин) либо как UNO (10-13). У меня стоит на UNO.
Порты выставляются выходами. Устанавливаю 1. (digitalWrite(i, HIGH);) - появляется напряжение 4,6 в. (то же самое с INPUT_PULLUP. Т.е делаю вывод, что подключено верно. (10-13 пин)
НО прочетать не могу. digitalRead(i) - не работает. Пробывал по разному как с подтягивающим резистором так и с INPUT_PULLUP. - ничего
У меня не ардуино, а фредуиномега. По сути таже самая ардуинамега, но 86 портов. Там есть джампер который переключает SPI либо как у меги (51-53 пин) либо как UNO (10-13). У меня стоит на UNO.
Допустим, что Вы на какой-то там плате что-то переключили. Давайте теперь заглянем в библиотеку SPI.h:
void SPIClass::begin() { ... pinMode(SCK, OUTPUT); pinMode(MOSI, OUTPUT); ... }Посему сделаем на фридуине вот так, к примеру: Serial.println(MOSI) и посмотрим - действительно ли среда Arduino почуяла, что вы там джамперами нащёлкали.
Ну если джамперы, тогда трудно сказать. Контакты? А SPI через джамперы на той плате уже ипользовалась, ну с каким-нить другим устройством? Она точно работает?
А библиотеку другую если, я как то проверял свои MCP23S08 с этой:
https://github.com/sumotoy/gpio_MCP23SXX
И вход и выход на ура читались.
Посему сделаем на фридуине вот так, к примеру: Serial.println(MOSI) и посмотрим - действительно ли среда Arduino почуяла, что вы там джамперами нащёлкали.
Сделал как сказали, блин получилось 51 - как у меги, подумаю как исправить.
Спасибо
Переставление перемычки ни чего не меняет. Может кто подскажет, как подключить этот шильд
(http://www.freeduino.ru/arduino/expander-shield.html)
к этому контроллеру
(http://www.freeduino.ru/arduino/freeduino-mega-2560.html)
и, блин получилось 51 - как у меги, подумаю как исправить.
Спасибо
А я как раз только собрался запускаться.
Значит, пока не буду :)
А я как раз только собрался запускаться.
Значит, пока не буду :)
Все равно спасибо, но еще не вечер)
Переставление перемычки ни чего не меняет. Может кто подскажет, как подключить этот шильд
Если умеете, то накатываете freeduino.ru_patch_arduino_1.6.3.zip и в pins_arduino.h правите на нужные
Если умеете, то накатываете freeduino.ru_patch_arduino_1.6.3.zip и в pins_arduino.h правите на нужные
Сделал вроде бы получилось. Mosi - стало 11, но появилась проблема с выводом в COM порт. Сначала начинает выводить, потом все... тишина
Разбираемся дальше)
// 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)))Думаю что тут что то надо изменить.
Хотя, знаете, по схеме вроде как действительно перекидывается реальный D52 на D13 пинхидера (и остальные тоже). Что-то пельмени на соображалку плохо повлияли.
Но тогда вопрос, конечно, почему тогда не работало, а сейчас работает. Мультиметр имеется ли в хозяйстве? Потыкайте с установленными джамперами на фридуине - действительно ли весь SPI появляется на шилде (D50 фиридуины звонится с D12 шилда и т.п. см нижний левый угол схемы).
Подскажите как найти библиотеку SPI.h, в C:\Program Files (x86)\Arduino\libraries -нет
Есть только в WIFI
Но скетч при загрузке не ругается, значит она есть.
Но тогда вопрос, конечно, почему тогда не работало, а сейчас работает. Мультиметр имеется ли в хозяйстве? Потыкайте с установленными джамперами на фридуине - действительно ли весь SPI появляется на шилде (D50 фиридуины звонится с D12 шилда и т.п. см нижний левый угол схемы).
На работе мультиметр, приеду прозвоню.
Снес библиотеку SPI.h - загруженной мною с гигхаба, *(кривой имхо).
Но скетч все равно запускается, хотяя там
есть эта библиотека и он запускается. В папке библиотеки, больше SPI.h нет (только в папке WIFI)
Подскажите как его найти?
Подскажите как найти библиотеку SPI.h, в C:\Program Files (x86)\Arduino\libraries -нет
Ну, уж потыкали бы там вокруг, ну чего ж сразу постить-то?
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI
Нашел))
Вообщем решил проблему, которую сам и создал. Дело оказалось в том, что к 53-50 пинам я распаял витую пару . (планировал изначально использвать как выходы, а PSI у меня будет на 10-13 пине.). Когда сообразил что пины не те, а проводов у меня "уева туча" (портов 86+32) и практически все припаены, и всё это жестко связано и прикручено в коробку, разбирать и выпаивать было лень. (есть небольшой запас по пинам). Думаю, что эти порты при подключении находилсь в высокоимпедансном состоянии и при считывании сигнало 0, менялся на 1 и обратно. Все отключил - сразу заработало. Буду завтра заново паять).
Всем спасибо за помощь.