HEF4094, LED Control 보드에 사용

2015.0806 HEF4094 LED 보드

HEF4094 Shift Register를 사용해 LED 컨트롤 보드를 만들었다.
LED는 Red/Green 2-tone으로 8개를 사용했다.
미디 컨트롤러에 사용 할 채널 Mute 상태 표시 LED다.
외부와의 커넥터는 GND, VCC, STR, CP, D 이렇게 5개다. 전원을 제외하면 3가닥으로 컨트롤 하는 거다.

* STR은 데이터의 입출력
* CP는 클럭
* D는 데이터
* 데이터는 MSB(최상위 비트, 제일 왼쪽) 부터 전송한다. -> 데이터가 bit0 에 채워져서 왼쪽으로 쉬프트 된다.
* 클럭이 Low에서 세팅하고 High 일때 Read 한다.
* STR은 High에서 Input, Low일 때 Output 된다.


// Arduino에서 데이터 출력하는 코드
digitalWrite(STR, HIGH);
shiftOut(DataPin, ClockPin, MSBFIRST, data);
digitalWrite(STR, LOW);

HEF4094, 3-wire 시리얼 형식 데이터 전송으로 출력포트 확장하기

HEF4094는 시리얼 데이터 형식으로 데이터를 전송한다. 여러개 연결해서 사용할 수도 있으니까 적은 수의 출력 포트를 원하는 만큼 확장해서 사용할 수 있다. 이번에 사용한 것은 PIC의 3개 단자를 사용해 8개 출력을 만들었다. 8개 출력은 FND에 연결해 테스트했는데 데이터 내용을 정리하면 HD44780 같은 2라인 캐릭터 디스플레이 장치에 사용할 수도 있다.
HEF4094와 비슷한 역할을 하는 것은 74HC595가 있고 이것과 반대로 병렬입력하여 시리얼 출력하는 74HC165도 있다.
HEF4094에 대한 다른 사람들의 자료를 찾아 보았는데 사용법이 상세하게 나와 있는 것이 없었다. Philips의 데이터시트에는 복잡한 설명이어서 좀 더 쉬운 설명이 필요했던거다. 네이버 카페와 NXP의 데이터시트에서 발견한 것이 다음과 같은 내용이다. 입력하는 것 보다 메모가 빨라서 급하게 썼다. ^^

CLK이 High로 바뀔 때 Data를 읽는다. 데이터는 하위비트에 채우고, 다음 데이터를 읽을 때 상위 비트로 쉬프트 하고 읽는다. STR이 High로 바뀔 때 Buffer에 저장된 값을 출력한다.
Shift 레지스터가 있고, Store 레지스터가 있고 출력 Register 가 있다. 클럭이 High 될 때마다 데이터를 계속 Shift 하면서 읽고 STR이 켜지면 Shift 레지스터에 있는 것이 Store에 들어간다. OE가 켜지면 Store Register의 값이 출력 Register 로 옮겨지고 외부 출력된다. OE 포트를 사용할 수도 있는데 OE가 켜지면 출력이 활성화 된다.
OE를 항상 켜 놓고 쓰면 STR 하는 순간에 바로 출력된다. FND를 연결해 놓았다면 OE를 껐다 켰다 하면서 FND를 블링크 할 수도 있겠다. (확인하지 않았다)
이론은 이런 것인데, 그 시간 간격을 얼마나 해야 적당할지를 결정해야 한다. 데이터시트 내용을 이리저리 읽어보고 정리한 결과다. – 이게 맞다!! 라는게 아니라 이런 것 같다~ 라는거다. – 이거 믿고 따라하는 것에 대해서 책임 못진다. 나는 이렇다는거다.. 비굴~

데이터가 먼저 변한 상태에서 클럭이 High로 바뀔 것. 데이터가 변한 상태에서 클럭이 High로 바뀌기 전에 30ns를 유지할 것. 클럭이 High인 상태가 30ns는 유지할 것. 데이터 전송이 끝나고 STR을 켰을 때 클럭의 4배 정도는(2 클럭이 지나는 시간) 유지할 것.



이게 끝 부분 모습
간격에 대한 스펙에서 Typ. 시간보다 min 값이 더 크면 최소값이 맞기는 한건가.. 싶은게 이해가 안된다. 이게 맞나 싶기는 한데… 하여튼 이런 결과를 바탕으로…

나는 이렇게 정리했다.

클럭 보다 데이터 시간을 길게해서 클럭이 High 인 동안에는 Data 변화가 생기지 않도록 한다.
1. 10개 여유를 보내고,
2. 데이터 변경 (High일때 변경, Low라면 그대로)
3. 20개 여유를 보내고 (30ns가 필요한데 20ns 정도만 세팅했다)
4. 클럭을 High로 변경 (데이터가 전송됨)
5. 30개 여유를 보냄
6. 클럭을 Low로 바꿈 (데이터 전송 마침)
7. 데이터를 Low로 바꿈 (High 상태였다면 Low로, Low였다면 그대로)
이렇게 1번~7번을 8번 반복하면 8비트가 전송되어 Shift Register에 들어있다.
전송 후 STR 을  High로 바꾸고 60개 정도 여유를 보낸다.
그려면 1 Byte 데이터가 출력포트에 나타난다.
데이터 전송은 보내고자 하는 Byte의 상위비트(7번)부터 보낸다.
받는 쪽은 0번 부터 저장하지만 Shift되면서 상위비트는 상위비트로 옮겨지고 최종 들어온 비트가 최하위 비트가 된다.
출력측 디바이스의 3개 포트로 총 8개 출력 포트를 사용할 수 있다.
HEF4094의 O’s, Os 포트를 사용해서 여러개의 HEF4094를 연결해 사용할 수 있으므로
출력측 디바이스의 3개 포트로 무한대의 출력 포트를 사용할 수 있게 된다.
– 뭐, 무한대까지나 사용할까마는…

리모콘 파트 만들기

지그비 통신의 리모콘 파트를 만들었다.
메인 CPU는 PIC16F526를 선택했다.
일단 집에 있는 것 중에서 골랐고, 10원이라도 더 싼 것으로 골랐다.
채널 Up/Down 을 위해 입력을 2군데로 받고
FND 출력을 위해 HEF4094 를 연결했다.
PIC와 HEF4094는 3가닥으로 연결된다.
PIC에서 지그비 모듈로 연결하는 것도 3가닥을 사용한다.
PIC와 외부모듈과의 연결은 모두 8개가 필요하다.
12F675 같은 8핀은 사용하지 못하고 그 다음으로 작은 14핀 PIC 중에서 골라야 했다.
16F526은 내부클럭을 사용할 수 있고 전원과 접지를 제외하면 12개 I/O를 사용할 수 있다.
12개 중에서 외부 모듈과의 연결에는 8개만 사용하므로 ICSP를 위한 단자는 중복되지 않게 사용할 수 있다.
ICSP 6개 핀 중에서 2개는 전원과 접지, 하나는 사용하지 않는 핀이니까 I/O 단자는 3개만 사용한다.
12개 중에서 8개는 외부 칩과 연결, 3개는 ICSP에 연결하고 하나가 남는다.
이것은 PIC 동작 확인을 위한 LED를 연결한다.
I/O 포트를 놀리지 않고, ICSP를 위한 연결까지 충분하게 사용했다. ^^
이제 프로그래밍 단계가 남았다.
FND 대신 2-Line Display를 사용해도 좋겠다.
HEF4094까지는 그대로 사용하고 프로그래밍만 손보면 HD44780 디스플레이로 바꿀 수 있다.
Display쪽으로 출력이 가능하도록 단자를 만들어 두어야겠다.