코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-01-23 10:13:15
플립플롭(flip-flop) 또는 래치(latch)라고도하는, 0과 1만을 갖는 1비트 값을 저장할 수 있는 기본 회로가 있습니다.
레지스터란 이런 플립플롭을 여려 개 일렬로 연결하여, 여러 비트로 구성한 2진수를 저장할 수 있게 한 것을 말합니다.
이 예제에서 사용된 8bit 시프트 레지스터는 8개의 플립플롭이 연결되어 있으며, 단방향 또는 양방향으로 매 클럭펄스마다, 한 플립플롭 씩 저장된 값을 좌우로 이동시킬 수 있는 레지스터입니다. 여기서 클럭 펄스란 일정한 간격을 갖는 전기적 펄스로 회로내의 동작을 동기화하는데 사용됩니다. (전기적 펄스에 대한 내용은 2.3 아날로그와 디지털, 2.4 펄스 폭 변조를 참고합니다.)
시프트레지스터의 용도로서 대표적인 것은 데이터의 직렬-병렬변환(SIPO : Serial In Parallel Out)으로 직렬입력으로 다중 출력을 만들어 낼 수 있습니다. 이 예제에서는 오렌지보드의 핀 3개를 사용하여 8개의 LED 를 제어 해 봅니다.
시프트 레지스터는 핀마다 고유의 기능이 있으므로 연결시 방향에 주의 합니다.
홈이 파진 부분을 위로 향하게 했을때를 기준으로 좌측 상단에 있는 핀이 1번 핀이 되며, 총 16개의 핀으로 구성되어 있습니다.
NO | 부품명 | 수량 | 상세설명 |
1 | 오렌지 보드 | 1 | |
2 | 시프트 레지스터 | 1 | SN74HC595N |
3 | LED | 8 | LED 색상 무관 |
4 | 브레드 보드 | 1 | |
5 | 점퍼케이블 | 18 |
부품명 | 오렌지 보드 | 시프트 레지스터 | LED | 브레드 보드 | 점퍼케이블 |
파트 |
1. 오렌지보드의 5V핀을 브레드보드의 +버스에 연결합니다.
2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.
3. 시프트 레지스터를 그림과 깉이 홈이 위로가게하여, 양쪽 IC영역에 걸치도록 꽂습니다.
4. LED 8개를 캐소드(짧은 단자)가 반대쪽의 -버스에 연결되도록 꽂습니다.
5. 각 LED의 애노드(긴 단자)에 330Ω 저항을 연결합니다.
6. 시프트 레지스터의 15, 1, 2, 3, 4, 5, 6, 7번핀을 8개의 LED 애노드에 각각 연결합니다.
7. 시프트 레지스터의 8번핀과 13번을 -버스에 연결합니다.
8. 시프트 레지스터의 10번핀과 16번핀을 +버스에 연결합니다.
9. 시프트 레지스터의 12번핀을 오렌지보드 2번핀에 연결합니다.
10. 시프트 레지스터의 11번핀을 오렌지보드 3번핀에 연결합니다.
11. 시프트 레지스터의 14번핀을 오렌지보드 4번핀에 연결합니다.
12. 8개의 LED 캐소드가 연결된 -버스를 오렌지보드 GND와 연결된 -버스와 연결합니다.
TIP
MSBFIRST - Most Significant Bit First의 약자로 가장 중요한 비트(자릿수가 가장 큰 왼쪽) 라는 뜻입니다.
LSBFIRST - Least Significant Bit First의 약자로 가장 중요도가 낮은 비트 먼저(자릿수가 가장 낮은 오른쪽) 라는 뜻입니다.
비트연산자(>>, <<)
시프트레지스터는 1비트씩 제어를 통해 여러 핀을 동시에 제어하게되는데 이때 비트를 제어하기 위해서는 비트연산자를 사용합니다.
위 코드에서는 비트이동연산자라고 불리는 <<, >>를 사용합니다.
<<는 왼쪽으로 비트를 이동하라는 명령어이고
>>는 오른쪽으로 비트를 이동하라는 명령어입니다.
예를 들어 1<<2라면 1을 왼쪽으로 2칸 이동하라는 의미로 결과값은 100이 출력됩니다.
이동하면서 생기는 공간은 0으로 채워집니다.
주의할 점은 8<<1이라해서 8이 한 칸 왼쪽으로 이동해서 80이 되는것이 아닌 비트는 이진수 단위이기 때문에
8을 이진수로 변환하면 0b1000이고 그래서 결과값은 0b1000이 왼쪽으로 한 칸 이동한 0b10000 = 16이 됩니다.
결국 왼쪽으로 한칸씩 이동할때마다 원래값에서 x2가 된다고 이해가 되면 편합니다.
반대로 오른쪽으로 한칸씩 이동하면 /2가 됩니다.
코드실행
코드에서는 for문에 의해 i값이 0부터 7까지 증가하고 증가한 값만큼 1의 비트가 왼쪽으로 이동합니다.(1<<i)
따라서 위의 코드를 실행하면 다음과 같은 LED의 깜빡임을 볼 수 있습니다.
※ 아래의 영상은 위 코드에서 LED의 깜빡임 delay()수치를 조정하였습니다.
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!