Upload
nguyennguyet
View
221
Download
1
Embed Size (px)
Citation preview
뻔뻔한 AVR 프로그래밍뻔뻔한 AVR 프로그래밍The 6th LectureThe 6 Lecture
유 명 환 ( [email protected])
INDEX“통신” 관련 이야기1 INDEX“시리얼 통신” 관련 이야기2
ATmega128 시리얼 통신 회로도 분석3
ATmega128 시리얼 통신 컨트롤러(USART) 분석4
ATmega128 시리얼 통신 관련 레지스터 분석5
ATmega128 시리얼 통신 실습6
“통신” 관련 이야기1 통신 관련 이야기
동기 (Synchronous) 非 동기 (Asynchronous)
TCP UDPTCP
USART
TWI(I2C)
UDP
UART
GPS, BlueTooth, ZigBee
임베디드 시스템용 시리얼 통신 UART ex) MMI (Man Machine Interface)
통신 속도 시간 (계산) 공식통신 속도 시간 (계산) 공식
“시리얼 통신” 관련 이야기2 시리얼 통신 관련 이야기
CPU
CPU0
01
10 0 0 0 0111TX
UARTcore 0
011
1
Busdata stream
RxUART
0 0 0 0 0111
SerialParallel
start 0 1 2 3 4 5 6 7 8 parity stop stop
Data bit
AT 시리얼 통신 회로도 분석ATmega128 시리얼 통신 회로도 분석3
AT 시리얼 통신 회로도 분석ATmega128 시리얼 통신 회로도 분석3
DK128-MAIN 보드 : ISP 회로
AT 시리얼 통신 회로도 분석ATmega128 시리얼 통신 회로도 분석3
DK128-MAIN 보드 : UART 회로
AT 시리얼 통신 회로도 분석ATmega128 시리얼 통신 회로도 분석3
PC DK 12812V
5V1 threshold 5V1
10
0 0 1
GND
+5V Powered RS-232 Transmitters/Receivers+5V Powered RS-232 Transmitters/Receivers
--> MAX232 와 호환!!
AT 시리얼 통신 컨트롤러(USART) 분석ATmega128 시리얼 통신 컨트롤러(USART) 분석4
<-- 16MHz
--> TXD1
<-- RXD1
AT 시리얼 통신 컨트롤러(USART) 분석ATmega128 시리얼 통신 컨트롤러(USART) 분석4
Clock Generator
Transmitter다음 번 데이터는 송신 버퍼가
비워질(empty) 때까지 대기(wait)
UDR (Transmit) : 송신 버퍼송신 버퍼 empty
비워질(empty) 때까지 대기(wait)
TRANSMIT SHIFT REGISTER: 한 비트씩 송신(Transmitting)
TXD1
한 비트씩 Loading
Receiver
: 한 비트씩 송신(Transmitting)
Receiver
AT 시리얼 통신 컨트롤러(USART) 분석ATmega128 시리얼 통신 컨트롤러(USART) 분석4
Clock Generator
Transmitter
ReceiverRXD1핀으로부터 한 비트씩 수신
RECEIVE SHIFT REGISTER: 한 비트씩 수신 버퍼에 저장
RXD1
UDR (Receive) : 수신 버퍼Stop 비트 : Data 비트 수신이 완료됨을 뜻함!
수신 버퍼 full
AT 시리얼 통신 컨트롤러(USART) 분석ATmega128 시리얼 통신 컨트롤러(USART) 분석4
TXD
RXD
TXD
RXD
PC DK128
RXD
GND
RXD
GND
• Full Duplex 동작
– 직렬 송수신이 독립적
• 비 동기(Asynchronous)와 동기(Synchronous) 모두 동작• 비 동기(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 스톱비트비트
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
PC : 하이퍼터미널 (시리얼 가상 에뮬레이터)
DK128 : Firmware
19200-8-N-1
DK128 : Firmware
19200 : 시리얼 통신 속도(Baud rate)
8 : (송수신) 데이터 사이즈 -> ASCII code
N : No Parity
1 : Stop 비트 “1” 비트 사용* 흐름 제어 -> 반드시 “없음” 으로 설정할 것!
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
UDRn : USARTn I/O Data Register
Register 설명 실제 구현 예
UDRn •송수신 데이터를 저장하기 위한 레지스터 -> 버퍼(Buffer) UDR1 = byte; // 송신할 때
return UDR1; // 수신할 때return UDR1; // 수신할 때
19200-8-N-1
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
UCSRnA : USART Control and Status Register A
Register 설명 실제 구현 예
Bit 7 –RXC
• USART Receive Complete bitRX 핀으로부터 입력된 수신 데이터(8비트)가 모두 수신 버퍼(UDR)로
while(! (UCSR1A &(1<<RXC1)) );// RXC1 비트가 “1”이 될 때까지RXCn:
USART Receive Complete
• RX 핀으로부터 입력된 수신 데이터(8비트)가 모두 수신 버퍼(UDR)로입력이 완료되는 순간 자동적으로 “1”로 설정됨.
수신 버퍼가 완전히 채워질 때
// RXC1 비트가 “1”이 될 때까지
대기(wait) -> Polling 방식
Bit 5 –UDREn: USART Data
• USART Data Register Empty bit• 송신 버퍼(UDR)가 새로운 데이터를 받을 준비가 되어 있는지 알려줌
송신 버퍼가 완전히 비워질 때
while(!(UCSR1A &(1<<UDRE1)));// UDRE1 비트가 “1”이 될 때까지
대기(wait)
Register Empty
19200-8-N-1
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
UCSRnB : USART Control and Status Register B
Register 설명 실제 구현 예
Bit 4 –RXENn:
• USART 수신을 활성화(enable)• 수신 버퍼와 관련된 동작이 가능하도록 함
UCSR1B = (1<<TXEN) | (1<<RXEN) | (0<<UCSZ2);RXENn:
Receiver Enable
• 수신 버퍼와 관련된 동작이 가능하도록 함 ( ) | ( );
Bit 3 –TXENn:
• USART 송신을 활성화(enable)• 송신 버퍼와 관련된 동작이 가능하도록 함
UCSR1B = (1<<TXEN) | (1<<RXEN) | (0<<UCSZ2);TXENn:
Transmitter Enable
• 송신 버퍼와 관련된 동작이 가능하도록 함 (1<<RXEN) | (0<<UCSZ2);
Bit 2 –UCSZn2:
• UCSRnC의 UCSZn1:0과 함께 송수신 데이터의 사이즈를 결정
• UCSRnC 참조
UCSR1B = (1<<TXEN) | (1<<RXEN) | (0<<UCSZ2);
Character Size
UCSRnC 참조
19200-8-N-1
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
UCSRnC :UCSRnC : USART Control and Status Register C
Register 설명 실제 구현 예
Bit 5:4 –UPMn1:0: Parity Mode
• Parity 모드 설정 UCSR1C = (0<<UPM1)|(0<<UPM0) | (0<< USBS) | (1<<UCSZ1) | (1 <<UCSZ0);UPMn1 UPMn0 Parity mode
Parity Mode0 0 Disabled
0 1 (Reserved)
1 0 Enabled, Even Parity
1 1 Enabled Odd Parity
Bit 3 –USBSn: Stop Bit
• Stop 비트를 1비트와 2비트 중 어느 것을 할지 설정 UCSR1C = (0<<UPM1)|(0<<UPM0) | (0<< USBS) | (1<<UCSZ1) | (1 <<UCSZ0);
1 1 Enabled, Odd Parity
USBSn Stop-Bit(s)Stop Bit Select 0 1-bit
1 2-bits
19200-8-N-1
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
Bit 2:1 –UCSZn1:0: Character Si
• UCSRB의 UCSZ2와 함께 송수신 데이터의 사이즈를 결정
• 8비트 데이터 사이즈로 결정함! ASCII codeUCSR1C = (0<<UPM1) | (0<<UPM0) | (0<< USBS) | (1<<UCSZ1) | (1 <<UCSZ0);Character Si
ze| (1 <<UCSZ0);
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
19200-8-N-1
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
UBRRnL, UBRRnH :UBRRnL, UBRRnH : USART Baud Rate Registers
Register 설명 실제 구현 예
UBRRnL, UBRRnH
• 시리얼 통신 (송수신) 속도(Baud Rate)를 설정하기 위한 레지스터
19200-8-N-1
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5Clock GeneratorUBRRnH 전송 속도 설정
Transmitter
UBRRnL
Next data
UDR (Transmit) : 송신 버퍼송신 버퍼 empty
TRANSMIT SHIFT REGISTER: 송신 시프트 레지스터
TXD1
Receiver
USCRnARXCn
UCSRnB수신 활성화송신 활성화
UCSRnCParity mode 설정
비 설정RXCn
UDREn 송신 활성화data size 설정
Stop 비트 설정data size 설정
AT 시리얼 통신 관련 레지스터 분석ATmega128 시리얼 통신 관련 레지스터 분석5Clock Generator
UBRRnH전송 속도 설정
Transmitter
UBRRnL
Receiver
RECEIVE SHIFT REGISTER RXD1
RXD1핀으로부터 다음 신호 받음
RECEIVE SHIFT REGISTER: 수신 시프트 레지스터
RXD1
UDR (Receive) : 수신 버퍼Stop 비트
수신 버퍼 full수신 버퍼 full
USCRnARXCn
UCSRnB수신 활성화송신 활성화
UCSRnCParity mode 설정
비 설정RXCn
UDREn 송신 활성화data size 설정
Stop 비트 설정data size 설정
AT 시리얼 통신 실습ATmega128 시리얼 통신 실습6예제_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))-1) >> 8 // 상위 4 비트#define BAUD_RATE_H ((CPU_CLOCK/(16l BAUD_RATE)) 1) >> 8 // 상위 4 비트
- - - - 0 0 0 0 UBRRnH
case1) UBRR=51(0011 0011)인 경우
0 0 0 0
0 0 1 1 0 0 1 1UBRRnH
UBRRnL
case2) UBRR=416(0001 1010 0000)인 경우
- - - - 0 0 0 1
1 0 1 0 0 0 0 0UBRRnH
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