KT-M128 Peripheral Device USART 조 조조 References: -AVR ATmega128 조조 , Ohm 조 - 조조조 AVR 조조조조조 The 6 th Lecture, 조조조 -ATmega128 Manual, ATMEL 조
Mar 22, 2016
KT-M128 Peripheral Device
USART
조 승훈
References: -AVR ATmega128 정복 , Ohm 사 - 뻔뻔한 AVR 프로그래밍 The 6th Lecture, 유명환-ATmega128 Manual, ATMEL 사
USART
USART Overview• USART (Universal Synchronous and Asynchronous Receiver and
Transmitter)– Parallel 로 표현되는 Data 를 Serial 로 전송 및 수신하는 장치
3
CPUCore
01010101
UART
Parallel Serial
Bus
0 1 0 1 0 1 0 1TX
RX 0 1 0 1 0 1 0 1Data Stream
START 1 2 3 4 [5] [6] [7] [8] [Par-ity] Stop1 [Stop
2]0
Data Bit
CPU
USART Overview• ATmega128 UART 의 특징
– 두 개의 UART 내장 – 동기 및 비동기 전송 모드 지원
• 동기 모드 – master : 전송속도를 결정하는데 내부 Clock 사용• “ slave : XCKn 단자로 입력되는 외부 Clock 사용• 비동기 모드 – 항상 내부의 System Clock 사용• Normal Mode, Double Speed Mode 로 나뉨
– 항상 Full-Duplex 통신 – Multi-Processor 통신 가능– 높은 정밀도의 Baud Rate Generator 내장– 5-9 Bit 의 Data 전송 가능– 1-2 Bit 의 Stop Bit 설정 가능– 하드웨어에 의한 홀수 및 짝수의 Parity Bit 설정 가능 ( 생략 가능 )– 수신 동작에서 Parity Error, Overrun Error, Frame Error 검출 가능– Tx Complete, Tx Data Register Empty, RX Complete Interrupt 사용
가능– Noise Filtering 을 포함한 False Start Bit 검출 및 Digital Low Pass Filter– Double Speed 비동기 통신 모드
4
USART Overview
5
PORT A
PORT C
PORT E
PORT B
PORT F
PORT DExt. Clock
Receiver / Transfer
USART Overview
6
KT-M128 UART 회로도
UART 직렬통신 포토의 구성 블록도
7
Baud Rate Control REG.
Transmitter Buffer REG. (Same REG)Receiver Buffer
REG. (Same REG)
I/O Pin
UART Control REG.
3 PART
모든 파트에서 공유
동기 모드 Slave 를 위한 Ext. Clock
Clock Generator 의 내부 구조 및 동작 과정• USART Operation Mode
– Asynchronous Mode : UCSRnC 레지스터의 UMSELn Bit = 0• Int. System Clock 을 기본으로 하여 Baud Rate Clock 생성• USCRnC REG : U2Xn Bit = 0 - Normal Mode, U2Xn Bit = 1 – Double Speed
Mode
– Synchronous Mode : UCSRnC 레지스터의 UMSELn Bit = 1• XCKn 단자를 이용하여 Baud Rate Clock 생성• Master Mode : XCKn 단자를 이용하여 외부 Slave 에 전송 , 출력 단자• Slave Mode : XCKn 단자를 외부 Master 로 부터 수신 , 입력 단자• DDRx 의 해당 Bit 를 적절한 In / Out 으로 설정해야 함
8
USART
Synchro-nous
Asynchro-nous
Normal Double SpeedMaster Slave
ATmega128 USART Modes
Clock Generator 의 내부 구조 및 동작 과정
9
Clock Generator 의 Timing• 동기 모드의 Timing
– XCKn 단자로 입 ./ 출력되는 Clock 신호는 UCSRnC 레지스터의 UCPOLn Bit 에 의해 동작 Edge 가 결정 됨
– 동기 Slave Mode 에서 외부로부터 입력되는 CXKn Clock 신호는 동기 레지스터와 에지 검출기를 거치면서 2 System Clock 만큼 지원 , 이 Clock의 주파수는 System Clock 의 ¼ 이하여야 함
10
Falling Edge – Receive Data 출력Rising Edge – Transmit Data 샘플링
Falling Edge – Transmit Data 샘플링Rising Edge – Receive Data 출력
Transmitter 의 동작 과정
11
Receiver
Clock Generator
Transmitter
UDC(Transmit) : 송신 버퍼
송신 버퍼 Empty
TRANSMIT SHIFT REGISTER: 한 Bit 씩 송신 (Transmitting)
1 Bit 씩 Loading
TXDParity Gen-erator
Receiver 의 동작 과정
12
Receiver
Clock Generator
Transmitter
RECEIVE SHIFT REGISTER : 1 Bit 씩 수신 버퍼에 저장
RXD 핀으로부터 1 Bit 씩 수신
UDR (Receive) : 수신 버퍼
RXDParity Gen-erator
수신 버퍼 Full
Stop Bit :Data Bit 수신이 완료 됨
전송 데이터 포맷• Parity Bit 를 사용하게 설정한 경우
– 데이터 수신 때 Parity 를 계산하여 전송 에러 체크– 첫 번째의 Stop Bit 까지 Frame 을 체크하여 Parity Bit 가 low 로 검출되면
프레임 에러
• 두 개의 Stop Bit 를 사용한 경우– 두 번째 Stop Bit 는 수신부에서 무시 , 송신부를 Delay 시키는 효과만 있음
• St : Start Bit, Always low.• (n) : Data Bits, (0 to 8)• P : Parity Bit, Can be odd or even.• Sp : Stop Bit, Always high.• IDLE : No transfers on the communication line (RxD or
TxD).An IDLE line must be high.
13
[] = Can be remove
Parity bit 계산법Peven = dn – 1 ⊕ … ⊕ d3 ⊕ d2 ⊕ d1 ⊕ d0 ⊕ 0Podd = dn – 1 ⊕ … ⊕ d3 ⊕ d2 ⊕ d1 ⊕ d0 ⊕ 1
USART REGISTER• USARTn I/O Data Register – UDRn
– USARTn Port 의 송수신 데이터 버퍼 기능을 수행– 각 Port 의 송수신 버퍼는 동일한 번지에 위치 , 내부적으로 서로 다른 별개의
레지스터• 송신 할 데이터를 UDRn 에 쓰면 , 송신 데이터 버퍼 TXBn 에 저장• 수신 된 데이터를 UDRn 에서 읽으면 , 수신 데이터 버퍼 RXBn 에 수신되어 있는
값이 읽힘• 전송 데이터 문자를 5-7 Bit 로 설정 시
– 송신 : 사용하지 않는 상위 Bit 무시– 수신 : 이 상위 Bit 를 수신부에서 0 으로 처리
• 수신 버퍼는 2 단계의 FIFO 로 된 이중 Buffering 구조를 가짐– 읽을 때마다 상태가 변함– SBI/CBI 명령 , SBIS/SBIC 명령을 사용하지 않는 것이 좋음
14
USART REGISTER• USARTn Control & Status Register A – USCRnA
– USARTn Port 의 송수신 동작 제어 , 송수신 상태를 저장하는 기능을 수행
– Bit 7 (RXCn) : USARTn Receive Complete• 수신 버퍼에 읽혀지지 않은 문자가 있으면 1 로 Set, 수신 버퍼가 비어 있으면 0
으로 Set• 이 비트가 1 이면 Receive Complete Interrupt 를 요청 , 수신 버퍼를 읽으면 0
으로 Clear
– Bit 6 (TXCn) : USARTn Transmit Complete• 송신 시프트 레지스터에 있는 데이터가 모두 송신되고 , 송신 버퍼에 새로운
데이터가 Write 되지 않으면 1 로 Set 되는 상태 Flag.• 이 비트가 1 이면 Transmit Complete Interrupt 를 요청 , Interrupt 가 처리되면
자동 Clear
– Bit 5 (UDREn) : USARTn Data Register Empty• UDRn 의 송신 버퍼가 비어 있어 새로운 송신 데이터를 받을 준비가 되면 1 로 Set• 이 비트가 1 이면 Data Register Empty Interrupt 를 요청 , 송신 버퍼에 새로운
데이터를 Write 하면 이 비트는 Clear 됨
15
USART REGISTER• USARTn Control & Status Register A – USCRnA (Cont’)
– Bit 4 (FEn) : USARTn Frame Error• UDRn 의 수신 버퍼에 저장되어 있는 데이터를 수신하는 동안 Frame Error 가 발생• Frame Error : 수신 문자의 첫 번째 Stop Bit 가 0 으로 검출되면 발생• 수신 버퍼 UDRn 을 읽을 때까지 유효 , UCSRnA 를 Write 하면 무조건 0 으로
Clear 됨
– Bit 3 (DORn) : USARTn Data Overrun Error• UDRn 의 수신 과정에서 Overrun Error 가 발생했음을 나타내는 상태 플랙• Overrun Error : 수신 버퍼에 현재 읽지 않은 데이터가 있는 상태에서 , 수신
시프트 레지스터에 새로운 데이터 문자가 수신 완료되고 , 다시 그 다음 수신 데이터의 Start Bit 가 검출되면 발생
• 수신 버퍼 UDRn 을 읽을 때까지 유효 , UCSRnA 를 Write 하면 무조건 0 으로 Clear 됨
– Bit 2 (UPEn) : USARTn Parity Error• 수신 버퍼에 현재 저장되어 있는 데이터를 수신하는 동안 Parity Error 가
발생했음을 나타 냄• 수신 버퍼 UDRn 을 읽을 때까지 유효 , UCSRnA 를 Write 하면 무조건 0 으로
Clear 됨
16
USART REGISTER• USARTn Control & Status Register A – USCRnA (Cont’)
– Bit 1 (U2Xn) : Double the USARTn Transmission Speed)• 비동기 모드에서만 유효• USARTn Port 의 클록 분주비를 16 에서 8 로 절반만큼 낮추어 전송속도를 2 배
높이는 기능을 수행
– Bit 0 (MPCMn) : USARTn Multi-Processor Communication Mode)• USARTn 을 Multi-Processor Communication Mode 로 설정• Multi-Processor Communication Mode 에서는 Address 정보를 포함하지 않는
모든 수신 데이터는 수신부에서 무시 됨• 송신부는 이 Bit 에 영향을 받지 않음
17
USART REGISTER• USARTn Control & Status Register B – UCSRnB
– USARTn Port 의 송수신 동작을 제어하거나 , 전송 데이터를 9Bit 로 설정한 경우 전송 데이터의 9 번째 Bit 값을 저장하는 기능
– Bit 7 (RXCIEn) : USARTn RX Complete Interrupt Enable• Receive Complete Interrupt 를 개별적으로 허용하는 Bit
– Bit 6 (TXCIEn) : USARTn TX Complete Interrupt Enable• Transmit Complete Interrupt 를 개별적으로 허용하는 Bit
– Bit 5 (UDRIEn) : USARTn Data Register Empty Interrupt Enable• Data Register Empty Interrupt( 송신에서만 발생 ) 를 개별적으로 허용하는 Bit
– Bit 4 (RXENn) : USARTn Receiver Enable• USARTn Port 의 수신부가 동작하도록 허용• RXDn 핀이 병렬 I/O Port 가 아니라 Serial Data Receive Port 로 동작하게
바꾸고 , FEn, DORn, UPEn 의 동작을 유효하게 함
18
USART REGISTER• USARTn Control & Status Register B – UCSRnB
– Bit 3 (TXENn) : USARTn Transmitter Enable• USARTn Port 의 송신부가 동작하도록 허용• RXDn 핀이 병렬 I/O Port 가 아니라 Serial Data Transmit Port 로 동작하도록
설정하지만 , 이 Bit 를 0 으로 설정하더라도 송신 시프트 레지스터에 데이터가 남아 있을 경우 이것이 전송 완료 될 때까지 유효하지 않음
– Bit 2 (UCSZn2) : USARTn Character Size• UCSRnC 레지스터의 UCSZn1-0 비트와 함께 전송 문자의 데이터 Bit 수를
설정하는데 사용
– Bit 1 (RXB8n) : USARTn Receive Data Bit 8• 전송 문자가 9Bit 로 설정 된 경우 수신된 문자의 9 번째 Bit (MSB) 를 저장• 반드시 UDRn 레지스터보다 먼저 읽혀져야 함
– Bit0 (TXB8n) : USARTn Transmit Data Bit 8• 송산할 문자의 9 번째 Bit (MSB) 를 저장 , 반드시 UDRn 레지스터보다 먼저
Write 해야 함
19
USART REGISTER• USARTn Control & Status Register C – UCSRnC
– USARTn Port 의 송 / 수신 동작을 제어하는 기능을 수행
– Bit 6 (UMSELn) : USARTn Mode Select• 1 : Synchronous Operation• 0 : Asynchronous Operation
– Bit 5-4 (UPMn1-0) : USARTn Parity Mode)• USARTn Port 에서 Parity Mode 를 설정
– Bit 3 (USBSn) : USARTn Stop Bit Select• 1 : USARTn Port 에서 데이터 포맷을 구성하는 Stop Bit 를 두 개로 설정• 0 : USARTn Port 에서 데이터 포맷을 구성하는 Stop Bit 를 한 개로 설정
20
UPMn1 UPMn0 Parity Mode
0 0 Disabled
0 1 (Re-served)
1 0Enabled, Even Par-
ity
1 1Enabled, Odd Par-
ity
UPMn Bit Settings
USART REGISTER• USARTn Control & Status Register C – UCSRnC (Cont’)
– Bit 2-1 (UCSZn1-0) : (USARTn Character Size)• UCSRnB 레지스터의 UCSZn2 와 함께 전송 문자의 데이터 비트수를 설정
– Bit 0 (UCPOLn) : USARTn Clock Polarity)• 동기 모드에서 송 / 수신의 동작 Edge 를 결정
21
UCSZn2 UCSZn1 UCSZn0 Charac-ter Size
0 0 0 5 Bit
0 0 1 6 Bit
0 1 0 7 Bit
0 1 1 Re-served
1 0 0 Re-served
1 0 1 Re-served
1 1 0 Re-served
1 1 1 9 Bit
UCPOLn
Transmitted Data Changed
Received Data Sampled
0 Rising XCKn Edge Falling XCKn Edge
1 Falling XCKn Edge Rising XCKn Edge
UCPOLn (Bit 0) Bit Settings
UCSZn Bit Settings
USART REGISTER• USARTn Baud Rate Register – UBRRnH/L
– UARTn Port 의 송 / 수신 속도를 설정하는 기능을 수행 (Clock 의 분주비 – Baud Rate 결정 )
22
USART REGISTER• USARTn Baud Rate Register – UBRRnH/L (Cont’)
23
동작 모드 보레이트를 결정하는 공식
UBRR 값을 결정하는 공식
비동기 일반 모드(U2Xn = 0)
비동기 2 배속 모드(U2Xn = 1)
동기 마스터 모드
USARTn Port 에 대한 Baud Rate 설정 공식
Baud Rate 에 따른 UBRn 레지스터의 설정 Baud Rate 에 따른 Error 값 계산 공식
비동기 모드에서 1 비트의 샘플링 동작• ATmega128 의 비동기 전송 모드에서는 수신 데이터의 정확한 검출을
위하여 16 배의 주파수 혹은 8 배의 주파수를 사용하여 데이터 샘플링을 함– 일반 모드 : 데이터 샘플링에 사용되는 주파수를 Baud Rate 의 16 배의
주파수 사용– 2 배속 모드 : 데이터 샘플링에 사용되는 주파수를 Baud Rate 의 8 배의
주파수 사용– 1 Bit 의 데이터를 Sampling 시 , Clock 주파수의 어느 정도 오차가 있어도
검출의 정확도를 높일 수 있음
• Start Bit Sampling (Clock Recovery Logic)– 전압 Spike 잡음에 의하여 데이터 수신 오류가 발생하는 것을 방지하기 위해
1Bit 를 3 차례 검출하는 방법을 사용
24
Nor-mal
Mode
Double Speed Mode
2 차례 이상 검출 된 논리 신호를 검출
결과로 . 함
비동기 모드에서 1 비트의 샘플링 동작• Sampling of Data and Parity Bit (Data Recovery Logic)
– Normal Mode : 16 state 의 State Machine 사용– Double Speed Mode : 8 state 의 State Machine 사용
• Stop Bit Sampling and Next Start Bit Sampling
25
Nor-mal
Mode
Double Speed Mode
2 차례 이상 검출 된 논리 신호를 검출
결과로 . 함
동기 된
Start 신호 or
이전 비트
Nor-mal
Mode
Double Speed Mode
2 차례 이상 검출 된 논리 신호를 검출
결과로 . 함
STOP! 이후 Fall-ing-Edge 가
발생하면 START 신호로 간주
비동기 모드에서 1 비트의 샘플링 동작• Stop Bit Sampling and Next Start Bit Sampling (Cont’)
– 전송속도에 비하여 수신부가 동작하는 속도가 너무 빠르거나 느리다면 올바른 데이터의 수신을 기대 할 수 없음
– 수신부의 동작에 비하여 허용 범위에서 가장 빠르게 입력되는 데이터의 전송 속도 비율
– 수신부의 동작에 비하여 허용 범위에서 가장 느리게 입력되는 데이터의 전송 속도 비율
• D Parity 와 Data Bit 의 합 (D = 5 to 10-bit)• S Samples per bit.
Normal Mode – 16, Double Speed Mode - 8• SF Bit 를 검출하기 위해 Sampling 하는 횟수의 첫 번째 순서 값
Normal Mode – 8, Double Speed Mode - 4• SM Bit 를 검출하기 위해 Sampling 하는 횟수의 중간 순서 값
Normal Mode – 9, Double Speed mode - 5
26
비동기 모드에서 1 비트의 샘플링 동작• Stop Bit Sampling and Next Start Bit Sampling (Cont’)
– 직렬통신 포트의 전송 속도를 설정 할 경우에 올바른 전송이 보장되려면 아래 표에 제시 된 권장 허용 오차 범위 이내로 설정하는 것이 바람직
– 비동기 직렬 통신 방식은 송신측과 수신측의 Clock 주파수에 다소 차이가 있더라도 무난하게 통신이 수행된다는 것이 가장 큰 장점
27
Recommended Maximum Receiver Baud Rate Error for Normal Speed Mode (U2X = 0)
Recommended Maximum Receiver Baud Rate Error for Double Speed Mode (U2X = 1)
Multi-Processor Communication Mode• 1 개의 Master Processor 가 여러 개의 Slave Processor 에게 특정한
Address 를 전송함으로써 1 개의 Slave 만을 지정하여 Data 를 전송하는 동작 모드
• Multi-Processor Communication Mode 의 동작 순서1. Master 인 송신측에서 1 문자를 9-bit 를 사용하는 Frame 으로 설정 , 여러
개의 Slave 로 구성되는 수신측은 9bit Frame 을 사용하는 것은 물론 USCRnA REG 의 MPCMn Bit 를 1 로 지정하여 Address Frame 이 수신되기를 기다림
2. 마스터는 8 개의 Data Bit 에 Address Frame 과 9 번째 Bit 에 TXB8n = 1 로 만든 Address Frame 을 전송
3. 모든 Slave 는 Address Frame 을 수신하여 자신에 해당하는 Address 인지 확인 후 , 그것에 해당하는 하나의 Slave 만 MPCMn Bit 를 0 으로 Clear하여 이후에 전송 될 Data Frame 을 수신 할 수 있도록 하고 , 다른 Slave들은 계속해서 MPCMn Bit 를 1 로 유지
4. Master 의 Data Frame 은 8 개의 Data Bit 와 9 번째 Bit 를 TXB8n = 0으로 하여 구성 되고 , 선택 된 Slave 는 모든 Data Frame 을 수신하고 , 이것이 완료되면 다시 MPCMn = 1 로설정하여 Address Fram 의 수신 대기 상태로 들어 감
28
ETC
Baud rate 와 bps 의 차이• Baud rate ( 프랑스의 과학자 Jean Maurice Emile Baudot 의 이름에서
유래 )– 신호의 변조율– 데이터 통신의 초기에는 bps = Baud (1 번 변하는 신호에 1 번의 전송 )– 짧은 시간에 많은 데이터를 전송하기 위해 , 신호가 한번 변할 때 여러 Bit 를
전송하게끔 ( 신호가 한번 바뀔 때 , 두 Bit 이상을 표현하게 됨 )– 현재는 bps > Baud rate ( 항상 큰 것은 아니나 bps 가 커야 성능면에서
의미가 있음 )– Baud = 1/T ( 신호 요소의 시간 )
• bps (Bit Per Second)– 초당 전송되는 비트 수를 나타냄– Bps = baud * number of bits per baud– Ex) 9600bps = 1초 동안 9,600 개의 bit 를 전송
• Example (맨체스터 코딩 )– 신호 요소 시간 = 0.5ms– 변조 속도 = 1 / 0.5ms = 2Kbaud / sec– 전송 속도 = bps = 2Kbaud * 0.5 number of bits per baud = 1Kbps
30
RS-232C Serial Communication
RS-232C Overview• RS-232C (Recommend Standard number 232 C)
– 디지털 데이터 통신회선으로 전화선을 사용하기 위해 1962년 EIA 에서 DTE 와 DCR 사이에 데이터 전송용으로 제정한 통신 권고규격
• RS-232C 의 필요성• USART 직렬 통신 포트를 거쳐 직렬 데이터로 변환 되어도 TTL 로직 레벨의 신호• 이 TTL 신호를 입력 받아 잡음에 강하고 멀리 갈 수 있게 해주는 인터페이스가 필요
• 이 인터페이스를 Line Driver / Receiver 라 부르며 , 대표적인 것이 RS-232C, RS-422A, RS-485 임
32
Data Terminal Equipment Data Communications Equipment
RS-232C Spec• RS-232C 의 전기적 사양
– RS-232C 규격에서는 25 핀과 9킨 커넥터에 데이터 신호와 핸드세이킹 신호들을 지정하고 이들 신호명은 물론 각 신호들의 전기적인 사양까지 자세하게 규정하고 있음
• RS-232C 케이블 길이– RS-232 규격의 케이블 길이는 약 150cm– 오른쪽 표 이상의 길이 이상의 케이블 사용의– 경우 신호 증폭기나 Optical Isolator 를 사용
33
Specification RS232C RS423 RS422 RS485
동작 모드 Single-Ended
Single-Ended Differential Differential
최대 Driver/Receiver 수
1 Driver 1 Receiver
1 Driver 10 Re-
ceivers 1 Driver
32 Receivers 32 Drivers
32 Receivers
최대 통달거리 약 15 m 약 1.2 km 약 1.2 km 약 1.2 km 최고 통신속도 20 Kb/s 100 Kb/s 10 Mb/s 10 Mb/s 지원 전송방식 Full Duplex Full Duplex Full Duplex Half Duplex
최대 출력전압 ±25V ±6V -0.25V to +6V -7V to +12V
최대 입력전압 ±15V ±12V -7V to +7V -7V to +12V
Rs-232C 및 기타 통신 방식의 전기적인 사양 요약
Baud Rate Shielded Cable Non Shielded Cable
110 1500m 300m300 1200m 300m
1200 900m 150m2400 600m 150m4800 150m 75m9600 75m 30m
RS-232C 신호의 기능 및 커넥터 구조 • RS-232C 커넥터 구조
– RS-232C 에 표준으로 사양되는 D형 커넥터는 반드시 DTE 측에 수컷을 사용하고 , DCE 측에 암컷을 사용해야 함
– DB-25 커넥터는 사실상 사용하지 않는 핀이 많고 부피가 크기 때문에 , 대부분 DB-9 라고 불리는 9 핀 D형 커넥터를 사용 함
• RS-232C 신호의 기능
34
신호 이름
I/O 기 능
TxD O Transmitter Data : DTE 에서 직렬로 송신하는 출력 데이터 신호
RxD I Receiver Data : DTE 에서 직렬로 수신하는 입력 데이터 신호
DTR O Data Terminal Ready : DTE 가 송수신이 가능한 Ready 상태에 있음을 DCE에게 알려주는 신호 . 이를 L 상태로 하면 모뎀이 회선과 접속되고 , H 상태로 하면 모뎀이 회선과 단절 됨
DSR I Data Set Ready : DCE 가 동작 가능한 상태에 있음을 DTE 에게 알려주는 신호 . 즉 , DTR 신호에 의하여 모뎀을 회선과 접속하고 DTE 에게 응답하는 신호임
RTS O Request To Send : DTE 가 DCE 에 대하여 송신할 데이터가 있음을 알려주는 신호 . 이 신호가 L 상태인 동안에만 DCE 는 회선에 캐리어를 출력
CTS I Clear to Send : DCE 가 RTS 신호를 받고 회선에 캐리어를 출력하여 데이터를 송신 할 수 있는 상태에 있음을 DTE 에 알려주는 신호 . 즉 , 이는 RTS 신호에 의하여 회선에 캐리어를 출력하기 시작하고 DTE 에게 응답하는 신호
DCD I Carrier Detect : 상대방에서 송신되어 오는 캐리어를 검출하였음을 나타내는 신호 . 실제로 데이터를 수신하는 것은 이 신호가 L 상태로 된 이후 임
RI I Ring Indicator : DCE 가 회선에서 호출 신호를 받으면 액티브 되는 신호※ I/O 는 DTE 측을 기준으로 하여 표현
RS-232C 신호선의 접속• 컴퓨터 (DTE) 와 모뎀 (DCE) 을 접속할 경우
35
신호선의 접속
제어신호의 동작 (Half-Duplex)
RS-232C 신호선의 접속• 컴퓨터 (DTE) 와 컴퓨터 (DTE) 를 직접 접속할 경우
– DTE 사이의 전송거리가 15m 이하로 짧아서 전화선 및 모뎀이 필요 없는 경우
36
핸드세이킹 기능을 사용하지도 않고 핸드세이킹 신호를 접속하지도 않는 경우 .마이크로 컨트롤러에서 가장 널리 사용하는 방식
핸드세이킹 기능을 사용하며 하드웨어적으로 핸드세이킹 신호선에 이에 맞도록 접속하는 경우
제어논리에서는 핸드세이킹 기능을 사용하지만 실제로는 핸드세이킹 신호선을 접속하지 않고 이에 필요한 제어신호를 루프백시켜 마치 상대측이 레디 상태에 있는 것처럼 처리해주는 경우
USART Source Code
Program Pinout
38
특수 기능
범용 포트
LED / Output
Address Bus / Output
ADC / Input
Address & Data Bus / Output
USART / InOut
Transmitter Source#define F_CPU 16000000 //Clock Frequency : to use util/delay.h#define EX_SS_DATA (*(volatile unsigned char *)0x8002) //7seg
data#define EX_SS_SEL (*(volatile unsigned char *)0x8003) //7seg
digit#define EX_SS_SW (*(volatile unsigned char *)0x0036) //Switch#define led_out (*(volatile unsigned char *)0x8008)
#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>
const char segment_data[10] = {63, 6,91,79,102,109,125,39,127,103};
unsigned char display_num[4]={0,0,0,0}; //7segment digitunsigned char digit_num=0;volatile unsigned char adc_value = 0; //ADC Converted Value
void port_init(void){
PORTA = 0x00; DDRA = 0xFF; //1 출력 0 입력 to 7segment, led PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x0F; //Low 8bit output to 7segment,
led PORTD = 0x00; DDRD = 0x00; PORTE = 0x00; DDRE = 0x02; //TX Pin, output to USART PORTF = 0x00; DDRF = 0x00; //PortF is Input from ADC PORTG = 0x00; DDRG = 0x00;}
39
// TIMER0 initialize : prescale:64// WGM: Normal Mode// desired Clock : 1KHz// actual value : 1ms void timer0_init(void){
ASSR = 0x00; //set async mode TCNT0 = 0x06; //set count for 6 to 255
OCR0 = 0x00; TCCR0 = 0x04; //prescale 64}
// Timer0 Overflow Interrupt Service Routine ISR(TIMER0_OVF_vect){ TCNT0 = 0x06; //reload counter value digit_num++; digit_num = digit_num % 4; //get Digit Selection Number EX_SS_DATA = segment_data[display_num[digit_num]]; //get segment data EX_SS_SEL = ~(0x01 << digit_num); //Digit Selection}
// USART0 Transmit Complete Interrupt Service RoutineISR(USART0_TX_vect){
UDR0 = adc_value;}
Transmitter Source/
********************************************************************
/ UDR0 / -/ UCSR0A/ Bit 7 : RXC0 - Receive Complete (Req Recive Complete INT)/ Bit 6 : TXC0 - Transmit Complete (Req Transmit Complete INT)/ Bit 5 : UDRE0 - Data Register Empty (trabsmit buffer empty INT)/ Bit 4 : FE0 - Fame Error/ Bit 3 : DOR0 - Data Overrun Error/ Bit 2 : UPE0 - Parity Error/ Bit 1 : U2X0 - Double Speed Mode/ Bit 0 : MPCM0 - Multi-Processor Communication Mode
/ UCSR0B/ Bit 7 : RXCIE0 - RX Complete INT Enable/ Bit 6 : TXCIE0 - TX Complete INT Enable/ Bit 5 : UDRIE0 - Data REG empty INT Enable/ Bit 4 : RXEN0 - Receiver Enable/ Bit 3 : TXEN0 - Transmitter Enable/ Bit 2 : UCSZ0n - Character size 2/ Bit 1 : RXB80 - Receive Data Bit 8 (MSB)/ Bit 0 : TXB80 - Transmit Data Bit 8 (MSB)
40
/ UCSR0C/ Bit 7 : Reserved/ Bit 6 : UMSEL0 - Mode Select (1 - Sync, 0 - Async)/ Bit 5 : UPM0 - Parity Mode (00 - Disable, 01 - reserved)/ Bit 4 : (10 - even , 10 - odd )/ Bit 3 : USBS0 - Stop Bit Select (0 - 1, 1 - 2)/ Bit 2 : UCSZ0n - Character size (000 - 5bit,001 - 6bit,010 - 7bit)/ Bit 1 : (011 - 8bit,111 - 9bit,etc - reve)/ Bit 0 : UCPOL0 - Clock Plarity (in Sync mode)
/ UBRR0H/L/ -******************************************************************
**/
//USART0 initialize function// desired baud rate: 9600// actual: baud rate:9615 (0.2%)// char size: 8 bit// parity: Disabledvoid usart0_init(void){
UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; //INT clear, Error clear, Non 2speed & MPCM UCSR0C = 0x06; //8bit char size, 0000_0110 UBRR0H = 0x00; //set baud rate hi, must be post write high
byteUBRR0L = 0x67; //set baud rate lo, 103 dec = 9600 baud rate
UCSR0B = 0x48; //TX enable, TX INT enable : 0100_1000}
Transmitter Source/
*********************************************************************
// ADCSRA// Bit 7 : ADEN - ADc ENable// Bit 6 : ADSC - ADc Start Conversion// Bit 5 : ADFR - ADc Free-Running selection// Bit 4 : ADIF - ADc Interrupt Flag// Bit 3 : ADIE - ADc Interrupt Enable// Bit 2 : ADPS - ADc Prescaler Select // Bit 0 : 2 to 0
// ADMUX// Bit 7 : REFS - Reference Selection (default 01 - Ext. AVCC) // Bit 6 : 7 to 6// Bit 5 : ADLAR - ADc Left Adjust Result// Bit 4 : MUX - Analog Channel and Gain Selection (default 00xxx)// Bit 0 : 4 to 0******************************************************************
****/void adc_init(void){
ADCSRA = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ACSR = 0x80; //set Analog Comparator disable ADCSRA = 0xC6; //set ADCSRA 1100_0110}
41
//call this routine to initialize all peripheralsvoid init_devices(void){ //stop errant interrupts until set up
asm("cli"); //disable all interrupts port_init(); adc_init(); timer0_init();
usart0_init();
MCUCR = 0x80; //enable int TIMSK = 0x01; //timer interrupt sources (MASK) T/C0 Ovf flag asm("sei"); //re-enable interrupts}void startConvertion(unsigned char ch){
ADMUX = 0x60 | ch; //Channel SelectionADCSRA = ADCSRA | 0xc0; //Enable ADC & Start ADC
}
unsigned char readConvertData(void){
volatile unsigned char temp = 0;
while((ADCSRA & 0x10)==0); //wait ADC Complete INTtemp = ADCL; //ignore Lower 2-bittemp = ADCH; //get Upper 8-bit
return temp; }
Transmitter Sourceint main() {
volatile unsigned char sw;
init_devices();EX_SS_SW = 0;
UDR0 = 0xFF;
while(1) {
if(EX_SS_SW & 0xF) {
switch(EX_SS_SW){
case 1: sw = 0; break;
case 2: sw = 1; break;
case 4: sw = 2; break;
case 8: sw = 3; break;
}led_out = EX_SS_SW;
}startConvertion(sw); //sw is ADC input
Channeladc_value = readConvertData();
display_num[0] = (adc_value % 10000) / 1000;
display_num[1] = (adc_value % 1000) / 100;display_num[2] = (adc_value % 100) / 10;display_num[3] = (adc_value % 10); _delay_ms(1000);
}}return 0;
}
42
Receiver Source#define F_CPU 16000000 //Clock Frequency : to use util/
delay.h
#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>
const char segment_data[10] = {63, 6,91,79,102,109,125,39,127,103};
unsigned char display_num[4]={0,0,0,0}; // Seven segment 4 자리 숫자 출력 버퍼
unsigned char digit_num=0;volatile unsigned char get_val = 0; //usart0 receive value
void port_init(void){ PORTA = 0x00; DDRA = 0xFF; //7SEG Data, output PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x0F; //7SEG Digit Select, output PORTD = 0x00; DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; //USART0 RX pin is input PORTF = 0x00; DDRF = 0x00; PORTG = 0x00; DDRG = 0x00;}
43
//TIMER0 initialize - prescale:64// WGM: Normal// desired value: 1KHz// actual value: 1.000KHzvoid timer0_init(void){ TCCR0 = 0x00; //stop ASSR = 0x00; //set async mode TCNT0 = 0x06; //set count OCR0 = 0x00; TCCR0 = 0x04; //prescaler /64}
void usart0_init(void){
UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; //INT clear, Error clear, Non 2speed & MPCM UCSR0C = 0x06; //8bit char size, 0000_0110 UBRR0H = 0x00; //set baud rate hi, must be write high byte
UBRR0L = 0x67; //set baud rate lo, 103 dec = 9600 baud rate
UCSR0B = 0x90; //RX enable 1001_0000}
Receiver Source//timer0 ovf interrupt service routineISR(TIMER0_OVF_vect){ TCNT0 = 0x06; //reload counter value digit_num++; digit_num = digit_num%4; PORTC = 0x0f; PORTA = segment_data[display_num[digit_num]]; PORTC = ~(0x01 << digit_num);}
//receive complete interrupt service routineISR(USART0_RX_vect){
get_val = UDR0;}
//call this routine to initialize all peripheralsvoid init_devices(void){ //stop errant interrupts until set up asm("cli"); //disable all interrupts port_init(); timer0_init(); usart0_init();
MCUCR = 0x00; TIMSK = 0x01; //timer interrupt sources asm("sei"); //re-enable interrupts //all peripherals are now initialized}
44
int main(void){
init_devices();
//Recieve Value print out while(1){
display_num[0] = (get_val % 10000) / 1000; display_num[1] = (get_val % 1000) / 100; display_num[2] = (get_val % 100) / 10; display_num[3] = (get_val % 10); _delay_ms(1000);
}}
Memory Map
Memory Map
46
Interrupt Vector
AT-mega128 Init_FuncsPort_init()
Timer0_init()
ADC_init()
Usart0_init()
Init_devices()
Start_convert()
readCon-vert
Data()ISR(TIMER0_OVF_VECT
)ISR(USART0_TX_VECT
)Main()
Library_funcs
_exit()
_stop_program
0x0000_0000 ~ 0x0000_0088
0x0000_008C ~ 0x0000_00CA
0x0000_00CE ~ 0x0000_00F8
0x0000_00FA ~ 0x0000_0106
0x0000_0108 ~ 0x0000_0114
0x0000_0116 ~ 0x0000_012C
0x0000_012E ~ 0x0000_015C ※ Init 과 동시에 수행되는 함수들의 경우 이 곳에 Asm Code 가 포함이 됨 (adc_init, timer0_init)나머지는 call func_address 의 형태를 가짐 (port_init, usart0_init)
132: 0e 94 67 00 call 0xce ; 0xce <port_init>// Bit 4 : MUX - Analog Channel and Gain Selection (default 00xxx)// Bit 0 : 4 to 0**********************************************************************/void adc_init(void){
ADCSRA = 0x00; //disable adc 136: 16 b8 out 0x06, r1 ; 6 ADMUX = 0x00; //select adc input 0 138: 17 b8 out 0x07, r1 ; 7 ACSR = 0x80; //set Analog Comparator disable 13a: 10 e8 ldi r17, 0x80 ; 128 13c: 18 b9 out 0x08, r17 ; 8 ADCSRA = 0xC6; //set 1100_0110 // 더미 수행 . 13e: 86 ec ldi r24, 0xC6 ; 198 140: 86 b9 out 0x06, r24 ; 6
0x0000_015E ~ 0x0000_0168
0x0000_016A ~ 0x0000_018A
0x0000_018C ~ 0x0000_01FA Interrupt Vector 16
Interrupt Vector 200x0000_01FC ~ 0x0000_0218
0x0000_021A ~ 0x0000_02FA
0x0000_02FC ~ 0x0000_0360
0x0000_0362 ~ 0x0000_0362
0x0000_0364 ~ 0x0000_0364
Test
Diagram
48
Interrupt VectorAT-
mega128 Init_Funcs
Port_init()
Timer0_init()
ADC_init()
Usart0_init()
Start_convert()
readCon-vert
Data()
ISR(TIMER0_OVF_VECT
)
ISR(USART0_TX_VECT
)
_exit()
Main()Init_devices()
7Seg_data set
TX_Complete_INT
Timer0_Ovf_INT
If(Switch On)
Change ADC Chan-
nel
WaitADC_Complete
INT
SP Configura-tion
Data Copy Etc.
Timer0Count
USART0 Transmit
Background Operation
Interrupt Occur
R_ADMUX (refVCC, Channel)
R_ADCSRA (ADC Start)
R_ARCSRA(ADC_COMP INT)R_ADCL. ADCH
(ADC Result)
R_TCNT0(Timer0 Counter)
R_UDR0(Transmit buffer)
ADCConverter
R_ADCL/H(ADC Result)
ADC Complete Interrupt Occur
Using 7Seg_data for 7seg Display
ADC Operation Time• KT-M128 Clock Speed : 16Mhz
– 1 / 16,000,000 = 0.000 000 0625s = 0.0625us– 각 프리스케일러별 Clcok 주기
• 2 = 0.000,000,125s = 125ns = 0.125us (8Mhz)• 8 = 0.0,000,005s = 0.5us (2Mhz)• 16 = 0.000,001s = 1us (1Mhz)• 32 = 0.000,002s = 2us (0.5Mhz)• 64 = 0.000,004s = 4us (0.25Mhz)• 128 = 0.000,008s = 8us (0.125Mhz)
• Total Operating Time– Normal Conversions, single ended = 14.5 Clock– 각 프리스케일러별 ADC 연산에 필요한 총 소모 시간 (() : Cycle)
• 2 = 125ns * 14.5 = 0.0,000,018,125s = 1812.5ns = 1.8125us (26)• 8 = 0.5us * 14.5 = 0.000,007,25s = 7.25us (104)• 16 = 1us * 14.5 = 0.000,014,5s = 14.5us (208)• 32 = 2us * 14.5 = 0.000,029,0s = 29.0us (416)• 64 = 4us * 14.5 = 0.000,058s = 58us (832)• 128 = 8us * 14.5 = 0.000,116s = 116us (1664) 49
ADC Prescaler
ADC Operating Cycle
※ ADC 에서 Sampling 시 데이터의 손실이 발생하지 않기 위해서는 최대 128 * 13 Cycle (1664) 이내에 ADC 의 결과를 가지고 하는 모든 연산을 끝내야 한다 .
Program Timing
50
tPrevious Convert
ADCComplete
Next Convert
Get ADC Result
7segDisplay ADC_Complete
If(SW_ON)Change Channel
StartConvert
Read Convert Data Get ADC Result
tADC
STARTADC
CompleteEach 1msTimer0 ovfInterrupt
Timer0 ovfInterrupt
Each 1msTX CompInterrupt
Main Loop
Background
0.001(1ms) / 0.000 0000625 (16Mhz) = 16000 cycleUSART Baud Rate : 96001 / 9600 = 0.0001sec0.0001 * 10bit = 0.001 = 1ms
Each 1msTX CompInterrupt
7.1875us115 clk
24.1875us387 clk
2.125us34 clk
0.4375us7 clk
7.1875us115 clk
모듈 별 소모 Clock
51
Interrupt Vector
AT-mega128 Init_Funcs
Port_init()
Timer0_init()
ADC_init()
Usart0_init()
Start_convert()
readCon-vert
Data()
ISR(TIMER0_OVF_VECT
)
ISR(USART0_TX_VECT
)
_exit()
Main()Init_devices()
7Seg_data set
TX_Complete_INT
Timer0_Ovf_INT
If(Switch On)
Change ADC Chan-
nel
WaitADC_Complete
INT
Timer0Count
USART0 Transmit
Background
Interrupt Occur
약 (45)
(10) (15)
(31 + (25) + (15)) = 71
(7)
(33)
(13)
(25) (10)
(33)
(34)
(387)
(83)
(751)
(5 * X)
(654)※ 프리스케일러별 샘플링 주기 2 : 26 8 : 104 16 : 208 32 : 416 64 : 832 128 : 1664
※ Main loop 및 ISR 소비 클럭 654 + 83 + 13 = 750
Pre-scaler : 64832(sampling time) – 654 (Main loop) – 96(ISRs) = 82 / 5 = 16.4
ADCConverter
결론• ADC 의 샘플링 주기를 위해 ADC 의 프리스케일러는 64 이상으로
설정해야 함
• USART 의 전송속도가 ADC Convert 속도보다 느림– Baud Rate 를 9600 의 1.5 배 이상으로 설정해야 함– 혹은 ADC 의 프리스케일러를 128 로 설정 ( 시간이 조금씩 밀리긴 함 )
52
USART Baud Rate : 96001 / 9600 = 0.0001sec
0.0001 * 10bit = 0.001 = 1ms
0.001(1ms) / 0.000 0000625 (16Mhz) = 16000 cycle
프리스케일러별 샘플링 주기 (cycle)
2 : 26 8 : 104 16 : 208 32 : 416 64 : 832
128 : 1664
Optimize Option• Project -> Configuration Options -> Optimization
53
Optimize Option
54
Optimization : -O0No Optimization
Optimization : -O1Reduce code size and execute time, without performing any optimization
Optimization : -O2The compiler does not perform loop Unrolling or function inling.
Optimization : -OsOptimize for Code size. -Os enables all –O2 optimizations that do not typically increase code size.
Reference : C:\WinAVR-20100110\doc\gcc\HTML\gcc-4.3.2\gcc\Optimize-Options
환경 설정
56
1
32
57