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 포트 설명하는 곳에서 “디지털 핀으로 사용할 때” 라는 항목이 있었다면 이 고생을 면했을텐데…