오늘 LCD 문제를 해결 후 USART0 와 Bluetooth 를 이용한 RS232 통신 구현을 시도했다.
이번 작업을 하면서 전에 없이 모든 스텝에 삽질을 하게 되었는데...
이번에도 대략 4시간여의 삽질...
현상은 MCU에서 송신은 가능 했으나 수신이 되지 않았다.
문제는 USART0/1 포트가 USB-AVRISP 와 포트를 공유하고 있었던 것...
때문에 데이터 라인에 신호의 충돌이 생겨 송신 신호가 제대로 구성되지 않은 것이다.
결국 ISP를 제거하자 모든 것이 정상 동작하였다.
마감까지 앞으로 일주일...
힘겨운 한달을 보내고 있다.
하~
'USART'에 해당되는 글 2건
- [2007/09/21] [AVR][ATmega128] USART와 ISP (1)
- [2007/09/06] [AVR][ATmega8] USART (3)
< ATmega8에서 USART의 사용 >
ATmega8에서 Bluetooth를 이용한 USART를 구현하기 위해 하루의 삽질을 했다.
다음은 그 결과이다.
ATmega8에서 USART의 사용할 때,
UCSRC에 접근하기 위해서는 URSEL(bit7) bit를 set 시켜야 한다.
ATmega128의 USART 기능을 사용할 때에는 URSEL bit가 명시되어 있지 않다.
ATmega8의 Datasheet p152를 보면 이유를 알 수 있다.
ATmega8에서는 UCSRC와 UBRRH가 같은 I/O 주소를 점유하고 있기 때문에
UCSRC에 접근하기 위해서는 URSEL을 set 해주어야 하는 것이다.
사실인지 확인하기 위하여
AVR-gcc의 'iom8.h' 파일을 열어 확인해 본 결과 아래와 같았다.
#define UCSRC _SFR_IO8(0x20)
#define UBRRH _SFR_IO8(0x20)
#define UBRRH _SFR_IO8(0x20)
같은 AVR 계열이라고 하더라도
모델에 따라 기능의 사용에 주의가 필요하다는 것을 깨닫는 순간이었다.
아래는 USART 사용을 위한 전체 코드이다.
//K ---------------------------------------------------------->>
//K USART
void USART_Init(void)
{
char tmp = 0;
UBRRH = 0x00;
UBRRL = 0x67; //K 9600bps on 16MHz
UCSRA = 0x00;
UCSRB = 0x98; //K Receive Interrupt Enable, Receive Enable, Trans Enable
UCSRC = 0x86; //K async, no parity, stop 1, data 8
tmp = UDR; //K dummy read
}
void USART_PutChar(char data)
{
while ((UCSRA & 0x20) == 0x00); //K while no empty
UDR = data;
}
void USART_Puts(char* string)
{
while (*string != '\0')
USART_PutChar(*(string++));
}
static WORD rsData = 0;
static Bool refresh = False;
ISR(USART_RXC_vect)
{
rsData = UDR;
refresh = True;
}
//K <<----------------------------------------------------------
//K USART
void USART_Init(void)
{
char tmp = 0;
UBRRH = 0x00;
UBRRL = 0x67; //K 9600bps on 16MHz
UCSRA = 0x00;
UCSRB = 0x98; //K Receive Interrupt Enable, Receive Enable, Trans Enable
UCSRC = 0x86; //K async, no parity, stop 1, data 8
tmp = UDR; //K dummy read
}
void USART_PutChar(char data)
{
while ((UCSRA & 0x20) == 0x00); //K while no empty
UDR = data;
}
void USART_Puts(char* string)
{
while (*string != '\0')
USART_PutChar(*(string++));
}
static WORD rsData = 0;
static Bool refresh = False;
ISR(USART_RXC_vect)
{
rsData = UDR;
refresh = True;
}
//K <<----------------------------------------------------------


::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::
무슨 마감? ㅋㅋ