뻔뻔한 AVR 프로그래밍 The 6 th Lecture 유명환 ( yoo@netplug.co.kr)
1 2 통신 관련이야기 시리얼통신 관련이야기 INDEX 3 ATmega128 시리얼통신회로도분석 4 ATmega128 시리얼통신컨트롤러 (USART) 분석 5 ATmega128 시리얼통신관련레지스터분석 6 ATmega128 시리얼통신실습
1 통신 관련이야기 동기 (Synchronous) TCP USART TWI(I 2 C) 非동기 (Asynchronous) UDP UART GPS, BlueTooth, ZigBee 임베디드시스템용시리얼통신 UART ex) MMI (Man Machine Interface) 통신속도시간 ( 계산 ) 공식
2 시리얼통신 관련이야기 CPU 0 1 CPU 0 1 core 0 Bus 1 1 0 UART TX Rx 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 data stream Parallel Serial start 0 1 2 3 4 5 6 7 8 parity stop stop Data bit
3 ATmega128 시리얼통신회로도분석
3 ATmega128 시리얼통신회로도분석 DK128-MAIN 보드 : ISP 회로
3 ATmega128 시리얼통신회로도분석 DK128-MAIN 보드 : UART 회로
3 ATmega128 시리얼통신회로도분석 PC DK 128 12V 1 threshold 0 0 1 5V 1 0 GND +5V Powered RS-232 Transmitters/Receivers --> MAX232 와호환!!
4 ATmega128 시리얼통신컨트롤러 (USART) 분석 <-- 16MHz --> TXD1 <-- RXD1
4 ATmega128 시리얼통신컨트롤러 (USART) 분석 Clock Generator UDR (Transmit) : 송신버퍼 다음번데이터는송신버퍼가비워질 (empty) 때까지대기 (wait) 송신버퍼 empty Transmitter 한비트씩 Loading TRANSMIT SHIFT REGISTER : 한비트씩송신 (Transmitting) TXD1 Receiver
4 ATmega128 시리얼통신컨트롤러 (USART) 분석 Clock Generator Transmitter RXD1 핀으로부터한비트씩수신 Receiver RECEIVE SHIFT REGISTER : 한비트씩수신버퍼에저장 RXD1 UDR (Receive) : 수신버퍼 Stop 비트 : Data 비트수신이완료됨을뜻함! 수신버퍼 full
4 ATmega128 시리얼통신컨트롤러 (USART) 분석 PC TXD RXD GND TXD RXD GND DK128 Full Duplex 동작 직렬송수신이독립적 비동기 (Asynchronous) 와동기 (Synchronous) 모두동작 일반적으로 UART 는명령어전송을위해주로사용 주로비동기 5, 6, 7, 8, 9 데이터비트와 1, 2 스톱비트 no parity start 0 1 2 3 4 5 6 7 8 parity stop stop 5, 6, 7, 8, 9 데이터비트 1, 2 스톱비트
5 ATmega128 시리얼통신관련레지스터분석 PC : 하이퍼터미널 ( 시리얼가상에뮬레이터 ) DK128 : Firmware 19200-8-N-1 * 흐름제어 -> 반드시 없음 으로설정할것! 19200 : 시리얼통신속도 (Baud rate) 8 : ( 송수신 ) 데이터사이즈 -> ASCII code N : No Parity 1 : Stop 비트 1 비트사용
5 ATmega128 시리얼통신관련레지스터분석 UDRn : USARTn I/O Data Register Register 설명실제구현예 UDRn 송수신데이터를저장하기위한레지스터 -> 버퍼 (Buffer) UDR1 = byte; // 송신할때 return UDR1; // 수신할때 19200-8-N-1
5 ATmega128 시리얼통신관련레지스터분석 UCSRnA : USART Control and Status Register A Register 설명실제구현예 Bit 7 RXCn: USART Receive Complete Bit 5 UDREn: USART Data Register Empty USART Receive Complete bit RX 핀으로부터입력된수신데이터 (8 비트 ) 가모두수신버퍼 (UDR) 로입력이완료되는순간자동적으로 1 로설정됨. 수신버퍼가완전히채워질때 USART Data Register Empty bit 송신버퍼 (UDR) 가새로운데이터를받을준비가되어있는지알려줌 송신버퍼가완전히비워질때 while(! (UCSR1A &(1<<RXC1)) ); // RXC1 비트가 1 이될때까지대기 (wait) -> Polling 방식 while(!(ucsr1a &(1<<UDRE1))); // UDRE1 비트가 1 이될때까지대기 (wait) 19200-8-N-1
5 ATmega128 시리얼통신관련레지스터분석
5 ATmega128 시리얼통신관련레지스터분석 UCSRnB : USART Control and Status Register B Register 설명실제구현예 Bit 4 RXENn: Receiver Enable USART 수신을활성화 (enable) UCSR1B = (1<<TXEN) 수신버퍼와관련된동작이가능하도록함 (1<<RXEN) (0<<UCSZ2); Bit 3 TXENn: Transmitter Enable Bit 2 UCSZn2: Character Size USART 송신을활성화 (enable) 송신버퍼와관련된동작이가능하도록함 UCSRnC의 UCSZn1:0과함께송수신데이터의사이즈를결정 UCSRnC 참조 UCSR1B = (1<<TXEN) (1<<RXEN) (0<<UCSZ2); UCSR1B = (1<<TXEN) (1<<RXEN) (0<<UCSZ2); 19200-8-N-1
5 ATmega128 시리얼통신관련레지스터분석 UCSRnC : USART Control and Status Register C Register 설명실제구현예 Bit 5:4 UPMn1:0: Parity Mode Parity 모드설정 UPMn1 UPMn0 Parity mode 0 0 Disabled 0 1 (Reserved) 1 0 Enabled, Even Parity 1 1 Enabled, Odd Parity UCSR1C = (0<<UPM1) (0<<UPM0) (0<< USBS) (1<<UCSZ1) (1 <<UCSZ0); Bit 3 Stop 비트를 1비트와 2비트중어느것을할지설정 USBSn: Stop Bit USBSn Stop-Bit(s) Select 0 1-bit 1 2-bits UCSR1C = (0<<UPM1) (0<<UPM0) (0<< USBS) (1<<UCSZ1) (1 <<UCSZ0); 19200-8-N-1
5 ATmega128 시리얼통신관련레지스터분석 Bit 2:1 UCSZn1:0: Character Si ze UCSRB 의 UCSZ2 와함께송수신데이터의사이즈를결정 8 비트데이터사이즈로결정함! ASCII code UCSZn2 UCSZn1 UCSZn0 Character Size 0 0 0 5-bit 0 0 1 6-bit 0 1 0 7-bit 0 1 1 8-bit 1 0 0 Reserved 1 0 1 Reserved 1 1 0 Reserved 1 1 1 9-bit UCSR1C = (0<<UPM1) (0<<UPM 0) (0<< USBS) (1<<UCSZ1) (1 <<UCSZ0); 19200-8-N-1
5 ATmega128 시리얼통신관련레지스터분석 UBRRnL, UBRRnH : USART Baud Rate Registers Register 설명실제구현예 UBRRnL, UBRRnH 시리얼통신 ( 송수신 ) 속도 (Baud Rate) 를설정하기위한레지스터 19200-8-N-1
5 ATmega128 시리얼통신관련레지스터분석
5 ATmega128 시리얼통신관련레지스터분석 UBRRnH UBRRnL 전송속도설정 Clock Generator Next data Transmitter UDR (Transmit) : 송신버퍼 송신버퍼 empty TRANSMIT SHIFT REGISTER : 송신시프트레지스터 TXD1 Receiver USCRnA RXCn UDREn UCSRnB 수신활성화송신활성화 data size 설정 UCSRnC Parity mode 설정 Stop 비트설정 data size 설정
5 ATmega128 시리얼통신관련레지스터분석 UBRRnH UBRRnL 전송속도설정 Clock Generator Transmitter RXD1 핀으로부터다음신호받음 Receiver RECEIVE SHIFT REGISTER : 수신시프트레지스터 RXD1 UDR (Receive) : 수신버퍼 Stop 비트 수신버퍼 full USCRnA RXCn UDREn UCSRnB 수신활성화송신활성화 data size 설정 UCSRnC Parity mode 설정 Stop 비트설정 data size 설정
6 ATmega128 시리얼통신실습 예제 _Header #define CPU_CLOCK 16000000 #define BAUD_RATE 19200 #define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1 // 하위 8 비트 #define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE)) RATE))-1) >> 8 // 상위 4 비트 case1) UBRR=51(0011 0011) 인경우 - - - - 0 0 0 0 UBRRnH 0 0 1 1 0 0 1 1 UBRRnL case2) UBRR=416(0001 1010 0000) 인경우 - - - - 0 0 0 1 1 0 1 0 0 0 0 0 UBRRnH UBRRnL * 110100000의하위8비트 (1010 0000) 는 UBRRnL (BAUD_RATE_L) 에할당상위 4비트값만걸러내기위해 0001 1010 0000 를 8번오른쪽으로 Shift 시켜남아있는값만걸러내면됨! 0 0 0 1 1 0 1 0 0 0 0 0 >> 8 0 0 0 0 0 0 0 0 0 0 0 1