정보보안공부
마이크로프로세서_day13 본문
====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의 값을 리턴
-> 수신버퍼가 데이터가 찼는지 확인? UCSR1A의 RXC1이 1일 때
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를 인터럽트로 처리
->LED를 0.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 |