정보보안공부

마이크로프로세서_day13 본문

ATMega128

마이크로프로세서_day13

Steady_sp 2017. 6. 2. 16:05

====Serial Communication====

 

 

***HyperTerminal에 문자열 전송하기

-> kit에서 “information Communication” 이라는

    문자열을 PC에 전송

-> 전송속도 9600bps사용

 

<사용해야할 레지스터>

-> UCSR1A, UCSR1B, UCSR1C

-> Baud Rate 결정 : UBRR1H, UBRR1L

 

@UCSR1A

**Kit에서 PC로 송신 : putchar0()

void putchar0(char data)

{

while(!(UCSR1A & (1<<UDRE1))); //==while(!(UCSR1A & 0x20));

}

 

@UCSR1B

**Kit에서 PC로 송신

UCSR1B = 1<<TXEN1

 

@UCSR1C

**패리티 모드 : UPM11, UPM10 -> 패리티 사용 안 함

**전송 데이터 비트 수 : UCSZ12, UCSZ11, UCSZ10

**8bit : 0 1 1

**UCSR1C = 0b00000110 // 0x06 // (1<<UCSZ11) | (1<<UCSZ10)

 

@UBRR1H, UBRR1L

**Baud Rate : 9600bps

**UBRR = 103.166667

**UBRR1H = 0;

**UBRR1L = 103;

 

#include “myheader.h”

int main(void)

{

char str[] = “Information-Communication”;

char *ptr;

init_device(); //LCD 초기화함수

UCSR1A = 0x00;

UCSR1B = 1<<TXEN1 //Kit에서 Pc로 통신

UCSR1C = 0b00000110; //8bit

UBRR1H = 0;

UBRR1L = 103;

 

ptr = str;

while(*ptr)

{

putchar0(*ptr++);

_delay_ms(20);

}

putchar0(‘\n’);

putchar0(‘\r’);

_delay_ms(100);

while(1);

}

 

void putchar0(char data)

{

while(!(UCSR1A & 0x20));

UDR1 = data;

}

 

 

***키보드에서 입력한 문자를 +1하여 모니터에 표시

->HyperTerminal에서 입력한 키보드 값을 kit로 전송 후,

    +1하여 HyperTerminal로 전송

**HyperTerminal로부터 전송되어오는 문자를 kit에서 수신 : getchar0()

char getchar0(void)

{

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

return UDR1;

}

-> 수신 버퍼에 데이터가 차면 UDR1의 값을 리턴

-> 수신버퍼가 데이터가 찼는지 확인? UCSR1ARXC11일 때

 

int main(void)

{

MCUCR = 0x80;

UCSR1A = 0x00; //초기화

UCSR1B = 0b00011000; //(1<<TXEN)송신(1<<RXEN)수신활성

UCSR1C = 0b00000110; //8bit

UBBR1H = 0;

UBBR1L = 103; //9600bps

while(1) {

putch0 ( getchar0() + 1 ); //getchar로 수신후 +1해서 putch로 송신

}

return 0;

}

 

void putch0(char data)

{ //송신

while(!(UCSR1A & 0x20)); //0x20 == 1<<UDRE1

UDR1 = data;

}

 

char getchar0(void)

{ //수신

while(!(UCSR1A & 0x80)); //0x80 == 1<<RXC1

return UDR1;

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

<!--[if !supportEmptyParas]--> <!--[endif]-->

 

 

***예제 2를 인터럽트로 처리

->LED0.5초 간격으로 shift

-> HyperTerminal의 문자가 입력되면 +1한 문자를 HyperTerminal에 출력

-> USART관련 Interrupt macro

 

@수신 인터럽트 처리함수

ISR(USART1_RX_vect)

{

rx = UDR1; //수신버퍼에서 데이터 읽어 저장

UCSR1B |= (1<<UDRIE1); //UCSR1B |= 0x20

//송신버퍼 empty 인터럽트 허용

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

@송신 인터럽트 처리함수

ISR(USART1_UDRE_vect)

{

UDR1 = rx + 1; //수신된 rx를 송신버퍼에 저장

UCSR1B &= (0<<UDRIE1); //UCSR1B &= 0xdf;

//송신버퍼 empty 인터럽트 금지

}

char rx;

int main(void)

{

unsigned char led = 0x01;

MCUCR = 0x80;

UCSR1A = 0x00; //초기화

UCSR1B = 0b10011000; //Interrupt일 때 맨앞1주의

UCSR1C = 0b00000110; //8bit

UBRR1H = 0;

UBRR1L = 103; //9600bps

<!--[if !supportEmptyParas]--> <!--[endif]-->

sei(); //interrupt 활성화

while(1)

{

EX_LED = led;

led<<=1;

_delay_ms(500);

if(led == 0x00)

led = 0x01;

}

}

 

ISR(USART1_RX_vect)

{

rx = UDR1; //수신

USCR1B |= 0x20; //1 << UDRIE1

}

 

ISR(USART1_UDRE_vect)

{

UDR1 = rx; //송신

UCSR1B &= 0xdf; //0 << UDRIE1

}

'ATMega128' 카테고리의 다른 글

마이크로프로세서_day12  (0) 2017.05.18
마이크로프로세서_day11  (0) 2017.05.12
마이크로프로세서_day10  (0) 2017.05.06
마이크로프로세서_day09  (0) 2017.04.28
마이크로프로세서_day08  (0) 2017.04.26
Comments