// 파일명 : uart.c
// 내 용 : uart 통신 관련.
// M P U : Atmega128
// Clock : 16MHz
// 컴파일 : IAR EWAVR V5.50
#include <iom128.h>
#include <ina90.h>
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 128
#define RX_SIZE 256
int rx_Cur0=0, rx_Get0=0 ;
char rx_Buf0[RX_SIZE] ;
int rx_Cur1=0, rx_Get1=0 ;
char rx_Buf1[RX_SIZE] ;
/* short 형으로 보낼때 사용.
union
{
unsigned short sData ;
char cData[2] ;
} uniSerial ;
*/
void InitUart(int baud_0, int baud_1)
{
UCSR0A = 0x00; // Not Double mode, Not multi_communication
UCSR0B = 0x98; // 0(RxIntDIs) 0(TxIntDIs) 0 1(Receive En) 1(Trans En) 0 0 0
UCSR0C = 0x06; // 0(x) 0(Asyn) 00(NoParity) 0(1StopBit) 11(8Bit) 0
UBRR0H = 0x00;
//UBRR0L = BAUD19200_MZ ;
UBRR0L = baud_0 ;
UCSR1A = 0x00;
UCSR1B = 0x98; // 0 0 0 1(Receive En) 1(Trans En) 0 0 0
UCSR1C = 0x06; // 0(x) 0(Asyn) 00(NoParity) 0(1StopBit) 11(8Bit) 0
UBRR1H = 0x00;
///UBRR1L = BAUD19200_MZ ; // BAUD_MZ ; // 0x19 //
UBRR1L = baud_1 ;
UCSR0B |= (1<<RXCIE0) ;
UCSR1B |= (1<<RXCIE1) ;
}
#pragma vector = USART0_RXC_vect
__interrupt void USART0_RXC_interrrupt(void)
{
rx_Buf0[rx_Cur0++] = UDR0 ;
if(rx_Cur0>=RX_SIZE) rx_Cur0=0 ;
}
#pragma vector = USART1_RXC_vect
__interrupt void USART1_RXC_interrrupt(void)
{
rx_Buf1[rx_Cur1++] = UDR1 ;
if(rx_Cur1>=RX_SIZE) rx_Cur1=0 ;
}
void Enable_Rx0(void)
{
UCSR0B |= (1<<RXCIE0) ;
}
void Disable_Rx0(void)
{
UCSR0B &= ~(1<<RXCIE0) ;
}
void Enable_Tx0(void)
{
UCSR0B |= (1<<TXCIE0) ;
}
void Disable_Tx0(void)
{
UCSR0B &= ~(1<<TXCIE0) ;
}
char Get_Uart0(char *ch)
{
if(rx_Cur0==rx_Get0) return 0 ; // 입력 없음.
*ch = rx_Buf0[rx_Get0++] ;
if(rx_Get0>=RX_SIZE) rx_Get0=0 ;
return 1 ;
}
char Get_Uart1(char *ch)
{
if(rx_Cur1==rx_Get1) return 0 ; // 입력 없음.
*ch = rx_Buf1[rx_Get1++] ;
if(rx_Get1>=RX_SIZE) rx_Get1=0 ;
return 1 ;
}
void Uart0_ch(unsigned char byte)
{
while ( !(UCSR0A & (1 << UDRE0)) );
UDR0 = byte;
}
void Uart1_ch(unsigned char byte)
{
while ( !(UCSR1A & (1 << UDRE1)) );
UDR1 = byte;
}
void Uart0_str(char *str)
{
while(*str)
Uart0_ch(*str++) ;
}
void Uart1_str(char *str)
{
while(*str)
Uart1_ch(*str++) ;
}
void Uart0_strLen(char *str, int len) // len 크기만큼 데이터를 보낸다. 데이터가 0인 경우도 보내기 위함.
{
int i ;
for(i=0 ; i<len ; i++)
Uart0_ch(*str++) ;
}
void Uart1_strLen(char *str, int len) // len 크기만큼 데이터를 보낸다. 데이터가 0인 경우도 보내기 위함.
{
int i ;
for(i=0 ; i<len ; i++)
Uart1_ch(*str++) ;
}
void Uart0_printf(char *fmt,...)
{
va_list ap;
char string[BUF_SIZE];
va_start(ap, fmt);
vsprintf(string, fmt, ap);
Uart0_str(string);
va_end(ap);
}
void Uart1_printf(char *fmt,...)
{
va_list ap;
char string[BUF_SIZE];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart1_str(string);
va_end(ap);
}
// ========================
#ifndef __UART_HEADER__
#define __UART_HEADER__
#define BAUD_9600_16MZ 0x67 // 16 Mz, 9600
#define BAUD9600_MZ 0x33 // 8 Mz, 9600
#define BAUD19200_MZ 0x19 // 8 Mz, 19200
void InitUart(int baud_0, int baud_1) ;
void Enable_Rx0(void) ;
void Disable_Rx0(void) ;
void Enable_Tx0(void) ;
void Disable_Tx0(void) ;
char Get_Uart0(char *ch) ;
char Get_Uart1(char *ch) ;
void Uart0_ch(unsigned char byte) ;
void Uart1_ch(unsigned char byte) ;
void Uart0_str(char *str) ;
void Uart1_str(char *str) ;
void Uart0_strLen(char *str, int len) ; // len 크기만큼 데이터를 보낸다. 데이터가 0인 경우도 보내기 위함.
void Uart1_strLen(char *str, int len) ; // len 크기만큼 데이터를 보낸다. 데이터가 0인 경우도 보내기 위함.
void Uart0_printf(char *fmt,...) ;
void Uart1_printf(char *fmt,...) ;
#endif
Uart.c
Uart.h