7. MC_E02SM3(ATmega128보드)이용. UART

.

먼저 UART를 하기 위해서는 Teraterm이 필요하다.

1. 테라텀을 검색해서 받고.


2. 아래 asp 파일을 받아서 AVRstudio에서 실행시킨다.

UART.zip






2_UCR0A가 조건으로 0x20(위에서 5번 위치)에서 0x00이면 버퍼가 비어있으니까 



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
#include "uart.h"
#include <stdio.h>
#include <stdarg.h>
 
volatile U8 usart_data=0;    //UART Data
extern volatile unsigned char temp_uart1;
 
/********************************************
                초기화
*********************************************/
void USART0_init(void){
    cli();    
    UCSR0A=(1<<UDRE0); //송신데이터를 받을 준비가 된 상태.(항상 1로 set!)
    UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);    //수신인터럽트활성화.
//->78번줄 함수(ISP)로 이동
//수신.송신부 활성화
    UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);        //전송 데이터길이 8bit 결정.
    UBRR0L=25;        //BaudRate=38400. UBRR=(F(16000000)/(16*BaudRate))-1
    sei();
}
 
void USART1_init(void){
    cli();    
    UCSR1A=(1<<UDRE1);        //송신데이터를 받을 준비가 된 상태.
    UCSR1B=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1)|(0<<UCSZ12);    //수신인터럽트활성화.
//->84번 ISP로 이동
//수신.송신부 활성화
    UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);        //전송 데이터길이 8bit.
    UBRR1L=25;                //BaudRate=38400. UBRR=(F(16000000)/(16*BaudRate))-1
    sei();                                          
}
 
/********************************************
                프로그래밍
*********************************************/
/* USART0로 데이터 보내기. */
void TX0_char(unsigned char data){
    while((UCSR0A & 0x20)==0x00);    //송신버퍼가 비워져서 새로운거 보낼 수 있음.
    UDR0=data;
    sei();                      
}
/* USART1로 데이터 보내기. */
void TX1_char(unsigned char data){
    while((UCSR1A & 0x20)==0x00);    //송신버퍼가 비워져서 새로운거 보낼 수 있음.
    UDR1=data;
    sei();
}
/****************************************************
 
 
 
**************************************************/
/* USART0로 printf 함수 사용하기. */
void TX0_printf(char * msg,...)
{
  volatile    unsigned char UARTStr[30];    //unsigned char 8-bit.
  
  /* vsprintf 쓰기 위한 필수. va_list va_start va_end. */
  va_list ap;
  va_start(ap, msg);
  vsprintf((void*)&UARTStr[0], msg,ap);
  va_end(ap);
 
  /* vsprintf는 UARTStr[i]를 하나씩 보내주고
   밑에 있는 TX0_String()은 UARTStr[]을 받아서 UART로 뿌려준다.*/
  TX0_string((void *)&UARTStr[0]);
}
/* USART0로 문장 보내기. */
void TX0_string(unsigned char *string){
    while(*string != '\0'){
    TX0_char(*string);
    string++;
    }//while End
}
/********************************************
                루틴
*********************************************/
/*        Ehco           */
SIGNAL(SIG_UART0_RECV) {  //인터럽트 서비스루틴의 함수 이름 SIGNAL 
 usart_data=UDR0;
TX0_char(0x0D); //ASCII code \n 역슬레쉬
 TX0_char(0x0A); //ASCII code \r 라인 맨 왼쪽으로 보내기
 //UDR0=usart_data;
}
 
SIGNAL(SIG_UART1_RECV) {
// temp_uart1=UDR1;
// SensorDiv();
}
 





설정

트랙백

댓글