본문 바로가기

ATMEGA

11월 3일 ATMEGA

양방향 직렬 통신 

#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
#define TICK_PER_SEC  1000
#define PRESCALER    64

//통신속도의 결과 값을 입력하기 위해 상하위 비트로 구분
// 16l 은 16+L 이며, 연산 시 값이 너무 커져 overflow가 발생하므로
//32비트 연산을 위해 16에 Long을 의미하는 l을 붙인다.




void uart_send_byte(unsigned char byte) // 1 byte 전송함수 
{
  while (!(UCSR1A & (1<< UDRE)));
  UDR1 = byte;
}


void uart_send_string(unsigned char *str, unsigned char len)
{
  int i;
  
  for(i=0; i<len; i++)
  {
    if( !(*(str+i)) )
    break;
    uart_send_byte(*(str+i));
  }
  
}

unsigned char USART_Receive(void//직렬통신 수신 함수 구현
{
  while(!(UCSR1A&(1<<RXC))); //UCSR1A의 7번째 비트 = 직렬통신시 데이터 
                             //입력이 있으면 1로 된다.
  return UDR1;
}

volatile unsigned int g_elapsed_time;

void sleep(unsigned int elapsed_time);

void init_LED(void);

//void init_FND(void);

void init_TC0(void);

void init_USART1(void);

int main(void)
{
  init_TC0();
  init_LED();
  //init_FND();
  SREG=SREG|(1<<7);

  
  init_USART1();
  
  
  
  
  //직렬포트로 값을 입력받아 LED 제어
  while(1)
  {
    unsigned char ch = USART_Receive();
    PORTE=(ch-0x30)^0xFF;
    uart_send_byte(ch);
    sleep(1000);
    asm("NOP");
  }
    

  return 1// 종료
}



void sleep(unsigned int elapsed_time) 
{
  
  for(g_elapsed_time=0;g_elapsed_time<elapsed_time;);
}

void __vector_16 (void
{
  TCNT0=256-(CPU_CLOCK/TICK_PER_SEC/PRESCALER);
  ++g_elapsed_time;
}

void init_TC0(void)
{
  
  TCCR0=1<<CS02|0<<CS01|0<<CS00;
  
  
  TCNT0=256-(CPU_CLOCK/TICK_PER_SEC/PRESCALER);
  
  
  TIMSK=TIMSK|1<<TOIE0;
}

void init_USART1(void)
{
  UBRR1L = (unsigned char)BAUD_RATE_L; // baud rate 설정
  UBRR1H = (unsigned char)BAUD_RATE_H;
  
  //no parity, 1 stop bit, 8bit 설정
  UCSR1C = (0 << UPM1) | (0 << UPM0) | (0 << USBS) |
        (1 << UCSZ1) | (1 << UCSZ0);
  
  //rx/tx interrupt 설정, 8bit 설정      
  UCSR1B = (1 << TXEN) | (1 << RXEN) | (0 << UCSZ2);  
}

void init_LED(void)
{
    DDRE=0xFF; 
  PORTE=0xFF; 
}

//void init_FND(void)
//{
//   DDRF=0xFF; 
//   PORTF=0xFF; 
//}

'ATMEGA' 카테고리의 다른 글

ATmega 적외선 센서 응용실습 문제  (2) 2010.11.04
11월 4일 ATMEGA  (0) 2010.11.04
ATmega 8장_1 직렬통신 응용 실습문제  (0) 2010.11.03
ATmega 단방향 직렬통신 응용 문제  (0) 2010.11.02
11월 2일 ATMEGA  (0) 2010.11.02