PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   Giao tiếp UART (http://www.picvietnam.com/forum/showthread.php?t=663)

hoangminh1234 08-10-2006 11:01 AM

Giao tiếp UART
 
2 Attachment(s)
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
Code:

/*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
Code:

//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.


Múi giờ GMT. Hiện tại là 03:18 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam