#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;
//}
|