[Arduino] Оптимизация затратной части проекта

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

Всем доброго дня!

Сразу скажу, что в по программированию у меня, самый что ни на есть базовый уровень.
Для более быстрого вливания в тему прикупил себе платку Mega c большим количеством цифровых I/O

Однако размеры Меги в готовом проекте меня не устраивают.
По размерам подходят платы Micro, Mini, Nano. Но уперся в то, что у этих плат гораздо меньшее количество цифровых входов/выходов.

С выходами разобрался - их можно увеличить за счет использования сдвигового регистра.
А вот как быть с цифровыми входами? Как их можно увеличить?

В проекте:
digital INPUT - 12 шт.
digital OUTPUT - 25 шт.


В общем, буду благодарен за помощь в решении сложившемся затыке..
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Есть сдвиговые регистры, работающие наоборот: параллельный вход, последовательный выход. Например 74HC165.
Изображение only pure true norwegian blackx Изображение
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Еще как вариант - мультиплексоры, например, 74HC4051. Расход ног будет больше, чем для сдвиговых регистров, зато при необходимости можно опрашивать не все входы (можно даже один вход), что сделает опрос быстрее.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

blackx писал(а):Есть сдвиговые регистры, работающие наоборот: параллельный вход, последовательный выход. Например 74HC165.
А где можно почитать про них?
Про сдвиговые регистры на выходах есть информация на arduino.ru а вот про использование входных что-то нигде не находил информации. :(
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

z00lu писал(а):а вот про использование входных что-то нигде не находил информации.
.. можно подключить так, а еще лучше на аппаратный SPI
Вложения
io_ext.PNG
(22.64 КБ) 1100 скачиваний
Реклама
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

ChipKiller писал(а):
z00lu писал(а):а вот про использование входных что-то нигде не находил информации.
.. можно подключить так, а еще лучше на аппаратный SPI
Как при таком подключении будет выглядеть скетч, например включения светодиода при нажатии кнопки?

Так, если просто к цифровому входу подключать, кнопку и при появлении 0 на входе зажигается светодиод все предельно понятно ,а вот с последовательным портом не разу не сталкивался.

Код: Выделить всё

 //пример зажигания светодиода при  0 на цифровом входе

int led = 13;
int button = 10;

void setup()
{
pinMode(led, OUTPUT);
pinMode(button, INPUT);
} 
void loop()
{
if(digitalRead(button) == LOW)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
}
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

вот обработка одновременной записи/чтения

Код: Выделить всё

.equ	Pin_DIn = 0
.equ	Pin_DOut = 1
.equ	Pin_SCK = 2
.equ	Pin_STR = 3
.equ	Pin_LD = 4


Soft_Spi:
	push r17
	ldi r17,8
	clr data_in
	; clk LD
	cbi PORTB,Pin_LD  ; LD=0	
	sbi PORTB,Pin_LD  ; LD=1 - защелкивание входных данных в 165
spi_rw:
	lsl data_in		  ; сдвиг	
	sbic PINB,Pin_DIn ; skip if Pin_DIn==0
	ori	data_in,1	  ; data_in|=1
	sbrc data_out,7	
	sbi PORTB,Pin_DOut ; DOut=1
	sbrs data_out,7
	cbi PORTB,Pin_DOut ; DOut=0
	sbi PORTB,Pin_SCK ; Clk=0
	lsl data_out
	cbi PORTB,Pin_SCK ; Clk=1 -  clk чтения/записи бита
	dec r17
	brne spi_rw
	; clk STR
	sbi PORTB,Pin_STR ; STR=1 
	cbi PORTB,Pin_STR ; STR=0 - защелкивание выходных данных в 595
	pop r17
	ret	
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Про ардуино ничего не знаю. Принцип работы с таким регистром следующий. Когда нужно считать состояние со всех входов, подается сигнал "захвата" уровня (регистр сохраняет в свои ячейки текущие состояния входов). Далее подается сигнал "старт передачи", и биты начинают двигаться по ячейкам и попадают по одному на выход - все как в обычном сдвиговом регистре. Естественно при приеме подается также сигнал тактирования.

Подробнее - смотрите "Timing diagram" в даташитах на такие регистры.
Изображение only pure true norwegian blackx Изображение
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

Всем спасибо!
Пока буду ковыряться с кодом чтобы переписать на 14 цифровых выходов Arduino nano
К концу майских, думаю осилю.
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

Так и не получается заставить работать регистр так как мне надо :(

Как должна работать программа:
У ардуино на входах (Can1...Can6) постоянно подается высокий сигнал
Когда на всех каналах +5 - на выходах регистра 0
Когда на каком-либо канале 0 - на соответствующем выходе регистра +5

Все работает но не так как бы хотелось:
Изначально на всех каналах +5 и на выходах регистра 0 (все верно)
На первом канале падение на 0 - на соответствующем выходе регистра +5 (верно)

Но потом действует +5 на соответствующем выходе регистра не прекращается до падения на другом канале

Пробовал писать, все так же без изменений :(

Код: Выделить всё

else
{
digitalWrite(latchPin, LOW);
}

Что, где упустил?




[code]
int Can1 = 22;
int Can2 = 3;
int Can3 = 4;
int Can4 = 5;
int Can5 = 24;
int Can6 = 6;

//определяем выходы регистра
int latchPin = 51;
int clockPin = 49;
int dataPin = 53;


void setup()
{
  //инициируем как выходы 
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  //настраиваем входы каналов
  pinMode(Can1, INPUT);
  pinMode(Can2, INPUT);
  pinMode(Can3, INPUT);
  pinMode(Can4, INPUT);
  pinMode(Can5, INPUT);
  pinMode(Can6, INPUT);
  
  //настраиваем начальное положение защелки

  digitalWrite(latchPin, HIGH);

}


void loop()
{
 //считываем LOW c каналов  и в зависимости от считанного канала выводим +5V на выходе регистра
 // обработка первого канала
  if(digitalRead(Can1) == LOW)
 {

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 128);
  digitalWrite(latchPin, HIGH);
  
 }

 // обработка второго канала
 
 if(digitalRead(Can2) == LOW)
 {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 64);
  digitalWrite(latchPin, HIGH);
 }
 
  // обработка третьего канала
 
 if(digitalRead(Can3) == LOW)
 {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 32);
  digitalWrite(latchPin, HIGH);
 }
 
   // обработка четвёртого канала
 
 if(digitalRead(Can4) == LOW)
 {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 16);
  digitalWrite(latchPin, HIGH);
 }
 
    // обработка пятого канала
 
 if(digitalRead(Can6) == LOW)
 {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 8);
  digitalWrite(latchPin, HIGH);
 }
 
     // обработка шестого канала
 
 if(digitalRead(Can9) == LOW)
 {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 4);
  digitalWrite(latchPin, HIGH);
 }
}
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Сообщение drakon »

может вам подойдет I2C расширитель портов, такой как PCF8574/PCF8575. каждому можно задавать 3 бита адреса тремя пинами, можно на одну шину поставить 8 расширителей, у каждого 8/16 I/O. стоит 9грн.
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

Может и подойдет, но сейчас бы с регистрами разобраться
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

Нашел таки отличную статью на Robocraft по поводу расширения вводов/ выводов Arduino
Правда народа там нет совсем :(
Монолог какой-то получился :lol:
http://robocraft.ru/blog/arduino/541.html#comment4035

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

1. подключаем библиотеки

Код: Выделить всё

#include <LineDriver.h>
#include <SPI.h>
#include <SPI_Bus.h>
2. Инициализируем регистр

Код: Выделить всё

SPI_Bus shift_register(_8bit, <b>номер_порта_SS_по_даташиту_платы</b>);
3. Переписываем все digitalWrite(переменая_цифрового_выхода_на_дуине, HIGH_или_LOW) следующим образом:

Код: Выделить всё

shift_register.lineWrite(номер_выхода_регистра, HIGH_или_LOW);

Теперь вот пытаюсь организовать выходы задействовав каскад из трех регистров 74HC595.

Что надо прописать при подключении трех регистров каскадом?
Как указать в скетче выходы второго и третьего регистра?
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

С выходами разобрался :kill:

Но опять же какой-то монолог получился :beer:

Курим входы для оптимизации проекта под Arduino Nano
Можно задействовать аналоговые входы как цифровые?
Необходимо считывать с них LOW c частотой примерно 60 Hz
Буду рад если кто присоединится... :)))
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

z00lu писал(а):Но опять же какой-то монолог получился :beer:
Просто если хочется маленькую платку - лучше таки самому сделать и вытравить платку, и не заморачиваться со всякими Adruino. Потому как для маленькой платки надо использовать SMD компоненты и SMD микросхемки. Я вот, хоть и начинающий радиолюбитель - даже прототипы делаю на вытравленных платках. Потому как вытравить плату это 1-2 часа времени максимум, но зато все крепко и надежно. А когда больше сотни элементов, то надежность уже важна.
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Сообщение zöner »

74hc595 + 74hc597
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

zöner писал(а):74hc595 + 74hc597
с регистрами уже разобрался.
Сейчас интересует возможность использавания аналоговых входов как цифровых.
Будет ли ардуина успевать опрашивать 8 каналов на предмет падения напряжения за 20микросеаунд?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

z00lu писал(а):Будет ли ардуина успевать опрашивать 8 каналов на предмет падения напряжения за 20микросеаунд?
Нет, там максимальная скорость - 100 микросекунд на отчет примерно.
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт мар 12, 2013 05:25:54

Сообщение z00lu »

Придется пользовать регистры на вход:(
Ответить

Вернуться в «AVR»