이 튜토리얼에서는 PIC 마이크로 컨트롤러와 UART 통신 을 활성화하는 방법과 컴퓨터와 데이터를주고받는 방법을 배웁니다. 지금까지 ADC, 타이머, PWM과 같은 모든 기본 모듈을 다루었으며 LCD 및 7 세그먼트 디스플레이 인터페이스 방법도 배웠습니다. 이제 우리는 대부분의 마이크로 컨트롤러 프로젝트에서 널리 사용되는 UART라는 새로운 통신 도구를 갖추고 있습니다. MPLAB 및 XC8을 사용하는 전체 PIC 마이크로 컨트롤러 자습서를 여기에서 확인하십시오.
여기서 우리는 PIC16F877A MCU를 사용 했으며 USART 라고도하는 "주소 지정이 가능한 범용 동기식 비동기식 수신기 및 송신기" 라는 모듈이 있습니다. USART는 데이터가 직렬로 흐르는 2 선 통신 시스템입니다. USART는 또한 전이중 통신이므로 CRT 터미널 및 개인용 컴퓨터와 같은 주변 장치와 통신하는 데 사용할 수있는 데이터를 동시에 보내고받을 수 있습니다.
USART는 다음과 같은 모드로 구성 할 수 있습니다:
- 비동기 (전이중)
- 동기식 – 마스터 (반이중)
- 동기식 – 슬레이브 (반이중)
8 비트 및 9 비트 모드라는 두 가지 모드도 있습니다.이 자습서 에서는 가장 많이 사용되는 통신 유형이므로 USART 모듈 이 8 비트 통신 시스템과 함께 비동기 모드 로 작동하도록 구성합니다. 비동기식이므로 데이터 신호와 함께 클럭 신호를 보낼 필요가 없습니다. UART는 데이터 전송 (Tx) 및 수신 (Rx)에 두 개의 데이터 라인을 사용합니다. 두 장치의 접지도 공통으로 만들어야합니다. 이러한 유형의 통신은 공통 클럭을 공유하지 않으므로 시스템이 작동하려면 공통 접지가 매우 중요합니다.
이 튜토리얼이 끝나면 컴퓨터와 PIC 마이크로 컨트롤러 사이에 통신 (UART)을 설정하고 랩톱에서 PIC 보드의 LED를 토글 할 수 있습니다. LED 상태는 PIC MCU에서 노트북으로 전송됩니다. 컴퓨터에서 Hyper Terminal을 사용하여 출력을 테스트합니다. 자세한 비디오는이 튜토리얼의 끝에 제공됩니다.
요구 사항:
하드웨어:
- PIC16F877A 성능 보드
- RS232-USB 변환기 모듈
- 컴퓨터
- PICkit 3 프로그래머
소프트웨어:
- MPLABX
- 하이퍼 터미널
USB 컨버터 RS232은 컴퓨터로 읽을 수있는 형태로 시리얼 데이터를 변환하는 데 필요합니다. 자체 모듈을 구입하는 대신 자체 회로를 설계하는 방법이 있지만 노이즈를 받기 때문에 신뢰할 수 없습니다. 우리가 사용하는 것은 아래와 같습니다.
참고: 각 RS232-USB 변환기에는 특수 드라이버를 설치해야합니다. 대부분은 장치를 연결하자마자 자동으로 설치됩니다. 하지만 긴장이 안되면 !!! 댓글 섹션을 사용하면 도와 드리겠습니다.
UART 통신을위한 프로그래밍 PIC 마이크로 컨트롤러:
모든 모듈 (ADC, 타이머, PWM)과 마찬가지로 PIC16F877A MCU 의 USART 모듈도 초기화하고 UART 8 비트 통신 모드에서 작동하도록 지시해야합니다. 구성 비트를 정의하고 UART 초기화 기능부터 시작하겠습니다.
PIC 마이크로 컨트롤러의 UART 모듈 초기화:
Tx 및 Rx 핀은 물리적으로 핀 RC6 및 RC7에 있습니다. 데이터 시트에 따라 TX를 출력으로, RX를 입력으로 선언 합시다.
// **** UART 용 I / O 핀 설정 **** // TRISC6 = 0; // TX 핀이 출력으로 설정 됨 TRISC7 = 1; // RX 핀이 입력으로 설정 됨 // ________ I / O 핀이 설정 됨 __________ //
이제 전송 속도를 설정해야 합니다. 전송 속도는 통신 채널에서 정보가 전송되는 속도입니다. 이것은 많은 기본값 중 하나 일 수 있지만이 프로그램에서는 가장 많이 사용되는 전송 속도 인 9600을 사용합니다.
/ ** 필요한 전송 속도를 위해 SPBRG 레지스터를 초기화하고 빠른 전송 속도를 위해 BRGH를 설정 ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate)-1; BRGH = 1; // 높은 baud_rate의 경우 // _________ baud_rate 설정의 끝 _________ //
전송 속도의 값은 레지스터 SPBRG를 사용하여 설정해야합니다. 값은 외부 크리스탈 주파수의 값에 따라 달라지며 전송 속도를 계산하는 공식은 다음과 같습니다.
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) – 1;
고속 비트 레이트를 사용하려면 비트 BRGH를 높게 설정해야합니다. 데이터 시트 (13 페이지)에 따르면 통신 중 오류를 제거 할 수 있으므로 항상 활성화하는 것이 유리합니다.
앞서 말했듯이 우리는 비동기 모드에서 작업 할 것이므로 직렬 핀 (TRISC6 및 TRICSC5)을 활성화 하려면 비트 SYNC를 0으로 설정하고 비트 SPEM을 높게 설정 해야합니다.
// **** 비동기 직렬 포트 활성화 ******* // SYNC = 0; // 비동기 SPEN = 1; // 직렬 포트 핀 활성화 // _____ 비동기 직렬 포트 활성화 _______ //
이 튜토리얼에서는 MCU와 컴퓨터 사이에서 데이터를 보내고받을 것이므로 TXEN과 CREN 비트를 모두 활성화 해야합니다.
// ** 송수신 준비 ** // TXEN = 1; // 전송 활성화 CREN = 1; // 수신 활성화 // __ UART 모듈 가동 및 송수신 준비 __ //
비트 TX9 및 RX9는 제로로 할 필요가 있기 때문에 8 비트 모드에서 동작 할 것이다. 높은 신뢰성을 설정해야하는 경우 9 비트 모드를 선택할 수 있습니다.
// ** 8 비트 모드 선택 ** // TX9 = 0; // 8 비트 수신 선택 RX9 = 0; // 8 비트 수신 모드 선택 // __ 8 비트 모드 선택 __ //
이것으로 우리는 초기화 설정을 완료합니다. 작동 할 준비가되었습니다.
UART를 사용하여 데이터 전송:
아래 기능은 UART 모듈을 통해 데이터를 전송하는 데 사용할 수 있습니다.
// ** UART에 1 바이트의 날짜를 보내는 함수 ** // void UART_send_char (char bt) {while (! TXIF); // TX 버퍼가 해제 될 때까지 프로그램 유지 TXREG = bt; // 수신 된 값으로 트랜스미터 버퍼로드} // _____________ 기능 종료 ________________ //
모듈이 초기화되면 TXREG 레지스터에로드 된 값은 UART를 통해 전송되지만 전송은 겹칠 수 있습니다. 그러므로 우리는 항상 전송 인터럽트 플래그 TXIF를 확인해야합니다 . 이 비트가 낮을 경우에만 전송을 위해 다음 비트로 진행할 수 있습니다. 그렇지 않으면이 플래그가 낮아질 때까지 기다려야합니다.
단, 위의 함수는 1 바이트의 데이터 만 전송할 수 있으며 완전한 문자열을 전송 하려면 아래 함수를 사용해야합니다.
// ** 문자열을 바이트로 변환하는 함수 ** // void UART_send_string (char * st_pt) {while (* st_pt) // char가있는 경우 UART_send_char (* st_pt ++); // 바이트 데이터로 처리} // ___________ 함수 끝 ______________ //
이 함수는 포인터가 있기 때문에 이해하기 다소 까다로울 수 있지만, 나를 믿으십시오. 포인터는 훌륭하고 프로그래밍을 더 쉽게 만들어줍니다. 이것은 동일한 좋은 예입니다.
보시다시피 UART_send_char ()를 다시 호출 했지만 지금은 while 루프 안에 있습니다. 문자열을 개별 문자로 분할했습니다.이 함수가 호출 될 때마다 하나의 문자가 TXREG로 전송되고 전송됩니다.
UART를 사용하여 데이터 수신:
다음 기능을 사용하여 UART 모듈에서 데이터를 수신 할 수 있습니다.
// ** UART에서 1 바이트 날짜를 가져 오는 함수 ** // char UART_get_char () {if (OERR) // 오류 확인 {CREN = 0; // 오류 인 경우-> 재설정 CREN = 1; // 오류 발생-> 재설정} while (! RCIF); // RX 버퍼가 해제 될 때까지 프로그램 유지 return RCREG; // 값을 받아 주 함수로 전송} // _____________ 함수 끝 ________________ //
UART 모듈이 데이터를 수신하면 데이터를 선택하여 RCREG 레지스터 에 저장합니다. 값을 임의의 변수로 전송하여 사용할 수 있습니다. 그러나 겹침 오류가 있거나 사용자가 지속적으로 데이터를 보내고 있으며 아직 변수로 전송하지 않았을 수 있습니다.
이 경우 수신 플래그 비트 RCIF 가 구출됩니다. 이 비트는 데이터가 수신되고 아직 처리되지 않을 때마다 낮아집니다. 따라서 우리는 그 값을 다룰 때까지 프로그램을 유지하기 위해 지연을 생성하는 while 루프에서 그것을 사용합니다.
PIC 마이크로 컨트롤러의 UART 모듈을 사용하여 LED 전환:
이제 프로그램의 마지막 부분 인 void main (void) 함수에 대해 살펴 보겠습니다. 여기서 PIC와 컴퓨터 간의 UART 통신을 사용하여 컴퓨터를 통해 LED를 전환합니다.
문자 "1"(컴퓨터에서)을 보내면 LED가 켜지고 상태 메시지 "RED LED-> ON" 이 컴퓨터로 다시 전송됩니다 (PIC MCU에서).
비슷하게 문자 "0"(컴퓨터에서)을 보내면 LED가 꺼지고 상태 메시지 "RED LED-> OFF" 가 다시 (PIC MCU에서) 컴퓨터로 전송됩니다.
while (1) // 무한 루프 {get_value = UART_get_char (); if (get_value == '1') // 사용자가 "1"을 보내는 경우 {RB3 = 1; // LED를 켭니다 UART_send_string ("RED LED-> ON"); // 컴퓨터에 알림 보내기 UART_send_char (10); // ASCII 값 10은 캐리지 리턴에 사용됩니다 (새 줄로 인쇄)} if (get_value == '0') // 사용자가 "0"을 보내는 경우 {RB3 = 0; // LED 끄기 UART_send_string ("RED-> OFF"); // 컴퓨터에 알림 보내기 UART_send_char (10); // ASCII 값 10은 캐리지 리턴에 사용됩니다 (새 줄로 인쇄)}}
프로그램 시뮬레이션:
평소처럼 proteus를 사용하여 프로그램을 시뮬레이션하고 예상대로 작동하는지 알아 봅시다.
위 이미지는 환영 메시지와 LED 상태를 보여주는 가상 터미널을 보여줍니다. 빨간색 LED는 핀 RB3에 연결되어 있음을 알 수 있습니다. 시뮬레이션의 자세한 작업은 마지막 비디오 에서 찾을 수 있습니다.
하드웨어 설정 및 출력 테스트:
이 회로의 연결은 정말 간단합니다. PIC Perf 보드를 사용하고 세 개의 와이어를 RS232-USB 변환기에 연결하고 아래 그림과 같이 USB 데이터 케이블을 사용하여 모듈을 컴퓨터에 연결합니다.
다음으로 하이퍼 터미널 애플리케이션 (여기에서 다운로드)을 설치하고 엽니 다. 다음과 같이 표시되어야합니다.
이제 컴퓨터에서 장치 관리자를 열고 모듈이 연결된 Com 포트를 확인하십시오. 아래 그림과 같이 COM 포트 17에 연결되어 있습니다.
참고: 모듈의 COM 포트 이름은 공급 업체에 따라 변경 될 수 있지만 문제가되지 않습니다.
이제 하이퍼 터미널 응용 프로그램으로 돌아가 설정-> 포트 구성으로 이동 하거나 Alt + C를 눌러 다음 팝업 상자를 표시하고 팝업 창에서 원하는 포트 (제 경우에는 COM17)를 선택하고 연결을 클릭합니다..
연결이 설정되면 PIC 성능 보드를 켜면 아래와 같은 내용이 표시됩니다.
커서를 명령 창에두고 1을 입력 한 다음 Enter 키를 누릅니다. LED가 켜지고 아래와 같이 상태가 표시됩니다.
같은 방법으로 커서를 명령 창에두고 0을 입력 한 다음 Enter 키를 누릅니다. LED가 꺼지고 아래와 같이 상태가 표시됩니다.
아래는 “1”과“0”에 대해 LED가 실시간으로 어떻게 반응하는지 보여주는 완전한 코드와 자세한 비디오 입니다.
그게 다야, 우리는 PIC UART를 컴퓨터와 인터페이스하고 데이터를 전송하여 Hyper 터미널을 사용하여 LED를 토글했습니다. 이해하지 못했으면 댓글 섹션을 사용하여 질문하십시오. 다음 자습서에서는 UART를 다시 사용하지만 Bluetooth 모듈을 사용하여 데이터를 무선으로 브로드 캐스트하여 더 재미있게 만들 것입니다.
또한 두 개의 ATmega8 마이크로 컨트롤러 간의 UART 통신과 ATmega8과 Arduino Uno 간의 UART 통신을 확인하십시오.