#include <mega128.h>
#include <delay.h>
#include <clcd.h>
char temp, ftemp, stemp, sftemp;
char zansori[13];
char szansori[13];
int i = 0, k = 0;
interrupt [USART0_RXC] void usart0_receive(void)
{
stemp = UDR0;
if(stemp != \'\\n\')
{
sftemp = stemp;
szansori[k] = sftemp;
k++;
PORTB = PORTB<<1;
if(k==12)
{
k=0;
}
}
else
{
if(stemp==\'\\n\')
{
for(k=k-1;k<=12;k++)
{
szansori[k] = \' \';
}
k=0;
}
else if(k==12)
{
k=0;
}
}
}
void putch_USART0(unsigned char data0)
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data0;
}
interrupt [USART1_RXC] void usart1_receive(void)
{
temp = UDR1;
putch_USART0(temp);
if(temp != \'\\n\')
{
ftemp = temp;
zansori[i] = ftemp;
i++;
if(i==12)
{
i=0;
}
}
else
{
if(temp==\'\\n\')
{
for(i=i-1;i<=12;i++)
{
zansori[i] = \' \';
}
i=0;
}
else if(i==12)
{
i=0;
}
}
}
void USART0_init(void)
{
UCSR0A = 0x00;
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
UCSR0B = 0x98;
UBRR0H = 0x00;
UBRR0L = 0x07;
}
void USART1_init(void)
{
UCSR1A = 0x00;
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
UCSR1B = 0x98;
UBRR1H = 0x00;
UBRR1L = 0x07;
}
/*
void putch_USART1(unsigned char data1)
{
while(!(UCSR1A & (1<<UDRE1)));
UDR1 = data1;
}
*/
void Port_Init(void)
{
PORTA = 0x00; DDRA = 0xFF;
PORTB = 0xFe; DDRB = 0xFF;
PORTD = 0x04; DDRD = 0x04;
//PORTE = 0x02;
DDRE = 0x02;
PORTG = 0x00; DDRG = 0x1F;
}
void init_devices(void)
{
cli();
USART0_init();
USART1_init();
Port_Init();
LCD_Init();
sei();
}
void main(void)
{
Byte me[] = \"I :\";
Byte you[] = \"U :\";
init_devices();
while(1)
{
LCD_pos(0,0);
LCD_STR(me);
LCD_pos(1,0);
LCD_STR(you);
if(temp == \'\\n\')
{
LCD_pos(0,3);
LCD_STR(zansori);
}
if(stemp == \'\\n\')
{
LCD_pos(1,3);
LCD_STR(szansori);
}
}
}
이거 보고 오류좀 찾아줘
지금 하는게
pc - USART1 - 128보드 - USART0 - 128보드 - USART1 - pc
이렇게 채팅 프로그램 만들려고 하는데 상대쪽 보드로 내가 입력한 값이 넘어가질 않네
왜그런지 좀 찾아줘 제발 부탁할게
DOS 프로그램 짜던 깐으로 그럭저럭 128모듈 쓰고있다능.. 소스보니니가 기본개념은 잡히신분같은데 이리저리테스트하시다보면 성공하길껍니다 ㅋ;
저는 눈으로보면 자동컴파일되는 능력이 없어서. 남의소스를 봐도 그냥 머리만아프로 잘모르겠더군요
232c 가 안되면 자증나고 답답하죠 ㅋ
회로부터 차례대로 검증
루프 테스트 USART1 , USART0 개별 pc 터미널 통신까지 다 확인했음 근데 안됨
계속해도 결국안되면 나중에 제꺼소스라도 보여드리겠습니다.. 지금병원에 입원중이라 그소스는 딴곳에 ㅋ;
보드 쪽에에 수신코드를 넣지 말고 송신 코드를 넣은 다음에 터미널에서 메세지 찍히는 것을 확인. 아예 안뜨면 USART단자에 오실로스코프 찍어서 비트 지나가는지 보고 펄스 지나가면 터미널 쪽에 보레이트 바꾸어 보고 하는식으로 한단계씩 검증해야 함
원래 책이나 이런곳에서 잘 돌아가는 소스를 먼저 넣어서 회로를 검증 한 다음에 그 코드를 샘플삼아서 통신하는 것이 가장 무난함.
UART는 이거 쓰셈
https://github.com/cyluss/avr-batteries
내가 하려는 방식이 pc1 - 보드1 은 USART1 으로 연결 pc2 - 보드2 은 USART1 으로 연결 보드1 - 보드2 는 USART0로 연결 이렇게 되는거지
그래서 테스트 방식으로 선택했던게 보드한개에 입력을 한개는 USART1, 다른 하나는 USART0 로 입력으로 놓고 같은 소스로 출력을 확인하면 원하는 대로 된다.
이걸로 확인해봤을때
pc1 - 보드1 은 USART1 으로 연결
pc2 - 보드2 은 USART1 으로 연결
보드1 - 보드2 는 USART0
보드1 - 보드2 연결되는 송신부에서 문제가 있는거 같아
오실로스코프로 확인을 안하는게 아니고 할수가 없는 상황이다
void putch_USART0(unsigned char data0) { while(!(UCSR0A & (1<<UDRE0))); UDR0 = data0; }
야 그냥 AVR 하나로 USART0 USART1 하면 안되냐
혹시나 해서 묻는건데 TX RX 크로스 했음?
생각놀이 // 그정도 기초도 모르면 이런 질문도 안올렸겠짘ㅋㅋㅋㅋㅋ
대체 왜 AVR 두개가 필요한지 모르겠다
ㅇㅇ// 그냥 좆나쓸데없는 고집이라고 생각하면 된다. 도와주라
AVR 하나로 UART0 UART1 동시에 쓰는거부터 하셈
ㅇㅇ// 위에 보면 있잖아 테스트 방식으로 보드 한개에 USART0 USART1 동시 입력받고 같은 LCD 창에 띄워놓고 대화하는 프로그램까지 해봤다고 그리고 나서 위에 2대로 연동해서 대화하는 형식을 구현하고 싶은거래도?
나같으면 입출력큐를 만들겠어
ㅇㅇ// 마이크로 프로세서 시간에 배우고 혼자놀고 잇는 중인데 입출력큐가 뭔지는 모르겠다