728x90
반응형
오늘은 ATMEGA128의 USART에 대하여 수업하였음
ATMEGA128은 USART0, USART1 두개를 가지고 있다
하지만 우리가 수업에 사용하는 DK-128은 USART1만 직렬포트로 연결해놨기 때문에
레지스터 설정은 USART1로 설정해서 사용하였음
먼저 USART에 대하여
Universal Synchronous and Asynchoronous serial Receiver and Transmitter의 약자로
범용 동기/비동기식 직렬 송/수신기란 뜻을 가지고 있다
직렬과 병렬통신에 대하여(인터넷 블로그 참조)
직렬 통신 : 송/수신 측 장비들 간에 하나의 전송 선로만 존재하며 한 순간에 한 비트의 데이터만을
병렬 통신 : 송/수신 측 장비들 간에 여러개의 전송 선로가 존재하여 여러 비트의 데이터를 한꺼번에
동기식(Synchronous) : 기준 클럭인 동기 클럭 라인이 있고, 데이터 송수신에 필요한 라인이 있다. 즉, 동기 클록에 동기해서 데이터를 순차적으로 송/수신 하는 방법. 높은 전송 효율을 필요로 하며, 선로에 노이즈가 있거나 장거리 전송에 유리하며, 대량의 데이터를 고속으로 전송하는 데 사용된다.
비동기식(Asynchoronous) : 동기 클럭 없이 데이터를 송수신 한다. 동기 클럭이 사용하지 않으므로 이를 대신하는 것이 필요한데 그것이 Baudrate(1초에 신호를 전자적으로 변환하는 회수. bps와 다르다는 것에 유의한다. bps는 1초에 전송되는 신호의 비트수를 나타낸다)다. 이로 인해 송/수신기는 약속된 속도로 데이터를 주고 받을 수 있다. 이 모드로 데이터를 보내기 위해서는 제어 비트가 필요하다. Start bit와 Stop bit가 있다.
설정 레지스터로는(n은 0이나 1이 들어간다)
UDRn : 송수신 데이터 레지스터, 물리적으로 다른 송신 데이터 레지스터와 수신 데이터 레지스터가 존재하지만 같은 레지스터 주소를 가진다.
#define CPU_CLOCK 16000000
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1
#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8
//문자 전송함수
int main(void)
{
unsigned char buf[]="노준이 짱!";
unsigned int i;
UBRR1L=(unsigned char) BAUD_RATE_L;
UBRR1H=(unsigned char) BAUD_RATE_H;
세번째 실습은 양방향 통신으로 PC에서 char형 숫자를 전송하면 2진수에 대응하는 LED점등
PC에서 문자 입력받는 함수
unsigned char USART_Receive(void)
{
while(!(UCSR1A&(1<<RXC)));
return UDR1;
}
입력받은 문자를 LED제어신호로 바꾸는 코드
unsigned char ch=USART_Receive();
PORTF=ch^0xFF;
네번째 실습은 문자열을 전송할수 있는 함수 구현
void uart_send_byte(unsigned char* byte)
{
while(*byte != '\0')
{
while(!(UCSR1A&(1<<UDRE)))
{
}
UDR1=*byte;
byte++;
}
}
ATMEGA128은 USART0, USART1 두개를 가지고 있다
하지만 우리가 수업에 사용하는 DK-128은 USART1만 직렬포트로 연결해놨기 때문에
레지스터 설정은 USART1로 설정해서 사용하였음
먼저 USART에 대하여
Universal Synchronous and Asynchoronous serial Receiver and Transmitter의 약자로
범용 동기/비동기식 직렬 송/수신기란 뜻을 가지고 있다
직렬과 병렬통신에 대하여(인터넷 블로그 참조)
직렬 통신 : 송/수신 측 장비들 간에 하나의 전송 선로만 존재하며 한 순간에 한 비트의 데이터만을
전송할 수 있는 방식
병렬 통신 : 송/수신 측 장비들 간에 여러개의 전송 선로가 존재하여 여러 비트의 데이터를 한꺼번에
전송할 수 있는 방식
직렬 통신 | 병렬 통신 |
비용이 저렴하다 | 비용이 다소 많이든다 |
속도가 느리다 | 속도가 빠르다 |
통신 거리에 대한 제한이 비교적 자유롭다 | 통신 거리에 제약이 생긴다 |
RS-232 | 대량 데이터 통신 (하드 디스크) |
동기식(Synchronous) : 기준 클럭인 동기 클럭 라인이 있고, 데이터 송수신에 필요한 라인이 있다. 즉, 동기 클록에 동기해서 데이터를 순차적으로 송/수신 하는 방법. 높은 전송 효율을 필요로 하며, 선로에 노이즈가 있거나 장거리 전송에 유리하며, 대량의 데이터를 고속으로 전송하는 데 사용된다.
비동기식(Asynchoronous) : 동기 클럭 없이 데이터를 송수신 한다. 동기 클럭이 사용하지 않으므로 이를 대신하는 것이 필요한데 그것이 Baudrate(1초에 신호를 전자적으로 변환하는 회수. bps와 다르다는 것에 유의한다. bps는 1초에 전송되는 신호의 비트수를 나타낸다)다. 이로 인해 송/수신기는 약속된 속도로 데이터를 주고 받을 수 있다. 이 모드로 데이터를 보내기 위해서는 제어 비트가 필요하다. Start bit와 Stop bit가 있다.
설정 레지스터로는(n은 0이나 1이 들어간다)
UDRn : 송수신 데이터 레지스터, 물리적으로 다른 송신 데이터 레지스터와 수신 데이터 레지스터가 존재하지만 같은 레지스터 주소를 가진다.
UCSRnA
Bit7(RXCn : USARTn Receive Complete) : 수신 버퍼에 읽혀지지 않은 수신 문자가 들어 있으면 1, 수신 버퍼가 비어 있다면 0으로 Set되는 상태 플랙.
Bit7(RXCn : USARTn Receive Complete) : 수신 버퍼에 읽혀지지 않은 수신 문자가 들어 있으면 1, 수신 버퍼가 비어 있다면 0으로 Set되는 상태 플랙.
Bit6(TXCn : USARTn Transmit Complete) : 송신 시프트 레지스터에 있는 데이터가 모두 송신되고, 새 데이터가 입력되지 않으면 1로 Set되는 상태 플랙.
<1로 Set 될 경우 송신 완료 인터럽트 요청, 인터럽트가 처리되기 시작하면 이 비트는 자동으로 0으로 클리어 되고, 이 비트를 강제로 클리어 하려면 이 비트에 1을 라이트 한다>
Bit5(UDREn : USARTn Data Overrun Error) : UDRn의 수신 동작에서 오버런 에러가 발생함을 나타내는 상태 플랙
Bit4(FEn : USARTn Frame Error) : UDRn의 수신 버퍼에 저장되어 있는 데이터를 수신 하는 동안 프레임 에러가 발생하였음을 나타내는 상태플랙.
<수신 문자의 첫번째 스톱비트가 0으로 검출 되면 발생. UDRn을 읽을때 까지 유효하며, UCSRnA레지스터를 라이트하면 이 비트는 무조건 0으로 클리어>
Bit3(DORn : USARTn Data Overrun Error) : UDRn의 수신 동작에서 오버런 에러 발생을 나타내는 상태 플랙
Bit2(UPEn : USARTn Parity Error) : UDRN의 수신 버퍼에 현재 저장되어 있는 데이터를 수신하는 동안 패리티 에러가 발생하였음을 나타내는 상태플랙
Bit1(U2Xn) : 비동기 모드에서 클럭 분주비를 16에서 8로 낮추어 전송속도를 2배 높이는 기능.
Bit0(MPCMn : USARTn Multi-Processor Communication Mode) : USARTn을 멀티 프로세서 통신 모드로 설정.
*1개의 마스터 프로세서가 여러개의 슬레이브 프로세서에게 특정한 어드레스를 전송함으로써 1개의 슬레이브 만을 지정하여 데이터를 전송하는 동작 모드.
UCSRnB
USART 포트의 송수신 동작을 제어하거나, 전송 데이터를 9비트로 설장한 경우 전송 데이터의 9번째 값을 저장하는 기능을 수행.
UCSRnB
USART 포트의 송수신 동작을 제어하거나, 전송 데이터를 9비트로 설장한 경우 전송 데이터의 9번째 값을 저장하는 기능을 수행.
Bit7(RXCIEn : USARTn RX Complete Interrupt Enable) : 수신완료 인터럽트 개별 허용
Bit6(TXCIEN : USARTn TX Complete Interrupt Enable) : 송신완료 인터럽트를 개별적으로 허용
Bit5(UDRIEn : USARTn Data Register Empty Interrupt) : 송신 데이터 레지스터 준비완료 인터럽트를 개별적으로 허용
Bit4(RXENn : USARTn Receiver Enable) : USARTn 포트의 수신부가 동작하도록 허용
Bit3(TXENn : USARTn Transmitter Enable) : USARTn 포트의 송신부가 동작하도록 허용
Bit2(UCSZn2 : USARTn Character Size) : UCSRnC레지스터의 UCSZn1~0 비트와 함께 전송 문자의 데이터 비트수를 설정하는데 사용
Bit1(USARTn Character Size) : 전송 문자가 9비트로 설정된 경우 수신된 문자의 9번째 비트(MSB)를 저장한다. UDRn보다 반드시 먼저 읽혀야 한다.
Bit0(USARTn Transmit Data Bit8) : 전송 문자가 9비트로 설정된 경우 송신할 문자의 9번째 비트(MSB)를 저장한다. UDRn보다 반드시 먼저 읽혀야 한다.
UCSRnC
Bit5~4(UPMn1~0) : USARTn 포트의 패리티 모드를 설정한다.
<패리티 모드>
Bit2~1(UCSZn1~0 : USARTn Character Size) : UCSRnB 레지스터의 UCSZn2비트와 함께 USARTn 포트에서 전송 문자의 데이터 비트수를 설정한다.
Bit0(UCPOLn : USARTn Clock Polarity) : 동기 전송 모드에서 0으로 설정하면 TxDn 단자의 송신 데이터는 XCKn 클럭의 상승 에지에서 새로운 값 출력, RxDn 단자의 수신 데이터는 XCKn 클록 하강 에지에서 검출, 1로 설정하면 이와 반대로 설정 된다.
UBRRnH/UBRRnL
16비트 중에서 12비트만 유효, 각각 USART0과 USART1 포트의 송수신 속도를 설정. 16비트 레지스터를 라이트 하는 경우에는 항상 상위 바이트인 UBRRnH를 먼저 라이트하고 하위 바이트인 UBRRnL을 나중에 로드해야 한다.
<Baudrate 설정 공식>
<Baudrate에 따른 UBRRn 레지스터의 설정 (Fosc = 16Mhz일때)>
위 사진 및 설명은 datasheet 참조
첫번째 실습은 단방향으로 ATMEGA128에서 PC로 문자열 전송
코드는
#define UDR1 (*(volatile unsigned char *) 0x9C) //USART1 I/O Data Register
#define UCSR1A (*(volatile unsigned char *) 0x9B) //USART Control and Status Register A
#define UCSR1B (*(volatile unsigned char *) 0x9A) //USART Control and Status Register B
#define UCSR1C (*(volatile unsigned char *) 0x9D) //USART Control and Status Register C
#define UBRR1L (*(volatile unsigned char *) 0x99) //USART Baud Rate Register L
#define UBRR1H (*(volatile unsigned char *) 0x98) //USART Baud Rate Register H
UCSRnC
USARTn 송수신 동작을 제어하는 기능 수행
Bit6(UMSELn) : 1이면 USART 포트를 동기 전송 모드로 설정하고, 0이면 비동기 전송모드로 설정한다.
Bit5~4(UPMn1~0) : USARTn 포트의 패리티 모드를 설정한다.
<패리티 모드>
Bit3(USBSn : USARTn Stop Bit Select) : 0이면 USARTn 포트에서 데이터 포맷을 구성하는 스톱비트를 1개로 설정, 1이면 스톱 비트 2개 설정.
Bit2~1(UCSZn1~0 : USARTn Character Size) : UCSRnB 레지스터의 UCSZn2비트와 함께 USARTn 포트에서 전송 문자의 데이터 비트수를 설정한다.
Bit0(UCPOLn : USARTn Clock Polarity) : 동기 전송 모드에서 0으로 설정하면 TxDn 단자의 송신 데이터는 XCKn 클럭의 상승 에지에서 새로운 값 출력, RxDn 단자의 수신 데이터는 XCKn 클록 하강 에지에서 검출, 1로 설정하면 이와 반대로 설정 된다.
UBRRnH/UBRRnL
16비트 중에서 12비트만 유효, 각각 USART0과 USART1 포트의 송수신 속도를 설정. 16비트 레지스터를 라이트 하는 경우에는 항상 상위 바이트인 UBRRnH를 먼저 라이트하고 하위 바이트인 UBRRnL을 나중에 로드해야 한다.
<Baudrate 설정 공식>
<Baudrate에 따른 UBRRn 레지스터의 설정 (Fosc = 16Mhz일때)>
위 사진 및 설명은 datasheet 참조
첫번째 실습은 단방향으로 ATMEGA128에서 PC로 문자열 전송
코드는
#define UDR1 (*(volatile unsigned char *) 0x9C) //USART1 I/O Data Register
#define UCSR1A (*(volatile unsigned char *) 0x9B) //USART Control and Status Register A
#define UCSR1B (*(volatile unsigned char *) 0x9A) //USART Control and Status Register B
#define UCSR1C (*(volatile unsigned char *) 0x9D) //USART Control and Status Register C
#define UBRR1L (*(volatile unsigned char *) 0x99) //USART Baud Rate Register L
#define UBRR1H (*(volatile unsigned char *) 0x98) //USART Baud Rate Register H
#define CPU_CLOCK 16000000
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1
#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8
#define UDRE 5
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
#define TXEN 3
#define RXEN 4
#define UCSZ2 2
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
#define TXEN 3
#define RXEN 4
#define UCSZ2 2
//문자 전송함수
void uart_send_byte(unsigned char byte)
{
while(!(UCSR1A&(1<<UDRE)));
UDR1=byte;
}
{
while(!(UCSR1A&(1<<UDRE)));
UDR1=byte;
}
int main(void)
{
unsigned char buf[]="노준이 짱!";
unsigned int i;
UBRR1L=(unsigned char) BAUD_RATE_L;
UBRR1H=(unsigned char) BAUD_RATE_H;
UCSR1C=(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
UCSR1B=(1<<TXEN)|(1<<RXEN)|(0<<UCSZ2);
//문자열의 길이만큼 반복해서 문자열내 문자를 전송
//문자열의 길이만큼 반복해서 문자열내 문자를 전송
for(i=0;i<sizeof(buf);i++)
{
uart_send_byte(buf[i]);
}
return 1;
}
이고 실행 화면은
ATMEGA128을 껐다 켰다 하면 문자열이 출력됨
두번째 실습은 1번, 2번 스위치를 누르면 1, 2를 출력(실행 화면만)
{
uart_send_byte(buf[i]);
}
return 1;
}
이고 실행 화면은
ATMEGA128을 껐다 켰다 하면 문자열이 출력됨
두번째 실습은 1번, 2번 스위치를 누르면 1, 2를 출력(실행 화면만)
세번째 실습은 양방향 통신으로 PC에서 char형 숫자를 전송하면 2진수에 대응하는 LED점등
PC에서 문자 입력받는 함수
unsigned char USART_Receive(void)
{
while(!(UCSR1A&(1<<RXC)));
return UDR1;
}
입력받은 문자를 LED제어신호로 바꾸는 코드
unsigned char ch=USART_Receive();
PORTF=ch^0xFF;
네번째 실습은 문자열을 전송할수 있는 함수 구현
void uart_send_byte(unsigned char* byte)
{
while(*byte != '\0')
{
while(!(UCSR1A&(1<<UDRE)))
{
}
UDR1=*byte;
byte++;
}
}
728x90
'코스웨어 > 10년 스마트폰BSP' 카테고리의 다른 글
[BSP]업무일지-김석희-20100726 (0) | 2010.07.26 |
---|---|
[BSP]업무일지-서유해-20100723 (0) | 2010.07.23 |
[BSP]업무일지-김동훈-20100722 (0) | 2010.07.23 |
[BSP]업무일지-한정효-20100721 (0) | 2010.07.21 |
[BSP]업무일지-이상구-20100719 (0) | 2010.07.19 |
[BSP] 업무일지 -김기찬- (0) | 2010.07.16 |
[BSP]업무일지-정호영-20100715 (0) | 2010.07.15 |
[BSP]업무일지-박동수-20100714 (1) | 2010.07.15 |