출처 : 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