본문 바로가기
ATmega 2560/Ghost의 ATmega 256 문자열 시리얼 통신

ATmega 256 시리얼 통신으로 문자열 전송.

by dark ghost 2012. 11. 28.
728x90
반응형

ATmega 256 시리얼 통신으로 문자열 전송.

ATMEGA2560.pdf

AM-2560PRO.pdf

그림 1-1) 시리얼 통신을 하기 위한 준비 셋팅.

1. 이번에는 ATmega 256 기능 중 하나인 시리얼 포트 통신에 대해서 하려 한다. 물론 ATmega 128 과 기능은 비슷하지만 ATmega 256은 기본 포트 말고도 확장 되어진 포트가 존재한다. 물론 시리얼 통신이 아닌 인터럽터 포트다. 인터럽터 포트가 ATmega 128 에서는 0~7까지 8개의 포트였다면  ATmega 256은  0~7까지의 기본 포트와 0~23까지 총 24개의 확장 PCInterrupt(Pin Change Interrupt) 라 불리는 포트다. 앗! 잠시 아웃사이더로 빠졌다. 자세한건 인터럽터에서 확인 바란다. 그럼 다시 본론으로 와서 시리얼 통신을 할려면 통신 속도를 정해주어야 하는데 이 부분을 하기 위해서는 이에 관련된 레지스터 주소와 포트 번호를 설정 해주어야 한다. 

 

그림 1-2)  시리얼 통신을 하기 위한 준비 레지스터 주소와 포트 번호.

2. 그림 1-1)의 코드를 짜기 위해서 미리 사용할 레지스터 주소와 포트 번호를 미리 #define을 시켜 줘야 한다. (추신: 주석의 페이지를 참조.) 레지스터 주소와 포트 번호는 꼭 사용 하고자 하는 포트를 잘 확인 하고 넣어야 한다. 아니면 제대로 작동 하지 않기 때문이다. 맨처음 부분 BAUD 라고 되어있는 부분이 있는데 그 부분에 3줄이 통신 속도를 정해주는 부분이며 datasheet에 있으므로 지원되는 속도로 설정을 맞춰 주면 된다.

 

그림 2-1) 한 문자씩 전송 하는 함수.

3. 셋팅이 다 되면 본격 적으로 하이퍼 터미널 통해 화면에 출력할 필요가 있다. 그림 2-1)은 문자열 전송이 아닌 한 문자를 터미널을 통해 화면에 출력하는 함수다. 관련 레지스터 주소와 포트 번호는 그림 2-2)를 참조 해서 셋팅을 하면 된다.

 

그림 2-2) 한 문자씩 전송 하는 함수의 레지스터 주소와 포트 번호.

4. UCSR0A 레지스터는 USART 통신 제어와 상태를 담당하는 레지스터이며, UDRE 포트를 통해서 DATA가 비어 있는지 상태를 확인후 비어 있다면 기록할 준비를 한다. 그리고 그 데이터를 UDR0 포트에 기록한다.

 

그림 3-1) 문자열 전송 함수.

5. 그림 3-1) 맨 위에 USART_Receive 함수를 통해 수신이 완료 되었는지를 체크하며 UDR0의 입,출력 데이터 값을 반환한다. Uart0_Rx 함수에서 ucRet 변수가 USART_Receive 함수를 호출하여 switch 문에서 ucRet 를 인자 값으로 입력을 받으면 해당 문자에 문자열을 Uart0_String 함수를 통해 문자열을 터미널 화면에 출력한다. Uart0_String 함수에서는 문자열을 전송하기 위해 *ucData를 인자로 받아 Uart0_String("Hello!\r\n")에서 ("Hello!\r\n")를 인자로 받아 문자열에 NULL을 만날때까지 즉 문자열이 끝날때까지  USART_Transmit()함수를 호출하여 NULL 을 만나면 이 함수는 종료하고 문자열을 출력하게 한다.

 

그림 3-2)  문자열 전송 함수의 레지스터 주소와 포트 번호.

6. 그림 3-1)의 함수에 필요한 레지스터의 주소와 포트 번호이다.

 

그림 4-1) main 함수.

7. 그러고 보니 main 함수를 보지 않았다. 마지막으로 main 함수는 거의 아무일도 하지 않는다. 그렇다고 놀고만 있는건 아니다. main 함수에서 하는 일은 LED를 끄고 키는 일을 한다. DDRL로 활성화 시키면 일은 PORTL에서 한다. 그리고for 문은 신호(시간)를 딜레이 시키기 위해 사용 하였다.

 

그림 4-2) PORTL에서 LED 포트를 7번으로 정한 이유.

8. 그림 4-1)에서 LED를 사용 한 것을 보았을 것이다. 그러나 이번에는 포트번호를 #define 한 그림을 볼 수 없었을 것이다. 하지만 없는게 아니라 그림이 너무 많아져서 빼버렸다. 만약 LED 포트가 그림 4-2)처럼 7번인지 확인 하고 싶다면 그림 2-2)를 참조 하면 된다. 그리고 PORTL을 쓴 이유도 이 그림 4-2)에서 찾을 수 있다. 바로 PORTL의 7번 포트가 LED라고 있기 때문에 이 PORTL을 사용 한 것이다.

 

 

 

시리얼 통신 동영상

 

 

  

 

728x90
반응형

댓글