PDA

View Full Version : Giao tiếp UART


hoangminh1234
08-10-2006, 11:01 AM
Em đang viết chương trình giao tiếp giữa hai con 16f877 với mục đích là truyền hàng loạt byte từ con này sang con kia. Chương trình truyền được rồi và hiển thị khá đúng theo ý muốn. Nhưng cái hạn chế quá lớn của chương trình là tốc độ truyền chậm quá. Mỗi lần truyền một byte xong thì phải delay_ms(250) thì con tớ mới nhận được đúng.Mình đã thử nhiều số khác nhau nhưng khi giảm nhỏ xuống còn delay_ms(200) thì không nhận được nữa. Các huynh (đặc biệt là anh LaMuaThu ) cho xin ý kiến nhé
sau đây là .chương trình con master
/*chuong trinh 1 MASTER MASTER MASTER MASTER MASTER MASTER MASTER MASTER
xuat du lieu tu master ra cong noi tiep MASTER MASTER MASTER
muc dich: truyen du lieu tu pic nay sang pic khac MASTER MASTER MASTER
MASTER MASTER MASTER MASTER MASTER MASTER MASTER MMMMMASTER MASTER MASTER*/
//MASTER SAU KHI TRUYEN MOT SO BYTE NHAT DINH THI SAU DO KO LAM GI CA
#include <16F877a.h>
#fuses HS, NOWDT, NOLVP, XT
#use delay(clock=4000000)
#use rs232(baud=19200,xmit=pin_c6,rcv=pin_c7)
byte data_out[8]={0x55,0Xaa,0X88,0x11,0x22,0x33,0x44,0x55};

void main()
{ set_tris_b(0x00);set_tris_d(0);

output_d(data_out[0]);//1
putc(data_out[0]);
delay_ms(250);

output_d(data_out[1]);//2
putc(data_out[1]);
delay_ms(250);

output_d(data_out[2]);//3
putc(data_out[2]);
delay_ms(250);

output_d(data_out[3]);//4
putc(data_out[3]);
delay_ms(250);

output_d(data_out[4]);//5
putc(data_out[4]);
delay_ms(250);

output_d(data_out[5]);//6
putc(data_out[5]);
delay_ms(250);

output_d(data_out[6]);//7
putc(data_out[6]);
delay_ms(250);

output_d(data_out[7]);//8
putc(data_out[7]);
delay_ms(250);
}


rồi đến chương trình slave
//SLAVE NHAN DU LIEU VA SAU DO CAT VAO CAC THANH GHI DA DUOC DINH SAN
#include <16F877A.h>
#fuses HS, NOWDT, NOLVP, XT
#use delay(clock=4000000)
#use rs232(baud=19200,xmit=pin_c6,rcv=pin_c7)
int8 rcservo[8];
int8 next_in=0;

void main() {
set_tris_a(0);output_a(63);
set_tris_d(0);output_d(255);delay_ms(20);
for(;;){
if(kbhit()){
if(next_in==7) { goto xuatdulieu;}
rcservo[next_in]=getch();
next_in++;
}

}

xuatdulieu:
delay_ms(100);
for(;;){
output_d(rcservo[0]);output_a(1);delay_ms(1550);
output_d(rcservo[1]);output_a(2);delay_ms(1550);
output_d(rcservo[2]);output_a(3);delay_ms(1550);
output_d(rcservo[3]);output_a(4);delay_ms(1550);
output_d(rcservo[4]);output_a(5);delay_ms(1550);
output_d(rcservo[5]);output_a(6);delay_ms(1550);
output_d(rcservo[6]);output_a(7);delay_ms(1550);
output_d(rcservo[7]);output_a(8);delay_ms(1550);
}}


sơ đồ mô phỏng proteus

/*muc dich cua ham output_a:
a=1 => byte thu nhat dang hien thi ra portd
a=2 => byte thu hai dang hien thi ra portd
a=3 => byte thu ba dang hien thi ra portd
....
delay de co the quan sat duoc su thay doi nay
*/

lapnghiep123
14-09-2010, 04:12 PM
Mình đã thử chạy và cho thời gian delay cho thấp hơn 250 vẫn có thể chạy đúng. Thậm chí mình đã cho delay_time = 50ms.