Serial Communication in 8051 [ 8051 시리얼 (직렬) 통신] 8051 칩을 PC와 연결하여 사용하려면 통신에 대한 기본적인 지식을 알아야 합니다. 오늘은 간단하게 805···blog.naver.com
위 포스팅에서 시리얼 통신이 무엇인지에 대해 배우고 오늘 포스팅을 이해하는 데 필요한 기초 지식을 실었습니다. 8051에는 한 쌍의 직렬 포트가 있습니다. P3.0의 RXD0, P3.1의 TXD0입니다.
RXD, TXD로 말하지 않고 0을 뒤에 붙인 이유는 조금 개량된 칩 DS89C4x0시리즈는 2반 직렬 포트를 가지고 있기 때문입니다.우선 P3.0과 P3.1이 RX와 TX인 것은 마찬가지입니다.RX는 전의 포스팅에서 말했듯이 receive, TX는 transmitt을 의미합니다.P3.1에는 외부에 적어 주는 데이터를 보내야 하며 P3.0에서는 데이터를 읽어야 합니다.?8051내에는 UART칩이 있다고 했는데 이 칩은 P3.0과 P3.1에 이어지고 있습니다.이 칩은 진동수를 28,800에 맞추는 역할뿐만 아니라 비동기 통신 방식으로 Start bit과 stop bit을 인식하고 제거한 순수 데이터를 CPU에 전달 역할도 합니다.혹은, 아스키 코드를 이 칩에 보내면, 스스로 startbit과 stopbit을 추가하고 송신하고 주는 등 통신에서 잡다한 일을 직접 처리합니다.
지난번 포스팅한 대로 타이머의 mode2(autore-load 8 bit timer)를 사용해 진동수를 조절할 수 있습니다. TH1에 적어주는 값으로 어떤 속도로 통신할지 선택할 수 있습니다. 두 디바이스를 직렬통신으로 연결 시 두 디바이스의 Baudrate가 동일해야 송수신이 가능합니다.
SBUF 레지스 터 (시리얼) 버펄레지스타)
8051 안에는 SBUF라는 레지스터가 있습니다. 8비트 레지스터에서 직렬 통신에 사용되는 레지스터입니다. 송신하거나 수신하는 데이터를 일시적으로 저장하기 위한 SFR입니다. 송신 및 수신에서 공동으로 사용하는데, 송신 SBUF와 수신 SBUF가 따로 2개 존재합니다.
MOV SBUF, #’D’MOV A, SBUF
예를 들면, 상기의 코드는 송신 SBUF에 아스키 코드”D”를 보낸 것입니다.MOVA, SBUF는 만약 외부에서 받은 데이터가 있으면 그 데이터를 A에 옮기명령입니다.SBUF에 데이터를 넣으면 자동적으로 UART로 옮겨졌으며 UART에서 잡다한 처리를 한 뒤 serial port로 옮기겠습니다.외부 처음부터 데이터를 받으면 UART에 먼저 들어가게 되고 UART는 startbit과 stopbit을 제외한 순수 데이터를 SBUF에 넣습니다.결국 8051을 통해서 데이터를 전송하려면 SBUF에 써야 합니다.자세한 동작은 이하에서 배우고 봅시다.SCON레지스터(Serial control register)
이름부터 Serial control register 입니다. TCON 레지스터와 비슷한 역할을 하죠?8비트 SFR에서 각각의 비트가 어떤 역할을 하는지 알아봅시다.먼저 SM0과 SM1, serial port의 mode를 결정합니다.모드 전송 비트 수(동작) 비트 내용 동기 모드 08 (8 BIT Shift) 데이터 (8) 비동기 모드 110 (8 BIT UART) 개시 (1) + 데이터 (8) + 정지 (1) 모드 211 (9 BIT UART) 개시 (1 ) + 데이터(8 ) + 9번째(1 ) + 정지(1 ) 모드 311(9 BIT UART ) 개시(1 ) + 데이터(8 )mode 0~3을 선택할 수 있습니다.가장 일반적으로 사용하는 것은 mode 1입니다.다른 모드는 별로 쓰지 않아요.9 bit을 사용하는 것은 parity bit을 추가하는 경우에 사용합니다만, 최근에는 별로 사용하지 않고, mode 0의 경우는 동기식 통신을 사용합니다만, 이 때는 baud rate이 XTAL/12에 고정됩니다.SM2는 mode 2,3에서 사용하는 멀티 프로세서 통신 제어비트입니다.나중에 배운 인터럽트 동작을 결정할지 여부를 결정합니다우선 결과만 작성해서 보면 SM2:모드 2,3에서 사용하는 멀티 프로세서 통신 제어 비트 모드 2,3:SM2=1의 경우, 수신 프레임의 9비트(RB8)이 1이면 인터럽트를 발생(RI)을 요구하며 0에 있으면 요구하지 않는다.모드 1:SM2=1의 경우, 정지 비트가 옳다(1상태) 없다고 무너진 발생(RI)을 요구하지 않는다.모드 0:여기에서는 반드시 0로 해야 한다.습니다만, 우선 사용하는 것이 거의 없으므로 0으로 놓으면 됩니다.그 다음, REN은 Receive Enable의 약어입니다.여기에 1이 담기지 않으면 데이터를 읽을 수 없습니다.REN=1:시리얼 포트에서 데이터를 읽을 수 있다 REN=0:receiver동작 XREN이라는 이름을 직접 사용하여 접근할 수도 있고 SCON.4라는 의미로도 사용할 수 있습니다.세트 렌탈러 세트 부스콘.4 CLRSCON.4TB8과 RB8은 mode 2,3을 사용할 경우 9번째 데이터 비트를 의미합니다.중요한 게 아니라 mode 1를 사용할 때 0에서 CLR시키어 놓으면 됩니다.TI(Transmit interrupt), RI(Receive interrupt)TI와 RI는 중요합니다이 2개는 각각 송신이 완료되면 수신이 완료되면 1로 바뀌비트입니다.무슨 뜻이냐면 우리가 8비트를 보내는데 아직 5비트까지 밖에 송신되고 있지 않으면 SBUF에 새 값을 못 넣.송신이 끝났음을 확인해야 그 다음의 내용을 SBUF에 넣어 계속 다른 값을 송수신할 것입니다.그러기 위해서는 송수신이 완료되었는지를 체크하는 작업이 필요한데, 그 때 얻는 것이 TI와 RI검사입니다.TI와 RI는 데이터 송수신이 완료되면 하드웨어적으로 set됩니다.초기 상태는 TI=1, RI=0입니다.한번 데이터를 송수신 하면, 소프트웨어적으로 해결을 시켜야겠는데요.TI=1:송신이 완료하고 다음에 송신이 가능한 상태를 의미합니다.TI=0:아직 송신이 끝나지 않았고 아직 다음의 송신을 입력해서는 안 됩니다.RI=1:SBUF에 데이터가 모두 들어 있으므로, 그 데이터를 사용할 수 있습니다.RI=0:아직 SBUF에 데이터가 모두 들어 있지 않아서 이 때는 사용하지 마세요.PCON레지스터(Power control register)PCON 레지스터는 power control 레지스터입니다. 이 레지스터에서는 MSB인 SMOD가 무슨 역할을 하는지만 알면 됩니다. SMOD 비트는 baud rate를 두 배로 만들어주는 역할을 합니다.SMOD가 1이면 2배의 baud를 발생시키고 0일 때는 그대로 발생시킵니다. 여기서 주의해야 할 점은 PCON 레지스터는 Bitaddressable이 아니라는 점입니다. 따라서 SETB나 CLR과 같은 명령어로는 접근할 수 없고 A 레지스터를 사용하여 설정해야 합니다.’이동’ ‘Pconsetbac’ ‘7개의 MOV콘A’이렇게 해서 PCON의 SMOD 비트를 설정할 수 있습니다.송수신할 데이터를 임시 저장하는 SBUF 레지스터, 그다음에 가장 중요한 SCON 레지스터, PCON 레지스터에 대해서 알게 됐으니까 실제로 PC로 데이터를 보내는 코드를 구성해보도록 하겠습니다.8051과 PC간의 통신을 할 때 가장 먼저 테스트해 볼 코드는 Loop back 코드입니다. 루프백 코드란 8051에서 PC로 데이터를 보내고 다시 PC에서 받은 데이터를 8051로 보내 송수신이 제대로 되고 있는지 점검하는 코드를 말합니다.만약 써준 값이 제대로 돌아온다면 양쪽에서 송수신이 제대로 이루어지고 있다는 것을 의미합니다.처음부터 송수신하는 것은 조금 어렵기 때문에 먼저 8051에 저장된 데이터를 PC로 보내는 코드부터 살펴보도록 하겠습니다.MOV TMOD,#20H;타이머 1, mde 2MOVTH1,#-6;4800보 환율 MOV SCON,#50H;8비트, 1스톱, REN=1SETB TR1;타이머 1MOVDPTR,#TableH_1:CLRAMOVCA,@ADP+TRJZ;$CHARACLTALL_RJ1;$CHALL_RAC_RAC_1;DP_RACL_RACL_RACLJ;DPACTALYCTALYCTALYCTAL H_2 CLRT TIRET;———————————————데이터 테이블:DB”Song Blog”DB0MOV TMOD, #20H; 타이머 1,mde 2MOVTH1,#-6; 4800 보레이트 MOV SCON, #50H; 8ビット, 1ストップ, REN = 1SETB TR1; タイマー 1MOVDPTR, #TableH_1:CLRAMOVCA, @ADP+TRJZ; $CHARACLTALL_RJ1; $CHALL_RAC_RAC_1; DP_RACL_RACL_RACLJ; DPACTALYCTALYCTALYCTAL H_2 CLRT TIRET;——————————— データテーブル:DB「Song Blog」DB0하단의 Rx는 PC현재 Rx입니다.지금 잘 PC에 Song Blog라고 하는 문자열이 도착했습니다.위 코드의 과정을 단계별로 보면 Timer 1을 쓰고 baud rate를 설정한다.SCON버튼 설정 타이머 start(SETB TR1)SBUF에 송신 데이터를 쓴다.TI가 1이 되면(송신이 완료되면)TI을 CLR시키고 4~5회 반복 중에서 소소한 동작만 달라서 큰 틀이 같아서 천천히 코드를 보면서 상기 내용을 반드시 이해해야 합니다.Rx의 아래 Tx는 컴퓨터의 시점에서 송신하는 데이터를 쓰고 Tx send를 누르면 전송되며 그것이 Rx에 표시됩니다.그럼 이번 구성 코드는 PC에서 Tx에 문자열을 보내면 8051에 도착할 것이며 그것을 다시 한번 PC의 Rx에 보이게 짠 Loop back코드를 봅시다.MOV TMOD, #20HMOV TH1, #-6; 볼레이트 : : 4800MOV SCON, #50H; 010100000 모드 1, REN=1 SETB TR1CLR 여기서는 다음의 절차를 실행합니다: WAIT_RECEIVE: JNBRI, WAIT_RECEIVEMOVA, SBUFCLR RIMOV SBUF, AWAIT_TRANSMIT: JNBTI, WAIT_TRANSMIC CLR TISJMP 이쪽생각보다 쉬워요.동영상을 GIF로 하면 화질도 좋지 않아 사진의 크기가 작아집니다..상기의 프로그램을 RUN이후 위의 동영상처럼 Tx에 Send, 즉 PC에서 8051에 데이터를 보내면 8051에서 수신하여 수신한 데이터를 다시 PC에 송신하고 PC의 Rx에 그대로 전달되는 모습을 확인할 수 있습니다.Song Blog라는 문자열을 보내고 그대로 수신하는 모습을 볼 수 있습니다.그 코드가 제대로 동작하므로 loop back코드가 제대로 동작하는 것입니다.이를 응용하면 무한한 프로그램을 짤 수 있습니다.PC에서 8051에 숫자의 줄을 보내면 그 숫자의 줄을 세그먼트에 표시할 코드나, 8051에 연결된 키패드를 누르면 그것을 아스키 코드로 변환하고 PC에 보내는 등 응용 방법은 셀 수 없겠죠?나중에 포스팅에서 내가 그 같은 응용을 연습한 코드를 정리해서 업로드할 예정입니다.Loop back코드의 동작을 이해한다면 Serial통신 방법에 대한 방법은 배운 것이니까, 그 이후는 연습만이 살길이야!맘에 걸리는 것은 코멘트로 남기세요.감사합니다。동영상을 GIF로 했더니 화질도 안좋고 사진크기가 작아지네요.. 위 프로그램을 RUN 이후 위 동영상과 같이 Tx로 Send, 즉 PC에서 8051로 데이터를 보내면 8051로 수신하고 수신한 데이터를 다시 PC로 전송하여 PC의 Rx로 그대로 전달되는 모습을 확인할 수 있습니다. Song Blog라는 문자열을 보내고 그대로 수신하는 모습을 볼 수 있습니다. 저 코드가 제대로 작동하기 때문에 loop back 코드가 제대로 작동하는 겁니다.이것을 응용하면 무한한 프로그램을 짤 수 있습니다. PC에서 8051로 숫자열을 보내면 그 숫자열을 세그먼트에 표시하는 코드나 8051에 연결된 키패드를 누르면 그것을 아스키코드로 변환해서 PC로 보내는 등 응용방법은 셀 수 없죠? 나중에 포스팅에서 제가 그런 응용을 연습한 코드를 정리해서 올릴 예정입니다. Loop back 코드의 동작을 이해한다면 Serial 통신 방법에 대한 방법은 배운 것이기 때문에 그 이후에는 연습만이 살 길! 궁금한 점은 댓글로 남겨주세요. 감사합니다。