직렬통신

2019. 10. 18. 22:15avr-atmega128

datasheet p.176부터 USART(atmega128에서는 UART대신 USART라고 통칭한다.)의 설정및 동작방식에 대한 설명이 되어있다.

 

datasheet에 따르면

Transmission동작과정은 다음과 같다.

 

1.(UCSRB의)TWEN bit를 set-->USART동작가능, TxD pin이 serial output으로 사용이 가능해진다.

(이때 동기식으로 전송하는 경우 XCK pin을 통해 동기화되고 비동기식이라면 통신이전에 baud rate와 data format을 사전에 정해야한다.)

 

2.UDR에 data를 넣음으로서 transmit buffer로 data를 저장하게 된다. 이후 shift register가 새로운 data를 받을 준비가 되었다면 shift register로 옮겨 가게 된다.(더이상 전송되고 있는 data가 없거나 이전data의 stop bit가 전송이 되었을때)

 

3.XCK나 U2X bit에 사전에 설정되었던 baud rate를 바탕으로 전송이 된다.

(이때 UCSRnA의 UDRE값을 검사해서 송신버퍼에 새로운 데이터를 쓸지 안쓸지를 판단한다.

 

밑의 두 사진은 실수사용과 컴파일하기위한 기본설정

 

Receiver의 동작도 크게 다르지는 않는데

 

1.start bit를 감지하게되면 XCK clock의 동기화된 rate나 자체적인 baud rate에 따라 stop bit를 받을때 까지 Receive shift register로 data를 받습니다.

 

2.두번째 stop bit는 무시되며 첫번째 stop bit를 받게 되면 receive shift register에 받았던 data는 receive buffer로 이동하게 됩니다. 

 

3.이윽고 UDR로 들어온data를 쓸수 있게 됩니다.

 

avr5계열(?)이라 해당 경로의 library를 추가해줘야한다. libprintf_flt.a, libscanf_flt.a, libm.a, libc.a만 추가해주면 실수사용과 printf, scanf사용이 가능하다. 그냥 혹시나해서 다 추가해줬을뿐...

 

해당예제

#include <avr/io.h>
#include  <stdio.h>
#include <util/delay.h>
#define F_CPU 16000000UL

void Putch0(char data)
{
while(!(UCSR1A & 0x20));
UDR1 = data;
}

char Getch0(void)
{
while(!(UCSR1A & 0x80));
return UDR1;
}


int main(void){
char x, data, str[10];
FILE *fp;
fp = fdevopen(Putch0, Getch0);
DDRA = 0xff;
DDRD= 0x0f;
UCSR1B = 0b00011000;
UCSR1C = 0b00000110;
UBRR1H = 0;
UBRR1L = 8;
while(1){
PORTA=0xff;
printf("\n\r Input data[0-9] : ");
scanf("%d",&x);
printf("\n\r inputed data = %d", x);
printf("\n\r inputed string :");
scanf("%s", str);
printf("\n\r Inputed string =%s", str);
_delay_ms(300);
PORTA=0x00;
_delay_ms(300);


}
}

'avr-atmega128' 카테고리의 다른 글

Analog To Digital Converter  (0) 2019.11.02
16bit Timer/Counter  (0) 2019.10.25
8bit Timer/Counter  (0) 2019.10.25
외부인터럽트  (0) 2019.10.22
Serial Peripheral Interface  (0) 2019.07.12