Использование пинов SPI параллельно для личных нужд

unisonic
Offline
Зарегистрирован: 09.01.2018

У гугла спрашивал, не помогло.

Дано: arduino pro mini 328p. Все пины заняты. Пины 11, 12 и 13 задействованы для прошивки через USBasp v2.

Найти: пины для подключения трёх кнопок.

Вопрос: можно ли параллельно на 11, 12 и 13 пины повесить кнопки?

Мои рассуждения: прошивка по SPI идёт после ресета, так что, по идее, кнопки подключить можно. Но при этом при нажатии на кнопки будут идти высокие уровни в USBasp. Не убью ли программатор? Или просто не нажимать кнопки при подключенном программаторе? 

Если нельзя - буду использовать сдвиговый регистр.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Нет ничего, что нельзя было бы спалить.

2. По идее ри нажатии на кнопки, на присоединенных к ним пинах должны быть низкие уровни, а не высокие.

3. А Вы всерьез не можжете не нажимать кнопки в процессе прошивки контроллера?

 

PS. Лично я ничего плохого в подключении кнопок к пинам SPI, если SPI используетс я только для программирования, не вижу. Но всегда находятся умельцы см.п.1.

svm
Offline
Зарегистрирован: 06.11.2016

unisonic пишет:

Мои рассуждения: прошивка по SPI идёт после ресета, так что, по идее, кнопки подключить можно. Но при этом при нажатии на кнопки будут идти высокие уровни в USBasp. Не убью ли программатор? Или просто не нажимать кнопки при подключенном программаторе? 

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

unisonic
Offline
Зарегистрирован: 09.01.2018

andriano пишет:

2. По идее ри нажатии на кнопки, на присоединенных к ним пинах должны быть низкие уровни, а не высокие.

Эм... Почему? И какая разница в прерывании по высокому или низкому?

andriano пишет:

3. А Вы всерьез не можжете не нажимать кнопки в процессе прошивки контроллера?

Не в процессе прошивки, а после. Ну вот обновил я прошивку, программатор не отключил. Проверяю работу кнопок.

Вообще логика подсказывает, что программатору должно быть пофиг. Ну идёт по линиям обмена данными сигнал. По линии тактирования тем более. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Подключить к I2C PCF*, к ней - хоть 8 кнопок. Это как вариант.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

unisonic пишет:

andriano пишет:

2. По идее ри нажатии на кнопки, на присоединенных к ним пинах должны быть низкие уровни, а не высокие.

Эм... Почему? И какая разница в прерывании по высокому или низкому?

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

unisonic
Offline
Зарегистрирован: 09.01.2018

DIYMan пишет:

Подключить к I2C PCF*, к ней - хоть 8 кнопок. Это как вариант.

а будут работать прерывания?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

unisonic пишет:

DIYMan пишет:

Подключить к I2C PCF*, к ней - хоть 8 кнопок. Это как вариант.

а будут работать прерывания?

Какие прерывания, ВНЕЗАПНО?

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

unisonic пишет:

DIYMan пишет:

Подключить к I2C PCF*, к ней - хоть 8 кнопок. Это как вариант.

а будут работать прерывания?

У этого экстендера есть INT, который дергает МК, если состояние входов изменилось. Ловите его, потом сразу читайте из него состояние ног. Для кнопок пойдет.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

unisonic пишет:

DIYMan пишет:

Подключить к I2C PCF*, к ней - хоть 8 кнопок. Это как вариант.

а будут работать прерывания?

У этого экстендера есть INT, который дергает МК, если состояние входов изменилось. Ловите его, потом сразу читайте из него состояние ног. Для кнопок пойдет.

Да это-то ясно, я просто сильно удивился: сначала речь шла про совместное использование пинов SPI, чтобы туда кнопки вкорячить, потом, после совета про PCF, ВНЕЗАПНО, вопрос про прерывания. Как это связано - я так и не понял, учитывая тот факт, что на 328-м камне внешние прерывания на пинах 2 и 3, которые никаким боком к SPI.

alex_r61
Offline
Зарегистрирован: 20.06.2012

DIYMan пишет:

Как это связано - я так и не понял, учитывая тот факт, что на 328-м камне внешние прерывания на пинах 2 и 3, которые никаким боком к SPI.

 Кроме INT0 и INT1 есть ещё "Pin Change Interrupt".  Хотя если бы ТС догадался взглянуть в апноуты, то не пришлось бы создавать эту тему.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

alex_r61 пишет:

 Кроме INT0 и INT1 есть ещё "Pin Change Interrupt".  

КЭП! Спасибо, чтоб я без тебя делал. Думаешь, что ТС юзает PCINT* вектора? Шой-то я ооочень в этом сомневаюсь, вот терзают такие сомнения, иначе не было бы и темы про скрещивание ужа с ежом.

Повторюсь: удивлён, откуда вообще выплыл вопрос про работу прерываний, если изначально речь шла совсем не об этом. Ферштейн?

unisonic
Offline
Зарегистрирован: 09.01.2018

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

bizzon
Offline
Зарегистрирован: 29.03.2016

Ничего не сдохнет, не переживайте. Не так страшно выход в high состоянии коротнуть на массу. Гораздо хуже подать питание на выход в low состоянии.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

unisonic пишет:
Спасибо за ответы. Да, я забыл, что внешние прерывания на определенных портах. Тогда можно, действительно, повесить сдвиговый регистр, а кнопки на один пин с RC цепочками разных емкостей

Да зачем тебе кнопки на один пин? Бери PCF8574, туда подключишь свои кнопки, а ногу INT микрухи, если надо - повесишь на пин 2 или 3 (ну или PCINT* заюзать), по прерыванию с него будешь читать с микрухи, чего там поменялось на её ногах. Профитов - масса, надо будет ещё кнопок - повесишь ещё одну PCF8574 на ту же шину. И никаких головняков, собственно.

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

Или сразу PCF8575

alex_r61
Offline
Зарегистрирован: 20.06.2012

Ежели по теме, то достаточно глянуть на 6 страницу 42 апноута(AVR042) и вопрос решен. Но тогда форум закиснет. :)

svm
Offline
Зарегистрирован: 06.11.2016

bizzon пишет:

Ничего не сдохнет, не переживайте. Не так страшно выход в high состоянии коротнуть на массу. Гораздо хуже подать питание на выход в low состоянии.


Зря Вы так безаппеляционно. Сопротивление верхнего открытого ключа- 19 Ом, нижнего - 22 Ома.  Согласно закону Ома ток при 5 вольтах питания, будет 0.27 и 0,23 А соответственно. Что в любом случае должно быть смертельно для выхода. Если проводники соединяющие элементы МС не выгорят, то при длительном воздействии сдохнет от перегрева. Если потяет блок питания.

unisonic
Offline
Зарегистрирован: 09.01.2018

Подключил дисплей по SPI вот так http://playground.arduino.cc/Main/LiquidCrystal параллельно с программатором.

Команды на сдвиговый регистр идут по линии MOSI. Линия MISO свободна. По разводке платы очень удобно было бы повесить защелку на пин MISO.

При попытке объявить пин MISO защелкой дисплей пуст.

Cкетч тестовый, HelloWorld_SPI. 12 пин - MISO.

#include <ShiftedLCD.h>
#include <SPI.h>

// initialize the library with the number of the sspin 
// (or the latch pin of the 74HC595)
LiquidCrystal lcd(12);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

 

unisonic
Offline
Зарегистрирован: 09.01.2018

Подскажите, пожалуйста, как использовать 12 пин?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

"Защелка" - это что? Для какого устройства используется?

unisonic
Offline
Зарегистрирован: 09.01.2018

Сдвиговый регистр по линии MOSI заполняется данными, а при изменении на защелке сигнала с LOW на HIGH данные передаются на выходы регистра. На любых других пинах работает. На 12 нет. 

pinmode(12, OUTPUT) результата также не даёт.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так и должно быть.

 

- Вы умеете играть на скрипке?

- Да, умею.

- А на рояле?

- и на рояле тоже умею.

- Тогда сыграйте на том и на другом одновременно!

 

Вы можете использовать 12 пин для других нужд ТОЛЬКО тогда, когда не используете SPI. В SPI изменить назначение пина 12 (как и любого другого, имеющего аппаратную функцию) нельзя.

unisonic
Offline
Зарегистрирован: 09.01.2018

Это ясно, но в данном случае линия MISO (12 пин) не используется, так как сдвиговый регистр выходной. Только MOSI, тактовая и защелка.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если он лично Вам не нужен, это не значит, что он не используется.

Еще раз: во время работы SPI его аппаратные пины ни для чего другого использовать нельзя. Можно использовать только тогда, когда SPI не работает. Если Вас это не устраивает, пользуйтесь вместо аппаратного SPI софтверным shiftOut().