MotorControl 수신부

수신부 회로도를 정리했다. 테스트를 위해 달았던 군더더기를 싹 제거하고 업무에 필요한 기능만 남겼다. 케이스 제작을 위해 기봉에게 회로도 보내고, 지그비 모듈을 주문했다. 이번에는 칩 안테나 타입이 아닌, 바 타입 안테나를 사용하는 지그비 모듈이다. 케이스 바깥으로 지그비 안테나를 뺄 수 있게 할 예정이다.

PIC 16F526, 아 이런 초기화 할게 또 있다..

디지털 I/O를 사용하기 위해 초기화 해야할게 또 있었다.

으휴… 첨에는 되는 것 처럼 보이더니 조금 지나자 출력핀의 전압이 어중간하게 나타났다.

 다시 이 놈이다. Table 6-3: I/O PINS ORDER OF PRECEDENCE 는 PortB 와 PortC의 우선순위에 관한 설명이다.

기본 값으로 첫번째 줄이 배정되고 그것을 해지 했을 때 다음 순위로 넘어 가는 것 같다. ADCON0 레지스터의 AN0, AN1 값(7번과 6번 비트)을 클리어 해서 AN0, AN1을 끄니 PortB는 디지털로 바뀌었다.

PortC도 같이 변한 줄 알았는데 PortC는 그대로 있었다. OPTION 레지스터에서 T0CS(5번 비트)를 끄면 RC5가 살아났다.
그래서 다른 것도 같이 되는 줄 알았다.
왜냐하면 그 레지스터의 설명에는 그것 밖에 없었으니까.
그런데 또 RC0, RC1, RC2에서 어중간한 값이 나왔다.
C2IN+, C2IN-, CVref, C2out이 문제인것 같다.
이 것들은 ADC와 비슷한 컴퍼레이터2 다.

컴퍼레이터가 2개 있으니까 그 중 2번째 컴퍼레이터.
데이터시트에서 컴퍼레이터 항목을 찾아보니 CM1CON0, CM2CON0 레지스터가 있다.
지금 해결할 것은 2번 컴퍼레이터니까 CM2CON0 을 바꿔야한다.
역시나 비트 3번에 C2ON 이 있다.
기본 값으로 C2ON은 세팅(1)되어있고 그 뜻은 “Comparator is on”이다.
CM2CON0은 W 레지스터 거치지 않고 직접 읽고 쓰기가 가능하다.
3번 비트인 C2ON을 클리어 하는 명령을 프로그램 초반에 배치했다.
컴퍼레이터 기능이 꺼지면 2번 컴퍼레이터와 관계된 C2IN-, C2IN+, CVref, C2out이 다 꺼진다.
그러므로 PortC는 모두 디지털로 활성화된다.

그러고 보니 CM1CON0에서도 C1ON을 꺼두는 것이 좋겠다. 지금까지의 테스트에서는 CM1CON의 C1ON을 끄지 않고도 잘 동작했지만 표 6-3을 보니 PortB의 2순위가 컴퍼레이터1 이다. 혹시 모르니 초기화 코드에서 CM1CON의 C1ON도 함께 끄도록 해야겠다.

으으… 데이터시트의 I/O 포트 설명하는 곳에서 “디지털 핀으로 사용할 때” 라는 항목이 있었다면 이 고생을 면했을텐데…

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개 포트로 무한대의 출력 포트를 사용할 수 있게 된다.
– 뭐, 무한대까지나 사용할까마는…