글
7. MC_E02SM3(ATmega128보드)이용. UART
●프로젝트와 세미나/AVR-ATmega128
2014. 4. 15. 09:51
.
먼저 UART를 하기 위해서는 Teraterm이 필요하다.
1. 테라텀을 검색해서 받고.
2. 아래 asp 파일을 받아서 AVRstudio에서 실행시킨다.
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(); } |
'●프로젝트와 세미나 > AVR-ATmega128' 카테고리의 다른 글
AVR을 이용한 C-LCD출력(GDM2004D-NSW-FBW). (1) | 2014.05.25 |
---|---|
6. MC_E02SM3(ATmega128보드)이용. 인터럽트 LED 테스트2 (타이머인터럽트=내부인터럽트) (0) | 2014.04.08 |
5. MC_E02SM3(ATmega128보드)이용. 외부 인터럽트 LED 테스트1 (0) | 2014.04.08 |
4. MC_E02SM3(ATmega128보드)이용. LED테스트 (0) | 2014.04.02 |
3. MC_E02SM3(ATmega128보드)이용. 기본설치(MSVBVM50.dll, EZDownloader for AVR, Silicon Lab) (0) | 2014.04.02 |