BASIC4MCU | 질문게시판 | atmega128 init_uart0 초기화 함수해석
페이지 정보
작성자 히잌 작성일2020-12-13 13:46 조회9,602회 댓글1건본문
프로그램 해석중 이 부분을 잘 모르겠습니다
빨간색으로 되어있는 부분 해석좀 도와주세요
/*************************************************************************************/
/* Initialize UART0 */
/*************************************************************************************/
/*************************************************************************************
1. UCSRnA(USART Control and Status Register A)
7 6 5 4 3 2 1 0
----------------------------------------------------------
| RXCn | TXCn | UDREn | FEn | DORn | UPEn | U2Xn | MPCMn |
----------------------------------------------------------
R R/W R R R R R/W R/W
initial 0 0 0 0 0 0 0 0
value
Bit 7 . RXCn: USART Receive Complete
Bit 6 . TXCn: USART Transmit Complete
Bit 5 . UDREn: USART Data Register Empty
Bit 4 . FEn: Frame Error
Bit 3 . DORn: Data OverRun
Bit 2 . UPEn: Parity Error
Bit 1 . U2Xn: Double the USART Transmission Speed
Bit 0 . MPCMn: Multi-Processor Communication Mode
2. UCSRnB(USARTn Control and Status Register B)
7 6 5 4 3 2 1 0
---------------------------------------------------------------------
| RXCIEn | TXCIEn | UDRIEn | RXENn | TXENn | UCSZn2 | RXB8n | TXB8n |
---------------------------------------------------------------------
R/W R/W R/W R/W R/W R/W R R/W
initial 0 0 0 0 0 0 0 0
value
Bit 7 . RXCIEn: RX Complete Interrupt Enable
Bit 6 . TXCIEn: TX Complete Interrupt Enable
Bit 5 . UDRIEn: USART Data Register Empty Interrupt Enable
Bit 4 . RXENn: Receiver Enable
Bit 3 . TXENn: Transmitter Enable
Bit 2 . UCSZn2: Character Size
Bit 1 . RXB8n: Receive Data Bit 8
Bit 0 . TXB8n: Transmit Data Bit 8
3. UCSRnC(USART Control and Status Register C)
7 6 5 4 3 2 1 0
--------------------------------------------------------------------
| - | UMSELn | UPMn1 | UPMn0 | USBSn | UCSZn1 | UCSZn0 | UCPOLn |
--------------------------------------------------------------------
R/W R/W R/W R/W R/W R/W R/W R/W
initial 0 0 0 0 0 0 0 0
value
Bit 7. Reserved Bit
Bit 6. UMSELn: USART Mode Select:
0 - Asynchronous mode, 1 - Synchronos mode
Bit 5:4. UPMn1:0: Parity Mode :
00-disabled, 01-reserved, 10-Even parity, 11-Odd parity
Bit 3. USBSn: Stop Bit Select :
0 - 1bit, 1-2bit
Bit 2:1. UCSZn1:0: Character Size :
000-5bit, 001-6bit, 010-7bit, 011-8bit, 111-9bit
Bit 0. UCPOLn: Clock Polarity (only Synchronous Mode)
4. UBRR0H and UBRR0L(Baud Rate Register)
7 6 5 4 3 2 1 0
---------------------------------------------------------------------------------
| - | - | - | - | UBRR011 | UBRR010 | UBRR009 | UBRR008 | : UBRR0H
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
| UBRR007 | UBRR006 | UBRR005 | UBRR004 | UBRR003 | UBRR002 | UBRR001 | UBRR000 | : UBRR0L
---------------------------------------------------------------------------------
R R R R R/W R/W R/W R/W
R/W R/W R/W R/W R/W R/W R/W R/W
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
initial
value
*************************************************************************************/
***************************************************************************/
void init_uart0()
{
WORD UBRRD;
UBRRD = f_osc/16/BAUD - 1;
UBRR0H = (BYTE)(UBRRD>>8);
UBRR0L = (BYTE)(UBRRD & 0xFF);
UCSR0A = 0b00000000;
UCSR0B = 0b11011000;
UCSR0C = (1<<UCSZ11)|(1<<UCSZ10);
}
댓글 1
조회수 9,602master님의 댓글
master 작성일
char U0_RX(void){ while(!(UCSR0A&0x80)); return UDR0; }
char U1_RX(void){ while(!(UCSR1A&0x80)); return UDR1; }
void U0_TX(char c){ while(!(UCSR0A&0x20)); UDR0=c; }
void U1_TX(char c){ while(!(UCSR1A&0x20)); UDR1=c; }
void U0_STR(char *s){ while(*s)U0_TX(*s++); }
void U1_STR(char *s){ while(*s)U1_TX(*s++); }
//
interrupt [USART0_RXC] void usart0_rx_isr(void){ // 수신 인터럽트
char ch;
ch=UDR0;
}
//=====================================================
interrupt [USART1_RXC] void usart1_rx_isr(void){ // 수신 인터럽트
char ch;
ch=UDR1;
if(ch=='0'){}
if(ch=='1'){}
if(ch=='2'){}
}
// 16MHz
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 0; // 1M // 0.0%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 1; //500.0k // 0.0%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 3; //250.0k // 0.0%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 3; //230.4k // 8.5%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 8; //115.2k //-3.5%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 12; // 76800 // 0.2%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 16; // 57600 // 2.1%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 25; // 38400 // 0.2%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 34; // 28800 //-0.8%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 51; // 19200 // 0.2%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 68; // 14400 // 0.6%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L=103; // 9600 // 0.2%
UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L=207; // 4800 // 0.2%
UCSR0A=0; UCSR0B=0x18; UBRR0H=1; UBRR0L=160; // 2400 //-0.1% 416
// 16MHz, 더블보레이트
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 0; // 2M // 0.0%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 1; // 1M // 0.0%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 3; //500.0k // 0.0%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 7; //250.0k // 0.0%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 8; //230.4k //-3.5%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 16; //115.2k // 2.1%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 25; // 76800 // 0.2%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 34; // 57600 //-0.8%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 51; // 38400 // 0.2%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 68; // 28800 // 0.6%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L=103; // 19200 // 0.2%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L=138; // 14400 //-0.1%
UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L=207; // 9600 // 0.2%
UCSR0A=2; UCSR0B=0x18; UBRR0H=1; UBRR0L=160; // 4800 //-0.1% 416
UCSR0A=2; UCSR0B=0x18; UBRR0H=3; UBRR0L= 64; // 2400 // 0.0% 832
//=====================================================
// 시리얼0 (128은 ISP와 공용으로 사용되므로 주의)
UCSR0B=0x98; UBRR0H=0; UBRR0L=103; //9600, 송신 함수, 수신인터럽트
UCSR0B=0x18; UBRR0H=0; UBRR0L=103; //9600, 송신, 수신 함수
// 시리얼1
UCSR1B=0x98; UBRR1H=0; UBRR1L=103; //9600, 송신 함수, 수신인터럽트
UCSR1B=0x18; UBRR1H=0; UBRR1L=103; //9600, 송신, 수신 함수
//=====================================================
설정을 참고해서 데이터시트와 비교해 보세요