이번에는 PC와 TY52 보드간에 통신을 해 볼 차례이다. PC와 직렬 통신을 하게 되면, 단순히 키보드를 눌러서 TY52 보드에 있는 LED를 켜고 끌 수 있고, 키보드로 서보 모터를 좌우로 돌리게 할 수 있다. 또한 직렬 통신은 디버깅 도구로도 사용하는데, TY52 보드를 기반으로 어떤 자작품을 만들 때, 한 번에 꼭 성공한다는 보장은 없다. 이 때 직렬통신을 사용하면 TY52 보드에 어떤 데이터가 들어 있는지 PC에서 하이퍼 터미널(통신 프로그램)을 이용하여 눈으로 직접 확인이 가능하다.
8051 강좌에는 C 언어로 짜여진 직렬 통신 소스가 있는데, 여기서는 어셈블리어로 통신 소스를 만들어 보자. 아래는 timy 님이 8051 강좌란에 올려주신 어셈 소스인데, 약간 수정을 하였다. 아래의 소스를 실행시키고 하이퍼터미널 창을 띄우고 키보드 자판을 누르면 누른 값에 1을 더한 값이 출력된다.
하이퍼터미널 사용법은 기본 도구들 게시판에 설명되어 있습니다.
;--------------------------------------------------
;
; PC와 TY52 보드간의 직렬 통신 소스
;
;--------------------------------------------------
ORG 0000H
JMP START
ORG 0035H
START:
MOV SP, #50 ; 스택 포인터 설정
CALL SERIAL9600 ; 직렬 통신 설정
REP:
CALL RXDATA ; RXDATA로 분기
ADD A, #1 ; A 레지스터에 1을 더함
CALL TXDATA ; TXDATA로 분기
JMP REP ; REP로 점프하기 때문에 계속 순환되면서 직렬통신을 하게 된다.
;=====================================================================
SERIAL9600: ; 직렬 통신 설정 (직렬 통신을 하기 위해 설정해 주어야 할 것들)
CLR ET1 ; 직렬통신은 타이머1을 사용하는데 처음엔 타이머1을 사용불가로 설정
MOV TMOD, #25H
MOV SCON, #52H ; SERIAL MODE 1, REN=1, TI=1, RI=0
MOV PCON, #80H ; PCON.7=SMOD=1
MOV TH1, #243 ; TH1 = 243으로 설정하면 통신속도는 9600 이 된다.
SETB TR1 ; 타이머1 시작
RET ; 복귀
;=====================================================================
TXDATA: ; MCU -> PC로 데이터 전송
JNB TI, $ ; SCON 레지스터의 TI 비트가 1 상태가 아니면 제자리에서 맴돌다가 TI=1이 되면 아래의 코드 수행
CLR TI ; TI비트를 0으로 초기화 해 둠.
MOV SBUF, A ; A 레지스터에 저장된 데이터를 시리얼 버퍼로 이동
RET
;=====================================================================
RXDATA: ; MCU <- PC (MCU의 입장에서 보면 수신하는 동작)
JNB RI, $ ; RI = 0 이면 1이 될 때까지 기다림, PC에서 키보드를 누르면 RI값이 1로 변한다.
; JNB(Jump if direct Bit is not set 비트가 0이면 자기 주소로 계속 점프, 즉 제자리에서 무한루프)
MOV A, SBUF ; A <- SBUF, 수신된 1바이트를 A 레지스터에 저장
CLR RI ; 수신한 값을 A 레지스터에 저장했으므로 다음 데이터를 수신하기 위해 RI 비트를 0으로 해 놓음
RET ; CALL 명령으로 여기까지 왔으므로 다시 복귀함, RET(RETURN)
;=====================================================================
END ; 소스의 끝을 알리는 코드
--------------------------------------------
설명이 빠진 부분이 있는데, 후에 추가하도록 하겠습니다. (스택포인터 등등...아직 이해가 안되서^^;)
소스와 헥사 파일을 첨부하였습니다.^^