ATMEGA

11월 2일 ATMEGA

박잡스 2010. 11. 2. 09:20
8장 직렬통신 실습

ATmega128USART

Full Duplex 동작
직렬송수신버퍼가독립적
비동기(Asynchronous)와동기모두동작
두개의USART를제공–USART0, USART1
DK128은USART1만사용하도록제작됨
레지스터 5개 사용
UDR1 (USART1 I/O Data Register)
UDR1 은 하나의 주소인데 안에 수신버퍼(Read)와 송신버퍼(Write)의 2개로 동작한다.

UCSR1A (USART Control and Status Register A)
데이터 레지스터 empty 체크
UCSR1B (USART Control and Status Register B)
Rx/Tx 송수신단자 설정 , UCSZ2 설정
UCSR1C (USART Control and Status Register C)
ByteSize = 8;
Parity = 0;
StopBits = 0; //설정
UBRR1H/L (USART Baud Rate Registers)
BaudRate = 9600; //통신 포트 설정

단방향 직렬 통신 테스트

#include <test.h>

#define CPU_CLOCK 16000000 //MCU의 속도
#define BAUD_RATE 4800 //통신시 이용할 속도
#define BAUD_RATE_L (CPU_CLOCK / (16l*BAUD_RATE))-1
#define BAUD_RATE_H ((CPU_CLOCK / (16l*BAUD_RATE))-1)>>8
//통신속도의 결과 값을 입력하기 위해 상하위 비트로 구분
//161은 16+L이며, 연산시 값이 너무 커져 overflpw가 발생하므로 32비트 연산?
//위해 16에 Long을 의미하는 l을 붙인다.?
void uart_send_byte(unsigned char byte) //1 byte 전송 함수
{
  while(!(UCSR1A & (1<<UDRE))); //전송 버퍼가 빌 때 까지 기다린다.
  UDR1=byte; //문자 1개를 전송한다.
}

int main(void)
{
  unsigned char buf[]="Hello DK128!"//전송할 문자열
  unsigned int i; //반복제어 별수
  
  UBRR1L=(unsigned char)BAUD_RATE_L; //baud rate 설정
  UBRR1H=(unsigned char)BAUD_RATE_H;
  
  //no parity, 1stop bit, 8bit 설정
  UCSR1C=(0<<UPM1)|(0<<UPM0)|(0<<USBS)|
  (1<<UCSZ1)|(1<<UCSZ0);
  
  // rx/tx interrupt 설정, 8bit 설정
  UCSR1B=(1<<TXEN)|(1<<RXEN)|(0<<UCSZ2);
  
  for(i=0;i<sizeof(buf);i++) //문자단위로 전체 문자열 전송
  {
    uart_send_byte(buf[i]); //문자 1개를 직렬포트로 전송
  }
  
  return 1//종료
}