벌써 몇일째 헤매다가 여기로 다시 찾아 왔습니다.
B포트에서 0번과 1번 핀에 스위치로 on-off를 시켜서 신호를 주고
그 거에 따라서 D포트에서 정보를 uart통신으로 전송합니다.
그리고 E포트에서는 외부에서 오는 정보를 받아서 컴퓨터와 시리얼 통신을 하는 소스를
짜려고 시도 했습니다....
혹시나 해서 적습니다...
ATmega128 를 사용하였으며,
AVR Studio + WINAVR 를 사용하여 코딩 하였습니다.
증상으로는
B포트와는 상관없이 계속해서 D포트에서 정보와 상관없이 전압이 나오는데요..
스위치가 안먹는거 같기도 하고,,, B포트 0번 1번에서는 스위치에 따라 분명히 전압 5V가 들어가는것을 확인햇습니다만,,,되는걸 보면 전혀 프로그램 데로 되지 않습니다. 아예 B포트,D포트를 무시하네요...
주석으로 _
uart통신 0번 이나 1번 (E포트나 D포트)를 각 각 하나씩 사용하면 되는데
두개 를 동시에 쓰려고 하면 안되는것 같습니다.
고수님들 소스좀 봐주세요,,, 뭐가 문제 일까요?ㅠ
====================================================================================
#include <avr/io.h>
#include <avr/interrupt.h>
#include "delay.h"
char rx_data;
char tx_data;
volatile unsigned int count=0;
void USART_Transmit(unsigned char data) //E1송신 RS-232 통신을 할 정보
{
while((UCSR0A & 0x20) == 0x00);
UDR0 = data;
}
void USART_TransmitD(unsigned char data) //D3송신 LED로 전송할 정보
{
while((UCSR1A & 0x20) == 0x00);
UDR1 = data;
}
SIGNAL(SIG_UART0_RECV)
{
cli();
rx_data = UDR0;
tx_data = rx_data;
USART_Transmit(tx_data);
sei();
}
int main(void)
{
DDRE=0x02;
DDRD=0x08;
DDRB=0x00; //스위치와 연결하여 B포트 0번과 1번에 연결하여 사용
UCSR0A = 0x00; // asynchronous normal mode
UCSR0B = 0x98; // 송수신 완료 인터럽트 on //0x98
UCSR0C = 0x06; // no parity, 1 stop, 8data
UBRR0H = 0x00;
UBRR0L = 0x67; // Baudrate
UCSR1A = 0x00; // asynchronous normal mode
UCSR1B = 0x98; // 송수신 완료 인터럽트 on //0x98
UCSR1C = 0x06; // no parity, 1 stop, 8data
UBRR1H = 0x00;
UBRR1L = 0x67; // Baudrate
sei();
while(1){
if(PINB == 0x01)
{
USART_TransmitD('N');
}
if(PINB == 0x02)
{
USART_TransmitD('P');
}
if(PINB == 0x03)
{
USART_TransmitD('T');
}
}
return 0;
}
===================================================================================
고수님들,,,
뭐가 문제 일까요??ㅠ
16MHz 9600bps 인것 같네요.
9600bps 테스터기로 확인하기 힘들것 같네요.
스코프 등으로 ... 컴퓨터 시리얼 포트....
좀더 자세히 이야기 해주시면 안될까요?ㅋ
소스상으로도 그렇게 되어 있는데, 이렇게는 UART0 통신 초기화에 문제가 생길 듯합니다.
위의 소스상으로 보면 DDRE,DDRD의 포트를 모두 Output으로 설정되어 있습니다.
DDRE = 0x00;DDRD = 0x00; 하시고 이후 UART 관련 초기화를 진행하시면 됩니다.
UART Data 송출 후 Delay를 주셔야 할 듯 합니다.
UART 전송 속도보다 포트 Check 속도가 빨라서 충돌이 있거나
한번 스위칭 동작에 송출이 계속 반복될 듯..