PIC16F627을 이용해서 자그마한 PIC 프로그래밍 회로를 만들다 1024워드의 한계를 경험하던 중에 이전에 사용하던 Wiz-c라는 c언어 pic툴을 벗어나 새로이 mikropascal이라는 pic언어를 만난다. 왠지 PIC라는게 컴퓨터보다 재미있다. 간단하고 직관적이라고 할까 조그만 칩으로 별별 장난을 다 칠 수 있다.
wiz-c보다 더 많은 PIC를 지원하고 코드 편집기가 정말 간편하다. wiz-c와 비교되어 큰 장점은 pic에서는 필수인 bit접근이 편리하다는 점이었다. 정말 매력적인 장점이 아닐 수 없다. wiz-c의 너무 짜여진 틀에서 벗어나게되어 정말 편하다는 생각도 들었다. 그런데 가장 큰 문제가 생겼는데 바로 wiz-c 하드웨어 usart를 인터럽트로 처리하던 것이 폴링(polling)으로 처리하게 되어 가끔 시리얼 포트의 응답이 느려지는 문제가 발생해버린 것. 결국 프로그램이 반응성이 좋지 않아져 응답을 가끔 기다리곤 했다. 만약 사용자라면 정말 답답하다고 느낄 정도의 문제였다.
결국 많은 문서들을 살피고 미리 구현된 RX만 인터럽트로 처리하는 소스를 봤지만 역시 처음보는 세계라 너무 어려웠다. 기술 문서가 있긴 하지만 정말 딱딱 이렇게만 하면 된다는 식으로만 정리되어 있는 내용들을 봤지만 예외에 대한 문제는 찾아낼 수 없었다. 그 황당한 예외 중의 하나가 대표적인 것이 프로그래밍 상태로 칩셋을 만드는 것이었는데 결국 반대 순서로 바꾸어서 제대로 동작하는 이상한 일도 있었다.
일단 삽질을 해가며 전송할 바이트를 밀어넣는 TXREG레지스터의 비었음을 알리는 TXIF라는 플래그를 열심히 이용했지만 아무리 해도 무응답하는 프로그램. 여차저차 실험해보고 삽질도 해보니 문제는 USART가 활성화된 후 처음 전송은 반드시 TXREG를 통해서 1바이트를 보내야 플래그가 제대로 세팅된다. 그리고 누락된 처리를 위해 tmr0나 tmr1등등의 타이머의 카운터 오버플로우도 사용해야 한다.
단 하나의 인터럽트 처리 부분은 $0004번지 주소에 가지는데 이 하나로 모든 인터럽트를 처리한다. mikropascal 내부에서는 procedure Interrupt; 라는 프로시저를 선언하여 사용하면 된다. mikro-c도 비슷한 방법을 사용한다.
TXIF 플래그가 비어있음 1로 셋팅되기 위해서는 TXREG를 통한 하드웨어 변경 밖에 안되므로 소프트웨어로 인터럽트를 관여하는 레지스터로 리셋하는 것은 불가능하다. 이를 무시하고 인터럽트 방식으로 TX를 처리하게 되면 처음에 1번의 전송은 인터럽트에서 반응이 없어서 결국 플래그를 두고 처음에 1번은 TXREG로 전송하게 했다.
자세한 구현 이야기를 적고 싶지만 아직 초보자인 나로서는 하나하나 설명하기 힘들다.
일단 만들어낸 PIC16F627의 하드웨어 USART를 이용한 구현 파일을 첨부한다. 유닛상태로 사용하면 조금 커서 최적화를 위해서는 implementation 부분을 copy&paste해서 메인 소스에서 사용하는게 좋다.
왜 만들었냐면 아무도 사용가능한 제대로된 구현을 공개하는 것을 찾을 수 없었다. 이는 라이브러리 공개 사이트인 libstock.com에도 공개되어 있다.
UART_INTR.rar