반응형
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
 
unsigned char Rx_Complete;    
unsigned char RX_BUFF[32];     
 
// 시리얼통신
//================================================================================
// Char_TX
//================================================================================
void Char_TX(char data)
{
    while((UCSR0A & 0x20== 0x00);
    UDR0 = data;
}
 
//================================================================================
// String_TX
//================================================================================
void String_TX(char *Str)
{
    unsigned char  i; 
 
    for (i = 0; Str[i] != '\0'; i++)
    {
        Char_TX(Str[i]);
    }    
}
 
void Uart_Init(unsigned int UART_BAUD_RATE) 
{    
    // USART initialization    
    UCSR0A = 0x00;
    
    UCSR0B = 0x98;    // 송수신 인에이블
    // UCSR0B = 0x90;    // 수신 인에이블
    
    UCSR0C = 0x86;    
    UBRR0H = 0x00;    
 
    //UBRRL = 0x67; // 16Mhz -> Hex(0x67), Dec(103)
    UBRR0L = (F_CPU / (UART_BAUD_RATE * 16L) - 1);
}
 
// 수신 인터럽트 루틴
ISR(USART0_RX_vect)    
    // 데이터가 수신될때마다 1씩 증가    
    static unsigned char RX_Count;
    unsigned char Data;
    
    // 수신바이트를 Data에 넣는다.  
    Data = UDR0;                    
    
    // 수신데이터에 에러가 없으면
    if(Rx_Complete == 0)            
    {     
        // 스타트 바이트  
        if(Data == '<')          
        {
            RX_Count = 1;     
            RX_BUFF[0= '<';  
        }         
        else 
        {     
            RX_BUFF[RX_Count++= Data;     
            
            if(RX_Count >= 32) {RX_Count = 0;}
        }     
        
        // 스톱 바이트
        if(Data == '>')            
        {
            RX_BUFF[RX_Count] = 0;    
            
            // RX_Count를 0으로 초기화
            RX_Count = 0;    
            
            Rx_Complete = 1;    
        }   
    } 
}
 
// 수신데이터 처리 함수
void Excute_Serial(void)              
{
}
 
// 메인함수
int main(void)
{
    Uart_Init(9600);
    
    _delay_ms(50);
    
    // 전역 인터럽트 활성
    sei();     
 
    while(1)    
    {
        if(Rx_Complete)
        {
            Rx_Complete = 0;    
            
            Excute_Serial();
        }
    }
}
 
 
cs


반응형

'개발모듈 > 펌웨어 모듈' 카테고리의 다른 글

- [AVR Studio4] ADC 8비트  (0) 2019.06.04
- Key Control 3  (0) 2019.04.08
- [AVR Studio 4] ATmega128 - 타이머카운터 (CTC모드)  (0) 2018.12.18
- WS2812 관련함수  (0) 2018.05.18
- AVR Studio 4.19에서 소수점처리  (0) 2018.05.15
Posted by 메가아재
,