부제목: 24일차
일정: 2023.11.28(화)
수업 내용:
- UART 제어
목표:
- UART 제어 ( Code Vision AVR )
• PC와 KUT-128_COM 보드를 RS-232 케이블로 연결
• 장치 관리자
: 포트에 할당 된 COM번호와 Baud rate를 확인
: 통신포트 COM1 - Terminal
: USB Serial Port(COM3) – Programmer
- Baud rate는 기본 (9600) 그대로 사용
Code Vision AVR 터미널설정
노트북 :
USB to serial
Converter
• Project 생성시, C-Compiler에서 clock 8MHz를 16MHz로
• Code Vision AVR을 실행하고 <Settings → Teminal> 통신환경 설정
- PC 장치관리자에 할당된 포트와 Baud rate 를 동일하게 설정
[예제 7-1] USART0 송신 실험
KUT-128_COM보드의 USART0을 통해서 문자열
“This is USART control program”을 컴퓨터에 전송하는 프로그램을 작성하라
전송속도는 9600bps로 하고, 정지 비트는 1비트로 한다.
전송된 문자열은 CodeVisionAVR에 내장된 터미널 창을 통해서 확인할 수 있으
며, 툴바의 아이콘을 클릭하면 터미널 창이 열린다.
한 번만 실행되므로, MCU보드의 리셋 스위치를 눌러가며 동작을 확인한다.
BAUD = 9600, DataBit = 8 bit, StopBit = 1, Parity = None;
1. RS232 연결, 장치관리자에서 COM Port 확인
2. Code vision에서 Setting에서 Programmer와 Terminal 연결 (COM Port)
3. 프로그램
4. Terminal 창 열고 메시지 확인, 못 볼 경우에는 Board의 power switch를 off-on
#include <mega128.h>
#include <delay.h>
void Putch(char); // 송신
void main(void)
{
char string[] = "This is USART0 control program. ^_______^"; // 전송 문자열
char *pStr; // 문자열 포인터
delay_ms(7000); // PC에서 메시지 확인 위해
UCSR0A = 0x0; // USART 초기화 (251p)
UCSR0B = 0b00001000; // 송신 인에이블 TXEN = 1 (253p)
UCSR0C = 0b00000110; // 비동기[7], 데이터 8비트 모드 (253,4p)
UBRR0H = 0; // X-TAL = 16MHz 일때, BAUD = 9600
UBRR0L = 103; // (257p)
pStr = string;
while(*pStr != 0) Putch(*pStr++); // 문자열 전송
while(1);
}
void Putch(char data) // 한 바이트 송신
{
while((UCSR0A & 0x20) == 0x0); //UDRE0[5] = 1 송신준비완료 될 때까지 대기
UDR0 = data; // 데이터 전송
}
UCSR0A = 0x0; // USART 초기화
UCSR0B = 0b00001000; // 송신부 enable TXEN = 1
UCSR0C = 0b00000110; // 비동기:0, No parity: 00, 정지bit 1이면:0, 데이터 8비트 모드
UBRR0H = 0; // X-TAL = 16MHz 일때, BAUD = 9600
UBRR0L = 103;
pStr = string;
while(*pStr != 0) Putch(*pStr++); // 문자열 전송, 마지막 null문자
while(1);
}
void Putch(char data) // 한 바이트 송신
{
while((UCSR0A & 0x20) == 0x0); // 송신 버퍼가 비어지면 UDRE0 = 1 이 될 때까지 대기 전송 준비가 되었는지 확인하는 것
UDR0 = data; // 데이터 전송
}
[예제 7-2] USART0 수신 실험
Code Vision AVR에서 터미널 창을 오픈 후
컴퓨터에서 key 입력된 16진 문자 (‘0’~’9’,’A’~’F’ 또는 ‘a’~’f’)를
KUT-128_COM보드에서 수신하여
맨 우측의 7-세그먼트에 출력 표시하는 프로그램을 작성하라.
실험할 때는 <Terminal Settings> 창에서 “Echo Transmitted Character”의 선택을 해제하고 실
행한다.
BAUD = 9600,
Data Bit = 8 bits,
Stop Bit = 1,
Parity = None
입력 ASCII를 배열 값으로 어떻게
변환할까?
#include <mega128.h>
flash unsigned char seg_pat[16]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void main(void)
{
unsigned char rd, dd = 0; //rd 입력 data,
DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
PORTG = 0b00001000; // 맨 우측 세그먼트 on
UCSR0A = 0x0; // USART 초기화
UCSR0B = 0b00010000; // 수신 enable RXEN0 [4]bit=1
UCSR0C = 0b00000110; // 비동기:0, No parity: 00, 정지bit 1이면:0, 데이터 8비트 모드
UBRR0H = 0; // 16MHz 일때, BAUD = 9600
UBRR0L = 103;
Strictly Private and Confidential
50/88
while(1) {
while((UCSR0A & 0x80) == 0x0) // RXC0 [7]bit = 1이 될 때까지 대기
{ // 수신 버퍼에 새로운 데이터가 수신되면 RXC0 = 1
PORTD = ((seg_pat[dd] & 0x0F) << 4) | (PORTD & 0x0F);
PORTB = (seg_pat[dd] & 0x70 ) | (PORTB & 0x0F);
}
rd = UDR0; // 수신되면 while문을 빠져 나와, 값을 읽음
// 값을 읽으면 바로 RXC0 [7]bit = 0 됨
if(rd >= '0' && rd <= '9') dd = rd - '0';
else if(rd >= 'a' && rd <= 'f') dd= rd - 'a' + 10;
else if(rd >= 'A' && rd <= 'F') dd = rd - 'A' + 10;
}
}
[예제 7-3] USART0 송수신 실험 [polling 방식]
CodeVisionAVR에서 터미널 창을 열고, 컴퓨터에서 key 입력된 문자를 수신하고,
수신한 문자가 알파벳 대문자이면 소문자로
소문자이면 대문자로 변환하여 컴퓨터로 전송하는 프로그램을 작성하라.
즉, 터미널 창에 a를 누르면 A가 표현되고, B를 누르면 b가 표현
: USART0 송수신 실험,
: BAUD = 9600, DataBit = 8 bit, StopBit = 1, Parity = None;
<대문자 → 소문자로 변환>
character = input character - ’A’ + ’a’
input character =‘A’ 이면, character = 0x41 – 0x41 + 0x61 = 0x61 → a
input character =‘W’ 이면, character = 0x57 – 0x41 + 0x61 = 0x77 → w
<소문자 → 대문자로 변환>
character = input character - ’a’ + ’A’
input character =‘a’ 이면 character = 0x61 – 0x61 + 0x41 = 0x41 → A
input character =‘g’ 이면 character = 0x67 – 0x61 + 0x41 = 0x47 → G
#include <mega128.h>
void main(void)
{
unsigned char character ;
UCSR0A = 0x0;
UCSR0B = 0b00011000; // 송수신부 enable TXEN0 [3] = 1, RXEN0 [4] =1
UCSR0C = 0b00000110; // 비동기:0, No parity: 00, 정지bit 1이면:0, 데이터 8비트 모드
UBRR0H = 0; // 16MHz 일때, BAUD = 9600
UBRR0L = 103;
while(1) {
while((UCSR0A & 0x80) == 0x0); // RXC0=1 될 때까지 대기
// 수신 버퍼에 새로운 데이터가 수신되면 RXC0 = 1
character = UDR0; // 수신, 값을 읽으면 바로 RXC0 [7]bit = 0 됨
if((character >= 'a‘) && (character <= 'z'))
character = character - 'a' + 'A'; // 소문자 -> 대문자
else if((character >= 'A‘) && (character <= 'Z'))
character = character - 'A' + 'a'; // 대문자 -> 소문자
while((UCSR0A & 0x20) == 0x0); // 송신 버퍼가 비어지면 UDRE0 = 1 이 될 때까지 대기
// 전송 준비가 되었는지 확인하는 것
UDR0 = character ; // 송신
}
}
[예제 7-4] USART0 송수신 실험 [수신 인터럽트 방식]
[예제 6-3]에 대해 송신은 그대로 polling 방식을 이용하고, 수신은 수신완료 인터럽트를 이용하여 프로그램을 작성하라.
USART0 송수신 실험 (수신 인터럽트 방식)
BAUD = 9600, DataBit = 8 bit, StopBit = 1, Parity = None;
#include <mega128.h>
void main(void)
{
UCSR0A = 0x0;
UCSR0B = 0b10011000; // RXCIE0 [7] =1 : 수신 완료 인터럽트 enable
// 송수신 enable TXEN0 [3] = 1, RXEN0 [4] =1
UCSR0C = 0b00000110; // 비동기 데이터 8비트 모드
UBRR0H = 0; // X-TAL = 16MHz 일때, BAUD = 9600
UBRR0L = 103;
SREG |= 0x80; // 전역 인터럽트 인에이블 I 비트 셋
while(1); // 문자 수신할 때까지 대기
}
interrupt [USART0_RXC] void usart0_rx(void) // 수신 완료 인터럽트
{
unsigned char ch;
ch = UDR0; // 수신
if(ch >= 'a' && ch <= 'z') ch = ch - 'a' + 'A'; // 소문자 -> 대문자
else if(ch >= 'A' && ch <= 'Z') ch = ch - 'A' + 'a'; // 대문자 -> 소문자
while((UCSR0A & 0x20) == 0x0); // UERE0=1 될 때까지 대기
UDR0 = ch; // 송신
}
'[Intel] 엣지 AI SW 아카데미 > 펌웨어 프로그래밍 75hour' 카테고리의 다른 글
[Intel] 엣지 AI SW 아카데미 27일차 (부산상공회의소 인력개발원) (1) | 2023.12.17 |
---|---|
[Intel] 엣지 AI SW 아카데미 25일차 (부산상공회의소 인력개발원) (1) | 2023.12.17 |
[Intel] 엣지 AI SW 아카데미 23일차 (부산상공회의소 인력개발원) (1) | 2023.12.17 |
[Intel] 엣지 AI SW 아카데미 22일차 (부산상공회의소 인력개발원) (1) | 2023.12.17 |
[Intel] 엣지 AI SW 아카데미 20일차 (부산상공회의소 인력개발원) (1) | 2023.12.16 |