본문 바로가기
공부,일/atmega328P

atmega 328p USART (3) 실습

by fromnothing1 2021. 8. 2.

XCKn = PD4

TXD = PD1

RXD = PD0

USART 설정

 

비동기 모드로 , 페리티 코드는 사용하지 않으며 , 스탑 비트는 2bit 이다.

1배속 모드로 기동중이다.

8bit 의 데이타를 송,수신 하고있다.

 


프로그램 설명 

 

송신부에서 1, 과 2를 번갈아가면서 USART 통신으로 부낸다. 

제대로 보내고 있는지 확인하기 위해서 1을 보내고 나면 PORTD7  에 연결된 LED를 밝혔다. 

마찬가지로 1초후에 2를 보내고 나면 PORTD6 에 연결된  LED 를 밝힌다. 

 

수신부에서는 받은 데이터가 1이면 PORTD7  에 연결된 LED키고 

2이면 PORTD6  에 연결된 LED 를 킨다. 

 

조심할점은 아두이노 스케치를 이용할경우 코드를 업로드 할때  tx,rx 핀을 사용해서 tx,rx 핀에 머 꼿아놓고 로드시키면 에러난다.  tx,rx 핀은 floating 시켜 놓고 프로그램을 다올린후에 서로 연결해라 

 

당연한 거지만 수신부 tx 는 송신부 rx 에 

송신부 tx 는 수신부 rx 에 연결해야된다. 

 

또한 예제는 데이터 시트에 있는 것을 조금 변경 시켰으며 

클럭은  아두이노의 경우 16MHz 임으로 바꿨다. 

 

수신부 

#define FOSC 16000000 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

unsigned char data;

void setup() {
  // put your setup code here, to run once:
  DDRD = (1<<7)|(1<<6); // //  통신 확인용 LED
  USART_Init(MYUBRR);
  
}
void loop() 
{
    data = USART_Receive();
    if(data == 1)
    {
        PORTD = (1<<7);
    }
    if(data == 2)
    {
        PORTD = (1<<6);
    }
    delay(1000);
 
}

unsigned char USART_Receive(void)
{
    /* Wait for data to be received */
    while (!(UCSR0A & (1<<RXC0)));
    /* Get and return received data from buffer */
    return UDR0;
}


void USART_Init(unsigned int ubrr)
{
    /*Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr; 
    /*Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 2stop bit */
    UCSR0C = (1<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);
}

 

 

 

송신부 

#define FOSC 16000000 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

unsigned char data;

void setup() {
  // put your setup code here, to run once:
  DDRD = (1<<7)|(1<<6); // //  통신 확인용 LED
  USART_Init(MYUBRR);
  
}
void loop() {

  
  // put your main code here, to run repeatedly:
  USART_Transmit(0x01); 
  while (!(UCSR0A & (1<<TXC0))); // transmision 이 끝날때 까지 대기 
  UCSR0A = UCSR0A|(1<<TXC0) ; //TXC0 0 clear
  delay(1000);
  PORTD = (1<<7);
  USART_Transmit(0x02); 
  while (!(UCSR0A & (1<<TXC0))); // transmision 이 끝날때 까지 대기 
  UCSR0A = UCSR0A|(1<<TXC0) ; //TXC0 0 clear
  
  delay(1000);
  PORTD = (1<<6);

}

void USART_Transmit(unsigned char data)
{
    /* Wait for empty transmit buffer */
    while (!(UCSR0A & (1<<UDRE0)));
    /* Put data into buffer, sends the data */
    UDR0 = data;
}


void USART_Init(unsigned int ubrr)
{
    /*Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr; 
    /*Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 2stop bit */
    UCSR0C = (1<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);
}

사실

while (!(UCSR0A & (1<<TXC0))); 

코드는 없오도 기동한다. 

왜냐하면 

 while (!(UCSR0A & (1<<UDRE0))

위코드를 통해서 송신 버퍼가 준비되었다는 말은 송신이 끝났으니까 가능하다. 

 

하지만 실제로 TXC0 bit 동작하는지 알기위해서 위와 같은 코드를 넣었다. 

 

그리고 송신완료후 일어나는 인터럽트와 

송신 가능할때 일어나는 인터럽트는 따로 다루기 위해서는 2가지 bit 모두 쓸줄 알아야 한다. 

 

 

KakaoTalk_20210802_162313504.mp4
1.07MB

 

'공부,일 > atmega328P' 카테고리의 다른 글

atmega328P TWI(I2C) 통신 (2)  (0) 2021.08.05
atmega328P TWI(I2C) 통신 (1) 개념 및 레지스터  (0) 2021.08.05
atmega 328p USART (2) 레지스터  (0) 2021.08.02
atmega 328p USART (1) 개념 및 다이어그램  (0) 2021.08.01
질문  (0) 2021.07.30

댓글