Вход

Регистрация
Главная
 

 

Пиротехнические пульты, пиротехническое оборудование
и пиротехника
Pyro Alex RF 48
Open Pyro SFX 8 D
Open Pyro SFX 10/120
Pyro Man 200 M
Spets 150
Приём заказов на изготовление пиротехнических пультов
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Пиропульты - Электроника Форум » Электроника » Микроконтроллеры и ПЛИС » Расширение входов arduino (Сдвиговый регистр наоборот)
Расширение входов arduino
alexval2007Дата: Среда, 17.11.2010, 14:41 | Сообщение # 1
Электро воспламенитель
Группа: Администраторы
Сообщений: 662
Награды: 7
Репутация: 7
Статус: Offline
Расширение входов arduino

Для этого есть много способов различные мультиплексоры матрицы и прочее но мы сегодня поговорим о сдвиговых регистрах. те кто шастал по буржуйскому сайту ARDUINO возможно встречался с Arduino - ShiftOut на базе сдвигового регистра 74hc595 это регистр с последовательной загрузкой данных и параллельным их выводом с возможностью защелки данных (память). Он служит для расширения выходов, а мы говорим о входах. Есть в природе его аналог с точностью да на оборот 74hc597, но так как у меня его нет, мы поговорим о другом таком же регистре 74hc165. Эта микросхема довольно удобна и легка в каскадировании (увеличение количества микросхем соединенных последовательно для увеличения количества входов для управления ими используется всего 4 ноги контролера) Собственно Datasheet рекомендую к прочтению. http://www.nxp.com/documents/data_sheet/74HC_HCT165.pdf Собственно тут микросхемы подключены не к Arduino, но это неважно главное суть код все равно будет для Arduino.
немного картинок один регистр 8 входов Два регистра 16 входов. Только не увлекайтесь задержки для их опроса никуда не дернуться . Если в вашей схеме будет слишком много регистров, то начнутся тормоза в объемных программах где критично быстродействие.

Немного картинок один регистр 8 входов.

Два регистра 16 входов.

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

Идем дальше немного кода.

//**************************************************************//
// Использование 74HC165, 8-бит. Параллельный ввод //
// Последовательный вывод сдвиговый регистр. 74HC165 //
//**************************************************************//
int indataPin = 11; // Вывод чтения данных из 74HC165 (9).
int inclockPin = 12; // Вывод CLK для 74HC165 (2).
int inloadPin = 13; // Вывод выбора Параллельный ввод/последовательный вывод. Для 74HC165 (1).
int temp = 0; // Переменная хранения приятых данных из 74HC165.

void setup(){ // Инициализация контролера.
Serial.begin(9600); // Выбираем скорость обмена по UART.
pinMode(indataPin, INPUT); // Настраиваем на Ввод для приёма данных из 74HC165.
pinMode(inclockPin, OUTPUT); // Настраиваем на Вывод CLK на 74HC165.
pinMode(inloadPin, OUTPUT); // Настраиваем на Вывод load на 74HC165.
}

void loop(){ // Главный програмный цикл
digitalWrite(inloadPin, 0); // считываем все данные со входов 74HC165 в регистр.
digitalWrite(inloadPin, 1); // выводим данные на последовательный вывод "Q7" 74HC165.
for(int i=0; i<=7; i++){ // В цикле считываем каждый из 8 входов (D0-D7) 74HC165.
digitalWrite(inclockPin, 0); // Устанавливаем CLK в лог "0".
temp = digitalRead(indataPin); // Читаем текущее состояние выхода данных "Q7" 74HC165.
digitalWrite(inclockPin, 1); // Устанавливаем CLK в лог "1" и этем завершаем вывод данных.
Serial.print (temp); // Отправляем данные из TEMP по UART
}
Serial.println ("");
Serial.println ("--------");
delay(2000);
}

//**********************************************************************************

Теперь вариант кода посложнее с возможностью наращивать количество регистров 74hc165

///////////////////////////////////////////////////////////////////////////////////////
// Тест сдвиговых регистров 74hc165 для ввода состояния тумблеров //
// Version: 0.0.2.0 //
// Release: 12.02.2011 //
// Autor: alexval2007 //
// WEBSAIT: http://alexval2007.ucoz.ru //
///////////////////////////////////////////////////////////////////////////////////////
// КОННСТАНТЫ
#define NUMBER_OF_SHIFT_CHIPS 1 // Сколько регистров сдвига в каскаде.
#define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8 // Длина данных (сколько бит).
#define PULSE_WIDTH_USEC 5 // Импульс "загрузка/чтение" для 74HC165.
#define POLL_DELAY_MSEC 1 // Дополнительные задержки между регистрами сдвига при чтении.
#define BYTES_VAL_T unsigned int // Вам нужно будет изменить "Int" на "long" если у вас соеденено в каскад более двух регистров.
//*******************************************************************************************************************************************
i nt ploadPin = 7; // Соединение с контактом выбора режима. ввода/вывода 74hc165
int clockEnablePin = 9; // Подключение к разрешению Clk 74hc165
int dataPin = 5; // Подключение к Q7 чтение данных с 74hc165
int clockPin = 6; // Подключение к Clk 74hc165
BYTES_VAL_T pinValues; // Вам нужно будет изменить "Int" на "long" если у вас соеденено в каскад более двух регистров 74HC165.
BYTES_VAL_T oldPinValues; // Эта функция - по существу подпрограмма "shift-in" чтение последовательных данных от сдвигового регистра
// и представления состояния тех портов в целом числе без знака (or long).

byte bitVal; // Переменная хранения данных прочитаных из 74HC165.

//******************************************************************************************************************************************
B YTES_VAL_T read_shift_regs(){ // Функция чтения состояния входов 74HC165.
byte bitVal; // Переменная хранения данных прочитаных из 74HC165.
BYTES_VAL_T bytesVal = 0; // Триггер параллельной загрузки на защелку состояния линии данных.
digitalWrite(clockEnablePin, HIGH); // Устанавливаем лог "1" на выходе разрешения чтения с 74HC165.
digitalWrite(ploadPin, LOW); // Устанавливаем лог "0" на выходе загрузка/чтение для 74HC165.
delayMicroseconds(PULSE_WIDTH_USEC); // Импульс "загрузка/чтение" для 74HC165.
digitalWrite(ploadPin, HIGH); // Устанавливаем лог "1" на выходе загрузка/чтение для 74HC165.
digitalWrite(clockEnablePin, LOW); // Устанавливаем лог "0" на выходе разрешения чтения с 74HC165.
for(int i = 0; i < DATA_WIDTH; i++){ // Цикл чтения значения каждого бита с выхода последовательных данных 74HC165.
bitVal = digitalRead(dataPin); // Читаю состояние входа данных в переменную bitVal.
bytesVal |= (bitVal << ((DATA_WIDTH-1) - i)); // Установить соответствующий бит в bytesVal.
digitalWrite(clockPin, HIGH); // Тактовые импульсы (для сдвига следующего бита).
delayMicroseconds(PULSE_WIDTH_USEC); // Импульс "загрузка/чтение" для 74HC165.
digitalWrite(clockPin, LOW); // Устанавливаем лог "0" на выходе тактовых импульсов для 74HC165.
}
return(bytesVal);
}

void display_pin_values(){ // Функция отправки по UART текущего состояния входов 74hc165.
Serial.print("Pin States:\r\n"); // Отправляю по UART текст "Pin States:\r\n".
Serial.print(pinValues); // Отправляю по UART состояние 74hc165
Serial.print("\r\n"); // Отправляю по UART текст "\r\n".
}

void setup(){ // Инициализация
pinMode(ploadPin, OUTPUT); // Настраиваем ногу ploadPin на ВЫВОД
pinMode(clockEnablePin, OUTPUT); // Настраиваем ногу clockEnablePin на ВЫВОД
pinMode(clockPin, OUTPUT); // Настраиваем ногу clockPin на ВЫВОД
pinMode(dataPin, INPUT); // Настраиваем ногу dataPin на ВВОД данных
digitalWrite(clockPin, LOW); // устанавливаем начальное состояние порта clockPin
digitalWrite(ploadPin, HIGH); // устанавливаем начальное состояние порта ploadPin
Serial.begin(9600); // Устранвливаем скорость обмена по UART
pinValues = read_shift_regs(); // Читаем состояния входов 74hc165
display_pin_values(); // Отправляю по UART текущее состояния входов 74hc165.
oldPinValues = pinValues; // Сохраняем текущее состояние в переменую как преведущее сотояние oldPinValues
}

void loop(){ // Основной цикл
pinValues = read_shift_regs(); // Если состояние изменилось, то отображаем изменения.
if(pinValues != oldPinValues){ // Проверка изменилось ли сотояние входов 74hc165 по сравнению с преведущим если изменилось то
Serial.print("*Pin value change detected*\r\n"); // Отправляю по UART текст "Изменение состояния входа 74hc165 обнаружено"
display_pin_values(); // Отправляю по UART текущее состояния входов 74hc165.
oldPinValues = pinValues; // Сохраняем текущее состояние в переменую как преведущее сотояние oldPinValues
}
delay(POLL_DELAY_MSEC); // Дополнительная задержка между регистрами 74hc165 при чтении.
}

Ещё люди используют CD4021 Datasheet http://www.fairchildsemi.com/ds/CD/CD4021BC.pdf Схема


Код.

#define DATA 9
#define LATCH 8
#define CLOCK 7
#define CLKUS 1
byte dataInput;

void setup(){
pinMode(DATA,INPUT);
pinMode(LATCH,OUTPUT);
pinMode(CLOCK,OUTPUT);
Serial.begin(9600);
}

void loop(){
dataInput = 0;
digitalWrite(LATCH,HIGH); // Parallel mode
for (int i=7; i>=0; i--){
digitalWrite(CLOCK,HIGH);
delayMicroseconds(CLKUS);
dataInput |= (digitalRead(DATA) ? (1< digitalWrite(CLOCK,LOW);
delayMicroseconds(CLKUS);
if (i==7) digitalWrite(LATCH,LOW); // Serial Mode
}
Serial.println(dataInput, BIN);
delay(1000);
}

Если нужно два регистра то увеличиваем разрядность переменной, в которую читается состояние в два раза - с 8 до 16 бит, чтение выполняется за 16 тактов. В остальном - тоже самое. Ну, вот вроде все жду комментариев возможно дополнений и тп. Дополнительная информация на форуме: http://rln.nnov.ru/forum/viewtopic.php?t=239

Коды программ обновлены

 
Пиропульты - Электроника Форум » Электроника » Микроконтроллеры и ПЛИС » Расширение входов arduino (Сдвиговый регистр наоборот)
Страница 1 из 11
Поиск:


Rambler's Top100 Пиротехника, салюты, фейерверки. Яндекс цитирования
www.alexval2007.ucoz.ru © 2008