2015-02-15

USART 통신을 이용한 AVR로 hi~ 인사하기.

UART 통신을 연습하는 강좌에 올린 질문과 답변 연습 내용을 정리한 글입니다.


출처 : cafe.naver.com/laydigital/

안녕하세요, 통신을 위해서 사전에 준비할것들이 많다는것을 강좌를 통해 처음 알게되었습니다. 실생활에서 쓰는것만큼
편하게 되는게 아닌것을 처음으로 느껴보고 우리가 실생활에서 참 편하게 이용하는구나 라고 세삼 더 느끼게 됐네요...
준비해보면서 하나씩 이유에 대해서 알게되니 점점더 재미가 붙는것 같습니다. 과제가 있어 과제 연습용으로 수행코드를
작성해보았습니다.

터미널 에뮬레이터는 제일 간편한 하이퍼 터미널을 win7에서 실행하여 실습하였습니다. win7은 터미널이 없더군요....

------------------------------------------------------------------------
[과제] 바로 위에 있는 “I Like You!”와 똑 같은 화면이 나타나도록 하되, baudrate를 9600으로 하고 stop 비트를2비트, 패리티는 Even 패리티를 사용하여 프로그램해 보세요. ^^
------------------------------------------------------------------------


#include <avr/io.h>
#define kilo 1000UL
#define Mega kilo*kilo
#define F_CPU 16*Mega
//#define FOSC 16000000 //clock speed
//#define BAUD 115200
//#define Myubrr FOSC/16/BAUD-1  // FOSC/16/BAUD -1 + (-35%)
#include <util/delay.h>
#define NUL 0x00
void USART0_SET(uint16_t);
void USART0_Transmit (int8_t *p);

int8_t arr[] = {11,'I',0x20, 'L','I','K','E', 32, 'Y','O','U','!',11,13};
int8_t *ptr = arr;

int main(void)
{
 USART0_SET(103);  //baud rate 9600
  
    while(1)
    {
      USART0_Transmit(ptr); 
 }
}


void USART0_SET(uint16_t ubrr)
{
  /*set baud rate */
 UBRR0H = (uint8_t)(ubrr>>8);
 UBRR0L = (uint8_t) ubrr;
 /* Enable receiver and transmitter */
 UCSR0B = (0<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02); 
   
 /*Set frame format : 8data, 2stop bit */
 UCSR0C = (1<<USBS0)|(3<<UCSZ00);
 /*Set Parity mode */
 UCSR0C |=(2<<UPM00); //enabled, even parity
}


void USART0_Transmit(int8_t *p)
{
 uint8_t i;
 for(i=0; i<(sizeof(arr)/sizeof(arr[0])) ; i++,p++)
 {
    /* Wait for empty transmit buffer */
 while( !(UCSR0A &  (1<<UDRE0)) )
 ;
 /* Put data into buffer, sends the data */

 UDR0 = *p;
    _delay_ms(50); //A confirmed
 }

}

코드 수행 결과물 


/////////////////////////////////////////////////////////////////////////////////////////////////////


nt8_t arr[] = {11,'I',0x20, 'L','I','K','E', 32, 'Y','O','U','!',11,13};

끝에 11,13은 '\n', '\r' 에 대한 문자 값인듯한데
11이 아니고 10입니다.

문자 string으로 
uint8_t *arr = "I Like You !\r\n";


void USART0_Transmit(int8_t *p)
{

while(*p)
{
/* Wait for empty transmit buffer */
while( !(UCSR0A & (1<<UDRE0)) ) ;
/* Put data into buffer, sends the data */

UDR0 = *p++;
_delay_ms(50); //A confirmed
}

}
이렇게 사용하기도 합니다. 
USART0_Transmit 에 문자열 주소를 받으면서도
global 변수 arr[] 을 통해 size를 얻는 형태가 조금 아쉽네요.. ^^

USART0_Transmit(arr, sizeof(arr)/sizeof(arr[0]));

void USART0_Transmit(int8_t *p, int len)
{

for(;len ; len --, p++)
{
/* Wait for empty transmit buffer */
while( !(UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */

UDR0 = *p;
_delay_ms(50); //A confirmed
}

이런 방식의 구현도 가능하겠죠.

No comments:

Post a Comment

Total Pageviews