Что такое функция shiftOut() в Arduino. Как работает последовательная передача данных. Для чего нужны сдвиговые регистры. Как правильно подключить и использовать shiftOut() на практике.
Что такое функция shiftOut() в Arduino
Функция shiftOut() в Arduino используется для последовательной передачи данных побитно. Она позволяет отправлять один байт данных по одному биту за раз через указанный цифровой вывод.
Основные характеристики функции shiftOut():
- Передает 8 бит (1 байт) данных
- Использует два вывода Arduino — для данных и тактового сигнала
- Позволяет задать порядок передачи бит — от старшего к младшему или наоборот
- Часто применяется для управления сдвиговыми регистрами
Синтаксис функции выглядит следующим образом:
shiftOut(dataPin, clockPin, bitOrder, value)
Где:
- dataPin — номер вывода для передачи данных
- clockPin — номер вывода для тактового сигнала
- bitOrder — порядок передачи бит (MSBFIRST или LSBFIRST)
- value — передаваемое 8-битное значение (0-255)
Принцип работы последовательной передачи данных
Последовательная передача данных осуществляется путем отправки отдельных бит по одному проводу. Это позволяет передавать информацию, используя минимальное количество проводов.
Как происходит передача данных с помощью shiftOut():
- На вывод данных устанавливается значение первого бита (0 или 1)
- Генерируется тактовый импульс на clockPin
- Принимающее устройство считывает бит по переднему фронту тактового сигнала
- Процесс повторяется для остальных 7 бит передаваемого байта
Такой способ позволяет передавать данные, используя всего 2 провода, что очень удобно при ограниченном количестве выводов микроконтроллера.
Зачем нужны сдвиговые регистры
Сдвиговые регистры — это цифровые микросхемы, которые позволяют преобразовывать последовательные данные в параллельные. Они часто используются совместно с функцией shiftOut() для расширения возможностей микроконтроллера.
Основные преимущества использования сдвиговых регистров:
- Увеличение количества выходов микроконтроллера
- Возможность управлять большим числом устройств через всего 3 вывода Arduino
- Упрощение схемы при работе с многосегментными индикаторами, светодиодными матрицами и т.п.
- Снижение нагрузки на выходы микроконтроллера
Популярным сдвиговым регистром является микросхема 74HC595, которая позволяет управлять 8 выходами через 3 входа. Несколько таких микросхем можно объединять каскадом для еще большего расширения.
Подключение и использование shiftOut() на практике
Рассмотрим базовую схему подключения сдвигового регистра 74HC595 к Arduino:
- Vcc (питание) — подключаем к 5V Arduino
- GND (земля) — подключаем к GND Arduino
- DS (вход данных) — подключаем к выводу 11 Arduino
- STCP (защелка хранения) — подключаем к выводу 12 Arduino
- SHCP (тактовый вход сдвигового регистра) — подключаем к выводу 13 Arduino
- OE (выход разрешен) — подключаем к GND для постоянной активации выходов
Пример кода для управления светодиодами через сдвиговый регистр:
const int dataPin = 11; // DS
const int latchPin = 12; // STCP
const int clockPin = 13; // SHCP
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop() {
// Включаем светодиоды поочередно
for (int i = 0; i < 256; i++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, i);
digitalWrite(latchPin, HIGH);
delay(100);
}
}
Этот код последовательно включает светодиоды, подключенные к выходам сдвигового регистра.
Особенности использования MSBFIRST и LSBFIRST
Функция shiftOut() позволяет задавать порядок передачи битов - от старшего к младшему (MSBFIRST) или от младшего к старшему (LSBFIRST). Выбор зависит от конкретной задачи и подключаемого устройства.
MSBFIRST (Most Significant Bit First):
- Передача начинается с самого старшего (левого) бита
- Пример: число 170 (10101010 в двоичной системе) будет передаваться в порядке 1-0-1-0-1-0-1-0
- Часто используется в протоколах связи и при работе с дисплеями
LSBFIRST (Least Significant Bit First):
- Передача начинается с самого младшего (правого) бита
- Пример: число 170 (10101010 в двоичной системе) будет передаваться в порядке 0-1-0-1-0-1-0-1
- Может применяться в некоторых специфических устройствах и протоколах
Выбор правильного порядка передачи битов критически важен для корректной работы устройства. Неправильный выбор приведет к искажению передаваемых данных.
Оптимизация скорости работы shiftOut()
Стандартная реализация функции shiftOut() в Arduino не отличается высокой скоростью работы. Для некоторых применений это может стать ограничением. Существует несколько способов оптимизации:
- Использование встроенного аппаратного SPI вместо программной реализации shiftOut()
- Применение техники прямого управления портами (port manipulation) для более быстрого переключения выводов
- Использование ассемблерных вставок для критичных участков кода
Пример оптимизированной версии shiftOut() с использованием прямого управления портами:
void fastShiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t val) {
uint8_t i;
for (i = 0; i < 8; i++) {
if (!!(val & (1 << (7 - i))))
PORTD |= _BV(dataPin);
else
PORTD &= ~_BV(dataPin);
PORTD |= _BV(clockPin);
PORTD &= ~_BV(clockPin);
}
}
Такая реализация может работать в несколько раз быстрее стандартной функции shiftOut().
Применение shiftOut() в реальных проектах
Функция shiftOut() находит широкое применение в различных Arduino-проектах. Вот несколько примеров использования:
- Управление многоразрядными семисегментными индикаторами
- Создание бегущих огней и световых эффектов на светодиодных лентах
- Управление матрицами светодиодов для отображения текста или графики
- Расширение возможностей Arduino при работе с большим количеством датчиков или исполнительных устройств
- Создание простых цифровых систем управления с множеством выходов
Пример использования shiftOut() для управления 4-разрядным семисегментным индикатором:
const int dataPin = 11; // DS const int latchPin = 12; // STCP const int clockPin = 13; // SHCP byte digits[10] = { B00111111, // 0 B00000110, // 1 B01011011, // 2 B01001111, // 3 B01100110, // 4 B01101101, // 5 B01111101, // 6 B00000111, // 7 B01111111, // 8 B01101111 // 9 }; void setup() { pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { for (int i = 0; i < 10000; i++) { displayNumber(i); delay(10); } } void displayNumber(int num) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, digits[num / 1000]); shiftOut(dataPin, clockPin, MSBFIRST, digits[(num / 100) % 10]); shiftOut(dataPin, clockPin, MSBFIRST, digits[(num / 10) % 10]); shiftOut(dataPin, clockPin, MSBFIRST, digits[num % 10]); digitalWrite(latchPin, HIGH); }
Этот код позволяет отображать числа от 0 до 9999 на 4-разрядном семисегментном индикаторе, подключенном через сдвиговые регистры.
아두이노 강좌 #19 Shiftout () 함수 파헤치기 :: Blacklog
아두이노 시리얼 인터페이스 를 가진 장치 를 제어 하기 위해 Shiftout () 함수 사용 할 수 있습니다. shiftOut() включает в себя SPI для передачи данных, Программное обеспечение для проверки программного обеспечения. 본 포스트에서는
shiftOut() 함수 사용 방법 및 실제 전송되는 파형
에 대해 작성하였습다.시리얼 인터페이스
많은 칩들이 인터페이스 를 가지고 있어, 아래 와 같은 시리얼 인터페이스 장치 제어 하기 위해 위해 함수 를 하여 제어 또는 통신 할 수 있습니다 있습니다.
타이밍 다이어그램 (좌) DS1302 : RTC , (우) 74HC595 : ShiftResistor0009
shiftOut() 함수 정의
Shiftout() 함수는 한 바이트의 데이터를 한번에 한 비트씩 출력합니다. shiftout() 함수에 사용되는 핀은 출력 포트로 설정 되어야 합니다.
Syntax
- shiftOut(dataPin, clockPin, bitOrder, value)
Parameters
- datapin : 데이터 핀 번호, 해당 핀은 출력 포트로 설정 되어 있어야 함
- clockpin : 클럭 송신 번호, 해당 핀은 출력 포트로 설정 되어 있2어9야 031 90 031 00029 bitOrder : BSBFIRST or LSBFIRST
- MSBFIRST : 높은 비트 순서
- LSBFIRST : 낮은 비트 순서
- value : 송신할 데이터 (datatype : byte)
Returns : 반환 값 없음
Example
- shiftOut(7, 6, MSBFIRST, 255) : 6번 포트를 CLK, 7번 포트를 DATA 핀 설정하여 255값을 시리얼 출력
MSB 와 LSB
아래 과 같이 바이트 를 비트로 표현 하는 경우 왼쪽 의 비트 를 를 msb (наиболее значимый бит, 최상위 비트), 오른쪽 의 를 를 lsb (наименьшее значительное бит, 최하위 비트) 라고 부릅니다.
MSB 와 LSB
Shiftout () 함수 의 파라미터 MSBFirst 와 LSBFirst 는 전송 데이터 의 순서 를 MSB, LSB 어느 을 먼저 보낼지 결정 파라미터 파라미터 입니다 입니다.
Shiftout () 사용 예시 와 파형
Shiftout () 함수 동작 알아보기 위해 아래 와 같이 회로 를 구성 하고 코드 에 파형 이 변하는지 확인 확인 해 보겠습니다.
회로 도 연결 연결
Shiftout () 회로 테스트 하기 위해 그림 과 같이 D3, D4 핀 에 2,2 кОм 풀 저항 을 연결 하고, 오실로 스코프로 측정 하여 하여 에 에 풀 저항 연결 연결 하고 하고, 스코프로 측정 하여 하여 하여 하여 하여 어떻게 되는지 연결 Shiftout () 함수 지정 되는 클럭핀 과 데이터핀은 지정 되어 있지 않고, 아두이노 사용 되는 모든 핀 에 적용이 가능 합니다.
코드1 : MSBFIRST 방식
아래 그림 은 은 msbfirst 방식 으로 십진수 85 의 을 을 Shiftout () 함수로 데이터 출력 오실 로 스코 프로 측정 한 파형 입니다. 십진수 85 의 값이 2진수 0x01010101 의 순서로 데이터에 전송 되는 것을 확인 할 수 있습니다. 데이터가 송신되지 않는 동안 전원이 HIGH 값을 유지 하는 이유는 전송된 마지막 데이터가 1셌닸랰 이터가 1셌랰 по умолчанию HIGH 로 유지 하는 것은 아닙니다.
Shiftout (D4, D3, MSBFirst, 85) 코드 의 파형
코드 2: lsbfirst 방식
아래 의 은 은 은 방식 방식 후 스코 스코 후 후 후 후 후 후 스코 후 오실 출력 후 후 출력 후 후 오실 출력 출력 스코 출력 출력 출력 입니다. Декабрь 85 의 은 은 bin 0b010101011 이지만, lsbfirst 방식 전송 하여 역순인 1,0,1,0,1,0,1,0 데이터 으로 전송 것 을 할 수 수 있습니다.
Shiftout (D4, D3, Lsbfirst, 85) 코드 의 파형
Shiftout () 속도
본 에서 사용 한 보드는 arduino uno 보드로 보드로 보드로 보드로 보드로 보드로 보드로 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 가 경우 가 가 가 가 경우 경우 가 가 경우 경우 경우 кГц 로 약 15us 의 주기를 가집니다. 더 빠른 데이터 전송을 위해서는 SPI 하드웨어 핀을 사용하거나, 직접 AVR 코딩을 해야 합니다. SPI는 이후에 따로 포스트를 준비할 예정이고, AVR 코딩 방식은 아두이노 카테고리에서는 다루악다루악 다루앞.
Shiftout () 의 클럭 스피드
부록: shiftout () 내부 함수
Shiftout () 함수 는 는 는 는 있습니다 있습니다 있습니다 있습니다 있습니다 있습니다 있습니다. 코드 내부를 보면 단순히 digitalWrite() 함수를 사용하여 시리얼 출력 하는 데이터를 만든 것으로 확인 닐. 이 코드를 응용하여 16bit 또는 32bit shiftOut() 함수를 만들 수 있습니다.
Shiftout () 함수 정의
참고 로 Если 문의 !! (val & (1 << i)) 코드는 아래 그림 과 표 와 같이 가 0 에서 7 까지 하는 순서 에 따라 lsb 부터 1 비트씩 마스킹 마스킹 마스킹 마스킹 에서 까지 증가 순서 하는 연산입니다.
비트 연산 val & (1
shiftout () 함수 내부 코드 를 보기 위해 직접 파일 을 열어 수 도 있지만 있지만, Код визуальной студии 에디터 사용 하여 내부 코드 구성 을 확인 수 있습니다 있습니다. 사용 하여 아두이노 하는 방법 이 필요 하신분 은 하단 의 링크 를 참조 해 주세요.
마무리
본 에서 아두이노 의
Shiftout () 함수 사용법, 예제, 송신 파형 코드 코드
알아 보았습니다. 0005끝까지 읽어주셔서 감사합니다.
저작자표시 비영리 변경금지
«Встраиваемый > Arduino» 카테고리의 다른 글
아두이노 강좌 #22 7-SEGMENT FND 기본 동작 원리 (0) | 2020.08.15 |
---|---|
아두이노 코딩 : 74HC595로 7-Segment (FND) 제어하기 with 키보드 (0) | 2020.08.09 |
아두이노 강좌 #21 Shift Register 74HC595 로 LED 점멸하기 (1) | 2020.08.09 |
아두이노 강좌 #20 시프트 레지스터 74HC595 내부 구조 및 동작 원리 (2) | 2020.08.08 |
아두이노 코딩: DS1302 RTC 시간 기록하고 불러오기 (2) | 2020.08.07 |
Доп. | 2020.08.06 |
아두이노 코딩 : 타이머 인터럽트로 7-세그먼트 카운트 (5611AH) (0) | 2020.08.05 |
아두이노 코딩 : I2C Character LCD 한 줄 고정, 한 줄 스크롤 하기 JHD-162A (0) | 2020.08.05 |
Практическое руководство по сдвиговым регистрам
Хорошим местом для начала экспериментов со сдвиговым регистром 74HC595 является управление семисегментным дисплеем. Это дает нам некоторые ценные уроки относительно управления сдвиговыми регистрами и светодиодными дисплеями. Чтобы узнать больше о том, как подключить семисегментный дисплей, прочитайте нашу другую статью: Семисегментные дисплеи
Триггер
Сдвиговый регистр представляет собой набор схем триггеров, каждый триггер имеет 1 бит памяти. Наш 75HC595 имеет 8 из них, поэтому он имеет 8 бит или 1 байт памяти. Память хранит последнее состояние, которое вы в нее ввели, поэтому вам не нужно постоянно обновлять свой регистр сдвига, он сохранит последнее известное состояние (1 или 0), которое вы ввели. Однако это не является постоянным, поэтому сброс питания сотрет состояние.
Память отображается точно на ваши выходные контакты. Таким образом, 01100101
будет отображаться следующим образом (мы начинаем считать с Q0)
Последовательный вход, параллельный выход
74HC595 также является сдвиговым регистром «Последовательный вход, параллельный выход». Это означает, что вы отправляете свои данные последовательно, то есть короткими импульсами на свой чип. Вы отправляете свои входные импульсы на DS
(или в некоторых даташитах SER
) штырь.
Latched
Импульсы, которые мы отправляем на наш чип, сдвигаются на 1 позицию каждый раз, когда вы импульсируете свой тактовый вывод регистра сдвига (помеченный SH_CP
или иногда SRCLK
). Это означает, что если мы дадим ему 1
в качестве нашего первого входного импульса, а затем 7 раз пропульсируем наши часы с 0
в качестве входного сигнала, мы получим 00000001.
10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001
Latched также означает, что наш ввод буферизуется перед фактическим выводом, в противном случае со схемой без фиксации вы бы визуально увидели изменение выходных контактов 1. Пока вывод ST_CP
(или иногда RCLK
) удерживается низким
, мы сохраняем наши входные данные в буфере, когда мы устанавливаем вывод высоким
, значения в буфере фиксируются в регистре хранения, который затем выводится на выходные контакты (от Q0
до Q7
)
Наши часы регистра сдвига SH_CP
запускают импульс на восходящем фронте, в этот момент он смотрит на значение на своем выводе данных DS
. Вот почему вы видите небольшой сдвиг во времени ввода данных
по сравнению с часами регистра сдвига.
Q7S и регистры сдвига в цепочке
Вывод Q7S
на сдвиговом регистре — это специальный выходной контакт, который выводит данные переполнения. Это позволяет вам объединять несколько сдвиговых регистров вместе, позволяя подключать до 64 регистров через 3 порта. Например, если вы введете 00000000 00000001
для 2 связанных сдвиговых регистров ввод будет следующим:
10000000 00000000 01000000 00000000 00100000 00000000 00010000 00000000 00001000 00000000 00000100 00000000 00000010 00000000 00000001 00000000 // Q7S PIN ПЕРЕПОЛНЯЕТ 1 ДЛЯ СЛЕДУЮЩЕГО РЕГИСТРА СМЕНЫ 00000000 10000000 00000000 01000000 00000000 00100000 00000000 00010000 00000000 00001000 00000000 00000100 00000000 00000010 00000000 00000001
Для этого подключаем SH_CP
и ST_CP
второго регистра сдвига вместе с первым, таким образом оба регистра сдвига имеют синхронизированные часы. Остальная часть находится в коде.
Подключение сдвигового регистра
Нам нужно всего 3 цифровых контакта на Arduino для управления нашим сдвиговым регистром. Соединяем наши пины Arduino 8
с SH_CP
(зеленый провод), 9
с ST_CP
(оранжевый провод) и 10
с DS
(фиолетовый провод).
Также соединяем наши OE
и GND
к нашему arduino GND
(черный провод) и подключаем наш блок питания VCC
к arduino 5V
(красный провод).
Теперь вы можете использовать клеммы Q0 - Q7
в качестве выходных контактов и подключить к ним, например, семисегментный дисплей (прочитайте наш учебник по семисегментному дисплею здесь)
Подключение нескольких сдвиговых регистров
наше количество выходов мы просто подключаем выходной порт Q70
к следующим сдвиговым регистрам DS
, мы также подключаем ST_CP
и SH_CP
и меняем наш код (см.