본문 바로가기

[ATmega128] 양방향 직렬통신

반응형

#define PINE (*(volatile unsigned char *)0x21)

#define DDRE (*(volatile unsigned char *)0x22)

#define PORTE (*(volatile unsigned char *)0x23)

   

#define PINC (*(volatile unsigned char *)0x33)

#define DDRC (*(volatile unsigned char *)0x34)

#define PORTC (*(volatile unsigned char *)0x35)

   

//---------USART 레지스트리 설정

   

#define UDR1 (*(volatile unsigned char *)0x9C)

#define UCSR1A (*(volatile unsigned char *)0x9B)

#define UCSR1B (*(volatile unsigned char *)0x9A)

#define UCSR1C (*(volatile unsigned char *)0x9D)

#define UBRR1L (*(volatile unsigned char *)0x99)

#define UBRR1H (*(volatile unsigned char *)0x98)

   

//--------- 통신 값 설정

   

#define CPU_CLOCK 16000000

#define BAUD_RATE 19200

#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1

#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8

   

//--------- 레지스트리 비트값(UCSR1C)

   

#define UPM1 5

#define UPM0 4

#define USBS 3

#define UCSZ1 2

#define UCSZ0 1

   

//--------- 레지스트리 비트값(UCSR1B)

   

#define TXEN 3

#define RXEN 4

#define UCSZ2 2

#define RXC 1

   

//--------- 레지스트리 비트값(UCSR1A)

   

#define UDRE 5

#define NOP() asm volatile ("nop");

#define DELAY_MS 400 //딜레이 시간 설정.

   

void USART_Transmit(unsigned char st)

{

  while(!(UCSR1A & (1<<UDRE)));

  UDR1 = st;

    

}

   

unsigned char USART_Receive(void)

  {

    //데이터 수신대기

    while( !(UCSR1A & (1<<RXC))  )

    ;

    //버퍼에 수신된 데이터를 가져와 리턴

    return UDR1;

  }

    

   

int main(void)

{  

    

  PORTC = 0xFF;

  DDRC = 0xFF;

    

  UBRR1L = (unsigned char)BAUD_RATE_L;

  UBRR1H = (unsigned char)BAUD_RATE_H;

    

  UCSR1C = (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0);

  UCSR1B = (1<<TXEN) | (1<<RXEN) | (0<<UCSZ2);

    

    

    

    

    

  while(1)

  {

    

    unsigned char ch = USART_Receive();

    PORTC = ch^0xFF;

    USART_Transmit(ch);

    asm("NOP");

  }

    

    

  return 1;  

}

반응형
-->