AVR UART 통신 류대우 davidryu@newtc.co.kr
시리얼 (Serial) 통신이란? Serial 통신은하나의신호선을이용해서데이터를비트단위로보내는방식 8 비트비동기식통신콘트롤러 (UART : Universal Asynchronous Receiver Transmitter) 데이터는 LSB 부터 MSB 순으로데이터전송
Serial interface 통신규격 Serial interface 통신규격 RS-232C, RS-422, RS-423, RS-485 < RS-232C 의예 >
시리얼 (Serial) 통신 Serial 통신이점 적은수의통신라인사용과먼거리전송 Serial 통신전송방식 Simplex 단방향전송방식 - 라디오 half duplex 반이중전송방식 ( 서로다른시간양방향전송방식 ) - 무전기 (full) duplex 속도 전이중전송방식 ( 동시양방향전송방식 ) - 8051 bps(bits per second) : 1 초당전송되는비트의수 baud rate : 1 초당전송되는변조된신호의수 * 8051 에서는하나의비트가하나의신호이므로같은의미
시리얼 (Serial) 종류 Specification RS232C RS423 RS422 RS485 동작모드 Single-Ended Single-Ended Differential Differential 최대 Driver / 1 Driver 1 Driver 1 Driver 32 Drivers Receiver 수 1 Receiver 10 Receivers 32 Receivers 32 Receivers 최대통달거리약 15 m 약 1.2 km 약 1.2 km 약 1.2 km 최고통신속도 20 Kb/s 100 Kb/s 10 Mb/s 10 Mb/s 지원전송방식 Full Duplex Full Duplex Full Duplex Half Duplex 최대출력전압 ±25V ±6V -0.25V to +6V -7V to +12V 최대입력전압 ±15V ±12V -7V to +7V -7V to +12V
RS-232C TXD - Transmit Data 직렬통신데이터가나오는신호선 RXD - Receive Data 직렬통신데이터를입력받는신호선 RTS - Ready To Send DTE장치가 DCE장치에게준비가됐음을나타내는신호선 CTS - Clear To Send DCE 장치가 DTE 장치에게준비가됐음을나타내는신호선 DTR - Data Terminal Ready 터미널이모뎀에게자신이송수신가능한상태임을알리는신호선 DSR - Data Set Ready 모뎀이터미널에게자신이송수신가능한상태임을알려주는신호선 DCD - Data Carrier Detect 모뎀이상대편모뎀과전화선등을통해서접속이완료되었을때상대편모뎀이캐리어신호를보내오며이신호를검출하였음을컴퓨터또는터미널에알려주는신호선 RI - Ring Indicator 상대편모뎀이통신을하기위해서먼저전화를걸어오면전화벨이울리게된다. 이때이신호를모뎀이인식하여컴퓨터또는터미널에알려주는신호선이다.
RS-232C
시리얼포트보우레이트 U2X = 0 으로하였을때의보우레이트계산식, 아래와같이계산하면 UBRR 에세팅해야하는값이나옴 코딩은아래와같이하면편리하다 (UBRR 값이 255 보다크게나올경우는주의 )
시리얼보우레이트
시리얼보우레이트
시리얼보우레이트
시리얼보우레이트
ATMEGA128_ 관련레지스터 USRnA(USARTn Control & Status Register A) BIT 7 : RXCn(USART Receive Complete) RXCn(USARTn Receive Complete) 비트는수신버퍼에읽혀지지 않은수신문자가들어있으면 "1" 로셋되고 CPU가이를읽어서수신버퍼가비어있는상태라면 "0" 으로클리어되었음을나타내는상태플래그이다. RXCn 비트는수신완료인터럽트를발생시킬때사용한다. BIT 6 : RXCn(USARTn Transmit Complete) TXCn(USARTn Transmit Complete) 비트는송신시포트레지스터에있는송신데이터가모두송신되고 UDRn의송신버퍼에아직새로운송신데이터가라이트되지않은상태이면"1" 로셋되는상태를지시하는플래그이다. TXCn 비트는송신완료인터럽트를발생시킬때사용된다
ATMEGA128_ 관련레지스터 BIT 5 : UDREn(USARTn Data Register Empty) UDREn(USARTn Data Register Empty) 비트는 UDRn의송신버퍼에새로운송신데이터를받을준비가되어있으면 "1" 로셋되는상태플래그이다 UDREn 비트는 UDARTn Data Register Empty 인터럽트를발생할때사용한다. BIT 4 : FEn(Frame Error) FEn(USARTn Frame Error) 비트는 UDRn 의수신버퍼에현재저장되어있는데이터를수신하는동안프레임에러가발생하였음을나타내는상태플래그로, 프레임에러는수신문자의첫번째스톱비트가 "0" 으로검출되면발생 (1로셋되고 ) 하고 UCSRAn 레지스터를라이트하면이비트는 "0" 으로클리어된다 BIT 3 : DORn*Data OverRun DORn(USARTn Data Overrun Error) 비트는수신동작에서오버런에러가발생하였음을나타내는상태플래그로 OverRun Error는 UDRn의수신버퍼에현재읽지않은수신문자가들어있는상태에서, 수신시포트레지스터에새로운문자가수신완료되면, 다시그다음수신데이터인 3번째문자의스타트비트가검출되면발생한다. UCSRnA 레지스터를라이트하면이비트는 "0" 으로클리어된다.
ATMEGA128_ 관련레지스터 BIT 2 : PEn(Parity Error) PEn(Parity Error) 비트는 UDR의수신버퍼에현재저장되어있는데이터를수신하는동안패리티에러가발생하였음을나타내는상태플래그로패리티에러는 UCSRnC 레지스터의 UPMn1 비트를"1" 설정하여패리티비트를사용하도록설정한경우에만발생할수있다. UCSRnA 레지스터를라이트하면이비트는 "0" 으로클리어된다 BIT 1 : UCXn(Double the USARTn Transmission Speed) U2Xn(Double the USART Transmisson Speed) 비트는비동기모드에서만사용가능한것으로서클록의 n 분주비를 16 에서 8 로 1/2 만큼낮추어전송속도를 2 배높이는기능을한다 BIT 0 : MPCMn(USART Multi-Processor Communication Mode) 비트는 USARTn 을멀티프로세서통신모드로설정하고멀티프로세서통신어드레스정보를포함하지않는모든수신데이터는수신부에의하여무시된다.
ATMEGA128_ 관련레지스터 USRnC(USARTTn Control & Status Register C) BIT 7 에약 BIT 6 UMSELn(USARTn Mode Select) UMSELn(USARTn Mode Select) 비트는 "1" 이면 USARTn 모듈을동기전송모드로설정하고 "0" 이면비동기전송모드로설정한다 BIT5,4 UPMn1, 0(Parity Mode) 이비트를 "1" 로설정하면패리티를발생시키고검사를할수있고송신기는자동적으로각프레임의송신데이터에페리티비트를더하여송신한다. 수신기는 UPM0 비트와수신된데이터를비교한다. 만약에오류가발생하면UCSRnA 레지스터의 PE 플래그가 "1" 로셋된다 UPMn 비트설정표 -------------------------------------------- UPMn1 UPMn0 Parity모드 ------------------------------------------- 0 0 Disable 0 1 예약 1 0 Enabled Even Panrity 1 1 Enabled Odd Parity
ATMEGA128_ 관련레지스터 BIT 3 : USBSn(Stop S Bit Select) USBSn(Stop Bit Select) 비트가 "0 이면 USARTn 모듈에서데이터포맷을구성하는스톱비트를 1개로설정하고 "1" 이면스톱비트를 2개로설정한다. --------------- USBSn StopBIt --------------- 0 1-bit 1 2-bit BIT 2,1 : UCSZn1,0(Character Size) - 데이터비트수를설정 ------------------------------------------------------------ UPMn1 UPMn0 UCSZn0 Parity모드 -------------------------------------------------------------------- 0 0 0 5-bit 0 0 1 6-bit 0 1 0 7-bit 0 1 1 8-bit 1 0 0 에약 1 0 1 에약 1 1 0 에약 1 1 1 9-bit
ATMEGA128_ 관련레지스터 BIT 0 : UCPOLn ------------------------- USBSn TxDn 의출력 StopBIt ------------------------- 0 XCKn 상승 XCKn 하강 1 XCKn 하강 XCKn 상승
시리얼프로그래밍 UBRR0H = 0x00; UBRnH/L(USARTTn Baud Rate Register) 레지스터는 16 비 트중에서 12 비트만사용하여 USARTTn 모듈의송 수신속도를설 정하는기능을한다. BIT 15~23 : 에약비트 BIT 11~0 : UBRRn11~0(USARTn Baud Rate Register) 2 비트를이용하여 USARTn 의보율 (baud rate) 을결정하는데 UBRRnH 의 4 비트와 UBRRnL 의 8 비트가조합을이루고있다
시리얼프로그래밍 USRnB(USARTTn Control & Status Register B) BIT 7 : RXCIEn(RX Complete Interrupt enable) EXCIEn(USARTn RX Complete Interrupt t Enable) 비트는수신 완료인터럽트를개별적으로 enable하고 "1" 로설정하고 SREG 레지스터의비트가 "1" 이고 UCSRnA 레지스터의 RXCn 비트가 "1" 로설정되어있으면수신완료인터럽트가발생한다 BIT 6 : TXCIEn(TX Complete Interrupt Enable) TXCIEn(USARTn TX Complete Interrupt Enable) 비트는수신완료인터럽트를개별적으로 enable(1) 로설정하고 SREG 레지스터의비트가 "1" 이고 UCSRnA와 UCSRnA레지트터의 TXCn 비트가 "1" 로설정되어있으면송신완료인터럽트가발생한다
시리얼프로그래밍 BIT 5 : UDRIEn(USARTn Data Register Empty Interrupt Enable) 비트 USARTn Data Register Empty 인터럽트를개별적으로 enable하는비트로 "1" 로설정하고 SREG 레지스터의비트가 "1" 이고 UCSRnA 레지스터의 UDREn 비트가 "1" 로되면 USARTn Data Register Empty 인터럽트가발생된다 BIT 4 : RXENn(Receiver Enable) RXEN(Receiver Enable) 비트는USARTn 모듈의수신부가동작하도록 enable하는것으로 RXDn 핀이병렬 I/O 포트가아니라직렬데이터수신단자로동작하도록설정한다. BIT 3 : TXENn(Transmitter Enable) TXENn(Transmitter Enable) 비트는 USARTn 모듈의송신부가동작하도록 enable 하는것으로 TXDn핀이병렬 I/O 포트가아니라직렬데이터송신단자로동작하도록설정한다. BIT 2 : UCSZn2(Character Size) UCSZn2(USARTn Character Size) 비트는 UCSRnC 레지스터의 UCSZn1~0 비트와함께전송문자의데이터비트수를설정하는데사용된다
시리얼프로그래밍 BIT 1 : RXB8n(Transmit data Bit 8) RXB8n(Receive Data Bit 8) 은수신문자가 9 비트로설정된 경우에수신된문자의 9 번째비트 (MSB) 를저장한다 BIT 0 : TXB8n(Transmit data BIt 8) 송신문자가 8 비트로설정된경우에송신된문자의 9 번째비트 (MSB) 를저장한다
시리얼프로그래밍 #pragma interrupt_handler uart0_rx_isr:19 void uart0_rx_isr(void) { //uart has received a character in UDR cmd=udr0; } // 시리얼통신에서받은데이터 (UART Data Register) 를 cmd변수에저장
volatile volatile은휘발성메모리라는뜻 컴파일러가최적화 (Optimize) 하더라도프로그래머의의도대로되도록이부분을최적화 (Optimize) 하지말라는뜻 변수값을메모리에서읽어들이도록함.
시리얼통신문자열처리 시리얼은한비트씩한바이트가한패킷이되어들어오는통신 문제 : 시리얼통신에서사용자가터미널에어떠한문자를입력하고, 이문자를다친후에 1 을입력하면이를출력하게하여라 치는동안에는 ATmega128 에서기억하고있게한다. 예 : asdlfjks1sdljflasdjk1
시리얼통신문자열처리 char data[100] = {0}; volatile int cnt = 0; #pragma interrupt_handler uart0_rx_isr:19rx void uart0_rx_isr(void) { data[cnt] = UDR0; if(data[cnt] == '1'){ cnt = -1; data[cnt+1] = 0x00; printf("%s", data); } cnt++; //uart has received a character in UDR }
시리얼포워더만들기
시리얼포워더만들기 #pragma interrupt_handler uart0_rx_isr:19 void uart0_rx_isr(void) { } //uart has received a character in UDR UDR0 = UDR0; // 컴파일후 ATmega128 에포팅한다.
시리얼포워더만들기
시리얼포워더만들기
시리얼포워더만들기
시리얼포워더만들기 키보드를눌러도아무런반응이없다.
시리얼포워더만들기 Open Com Port 를눌른다.
시리얼포워더만들기
Printf 사용하기 void main(){ init_devices(); } printf("serial Forwarder v0.1\r\n"); while(1){ ; }
컴파일러별차이점 AVR Studio + WINAVR printf를사용하기위하여 초기화루틴에 fdevopen(putchar,0); 를적어준다. #include <avr/io.h> #include <avr/interrupt.h> #include "c:/winavr/avr/include/avr/iom128.h" #include <stdio.h> static int Putchar(char message, FILE *stream) { while (((UCSR0A>>UDRE0)&0x01) == 0) ; // UDRE, data register empty UDR0 = message; }
컴파일러별차이점 Codevision #include <mega128.h> #include <delay.h> #include <string.h> #include <stdio.h> 그냥 printf 를사용하면된다. 내장함수를별도로써주지않아도됨.
컴파일러별차이점 IAR EwAVR #include <iom128.h> #include <stdio.h> int getchar(void){ int in; while ((UCSR0A & 0x80) == 0); in = UDR0; return in; } int putchar(int c){ while (((UCSR0A>>5)&0x01) == 0) ; // UDRE, data register empty UDR0 = c; return c; }
컴파일러별차이점 ICCAVR #include <iom128v.h> #include <macros.h> #include <stdio.h> int putchar(char c) // printf 함수사용시추가할것. { while (((UCSR0A>>UDRE0)&0x01) == 0) ; UDR0 = c; return c; } int getchar(void){ // scanf 함수사용시추가할것. while ((UCSR0A & 0x80) == 0); return UDR0; }