반응형


1. Baud rate (in bits per second, bps)와 시스템 클록을 정의한다.

        #define 9600

        #define F_CPU 16000000UL


2. 시스템 클록과 원하는 baud rate를 이용하여 USART Baud Rate Register(UBRR)을 계산한다.

BAUD Baud rate (in bits per second, bps)

fOSC System Oscillator clock frequency

UBRR Contents of the UBRRH and UBRRL Registers, (0 - 4095)

        UBRR_VALUE = (((F_CPU / (9600 * 16UL))) - 1);


3. UBRR0은 12비트 레지스터이기 때문에 나누어서 넣어야 한다.

        UBRR0H = (uint8_t)(UBRR_VALUE>>8);

        UBRR0L = (uint8_t) UBRR_VALUE;


4. USART 설정을 한다.

        UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트

        UCSR0C &= ~(1<<USBS0); //stop  bit : 1비트

        UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode


5. USARTn Receiver와 USARTn Transmitter를 인에이블시킨다.

        UCSR0B=(1<<RXEN0)|(1<<TXEN0);


6. 데이터 전송

전송 버퍼(UDRn)이 비어있다면 1값을 가지며 새로운 데이터를 받아서 전송할 준비가 된 것이다.


    //이전 전송이 끝나기를 기다림

    while(!(UCSR0A&(1<<UDRE0))){};

 

    UDR0 = data;                                            /* send data */


7. 데이터 수신

수신버퍼가 비어있다면 0으로 클리어된다. 1이되면 데이터를 수신받았다는 것이다.


    // 수신 되기를 기다림

    while(!(UCSR0A&(1<<RXC0))){};


    return UDR0;                                /* return register value */



전체 소스코드..

PC에서 실행시킨 터미널에서 입력한 것을 avr에서 에코해서 보내줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#define F_CPU 16000000UL
 
//1. baud rate를 선택
#define USART_BAUDRATE 9600
 
//2.시스템 클록과 원하는 baud rate를 이용하여 UBRR 값을 계산한다.
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
 
 
#include <avr/io.h>
#include <stdio.h>
 
 
void usartInit()
{
    //3. UBRR0은 16비트 레지스터이기 때문에 8비트씩 나누어서 넣어야 한다.
    UBRR0H = (uint8_t)(UBRR_VALUE>>8);
    UBRR0L = (uint8_t) UBRR_VALUE;
    
    //4. USART 설정
    UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트
    UCSR0C &= ~(1<<USBS0); //stop  bit : 1비트
    UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode
    
    //5. 송수신을 가능하게 한다.
    UCSR0B=(1<<RXEN0)|(1<<TXEN0);
}
 
void transmitByte(uint8_t data) {
 
    //이전 전송이 끝나기를 기다림
    while(!(UCSR0A&(1<<UDRE0))){};
 
    UDR0 = data;                                            /* send data */
}
 
uint8_t receiveByte(void) {
    // 수신 되기를 기다림
    while(!(UCSR0A&(1<<RXC0))){};
    return UDR0;                                /* return register value */
}
 
 
void printString(const char str[]) {
    uint8_t i = 0;
    while (str[i]) {
        transmitByte(str[i]);
        i++;
    }
}
 
void readString(char str[], uint8_t maxLength) {
    char response;
    uint8_t i;
    i = 0;
    while (i < (maxLength - 1)) {                   /* prevent over-runs */
        response = receiveByte();
        transmitByte(response);                                    /* echo */
        if (response == '\r') {                     /* enter marks the end */
            break;
        }
        else {
            str[i] = response;                       /* add in a letter */
            i++;
        }
    }
    str[i] = 0;                          /* terminal NULL character */
}
 
int main(void)
{
    usartInit();
    
    char ch;
 
    while(1)
    {
        ch = receiveByte();
        
        if ( ch == '\r') {
            transmitByte('\r');
            transmitByte('\n');
        }
 
        transmitByte(ch);
    }
}
 
cs


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  1. 알고싶어요 2020.05.27 22:36

    readString 함수를 쓰고 싶은데 str[]과 maxlegnth에 어떤게 들어가야 할까요?

  2. 알고싶어요 2020.05.27 23:27

    char* readString(char str[], uint8_t maxLength) {
    char response;
    uint8_t i;
    i = 0;
    while (i < (maxLength - 1)) { /* prevent over-runs */
    response = receiveByte();
    if (response == '\r') { /* enter marks the end */
    break;
    }
    else {
    str[i] = response; /* add in a letter */
    i++;
    }
    }
    str[i] = 0; /* terminal NULL character */
    return str;
    }



    if((strcmp(readString(str,4),"101"))==0)
    {
    PORTD = 0b10010000;
    _delay_ms(13000);
    PORTD = 0b00000000;
    }

    이렇게 짜봤는데 실행이 동작이 잘안되서요 어떤식으로 짜면 좋을까요?

+ Recent posts