Thông báo

Collapse
No announcement yet.

Cần giúp đỡ về giao tiếp computer

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Cần giúp đỡ về giao tiếp computer

    /* Chương trình
    -Đọc data ở P0 gửi nối tiếp đến computer và P2
    -Nhận data nối tiếp từ computer gửi đến P1
    -Dùng ngắt nối tiếp
    */
    #include<at89x51.h>
    void serial_int() interrupt 4 //ngắt được gọi khi TI hay RI=1
    { if(TI==1) TI=0 //truyền xong 1 byte
    P1=SBUF; //nhận data từ comp
    RI=0; //sãn sàng nhận byte tiếp theo
    }
    void main()
    {
    P0=0xff; //input
    EA=1; //cho phép ngắt
    ES=1; //ngắt nối tiếp
    TMOD=0x20; //timer 1 mode 2
    TH1=0xe8; //toc độ baud 1200
    SCON=0x50; //1 start, 8data, 1 stop, non p, REN=1
    TR1=1; // chạy timer 1
    while(1)
    { SBUF=P0; //send data tu P0 den comp
    P2=P0; //send data den P2
    }
    }

    ====câu hỏi====
    mình có một số thắc mắc:
    1/dựa vào câu lệnh while(1), hàm ngắt chỉ được gọi khi truyền xong 1 byte nghĩa là lúc này TI=1. Khi thực thi hàm ngắt, gặp lệnh "P1=SBUF" thì P1=P0??? (vì while(1) có lệnh SBUF=P0)
    2/ sau lệnh "P1=SBUF" => nhận xong 1 byte=> RI=1 => ngắt lại được gọi tiếp??? nếu vậ nó sẽ bo qua lệnh "RI=0"
    3/vì mình đang mò VB(chưa bít xài ), nên chưa test được chương trình này, các bồ coi có sai chỗ nào thì góp ý dùm mình
    4/ai có lòng tốt đại bác có thể chỉ mình các bước truyền và nhận data bằng VB được ko?
    vd như xài timer thì :
    -chọn mode bởi thghi TMOD
    -nạp giá trị cho THn,TLn (ứng với mỗi mode có giới hạn khác nhau)
    -SETB TRn
    -JNB TFn,$
    -CLR TFn ...
    vậy truyền và nhận data bằng VB gồm các bước nào?, nếu được thì viết CT demo cho yêu cầu trên cho mình được ko?(hì hì), vì mình đang làm bài tập lớn, tốn 2 tuần với mớ sách VB mà chưa được gì (cùi bắp quá), nếu có được CT demo thì mình sẽ chỉnh sửa lại theo kiến thức của mình (ko chôm chỉa)
    ...có gì bí mình sẽ hỏi tiếp
    thz for ur read and reply

  • #2
    chưa có ai giúp cả
    Mình thủ viết chuong trình demo nhận data từ PC, nhưng test ko thấy chạy, up lên đây nhờ các bác chỉ giáo

    Comment


    • #3
      hix, quên up lên

      Comment


      • #4
        Nguyên văn bởi nhansky
        /* Chương trình
        -Đọc data ở P0 gửi nối tiếp đến computer và P2
        -Nhận data nối tiếp từ computer gửi đến P1
        -Dùng ngắt nối tiếp
        */
        #include<at89x51.h>
        void serial_int() interrupt 4 //ngắt được gọi khi TI hay RI=1
        { if(TI==1) TI=0 //truyền xong 1 byte
        P1=SBUF; //nhận data từ comp
        RI=0; //sãn sàng nhận byte tiếp theo
        }
        void main()
        {
        P0=0xff; //input
        EA=1; //cho phép ngắt
        ES=1; //ngắt nối tiếp
        TMOD=0x20; //timer 1 mode 2
        TH1=0xe8; //toc độ baud 1200
        SCON=0x50; //1 start, 8data, 1 stop, non p, REN=1
        TR1=1; // chạy timer 1
        while(1)
        { SBUF=P0; //send data tu P0 den comp
        P2=P0; //send data den P2
        }
        }

        ====câu hỏi====
        mình có một số thắc mắc:
        1/dựa vào câu lệnh while(1), hàm ngắt chỉ được gọi khi truyền xong 1 byte nghĩa là lúc này TI=1. Khi thực thi hàm ngắt, gặp lệnh "P1=SBUF" thì P1=P0??? (vì while(1) có lệnh SBUF=P0)
        2/ sau lệnh "P1=SBUF" => nhận xong 1 byte=> RI=1 => ngắt lại được gọi tiếp??? nếu vậ nó sẽ bo qua lệnh "RI=0"
        3/vì mình đang mò VB(chưa bít xài ), nên chưa test được chương trình này, các bồ coi có sai chỗ nào thì góp ý dùm mình
        4/ai có lòng tốt đại bác có thể chỉ mình các bước truyền và nhận data bằng VB được ko?
        vd như xài timer thì :
        -chọn mode bởi thghi TMOD
        -nạp giá trị cho THn,TLn (ứng với mỗi mode có giới hạn khác nhau)
        -SETB TRn
        -JNB TFn,$
        -CLR TFn ...
        vậy truyền và nhận data bằng VB gồm các bước nào?, nếu được thì viết CT demo cho yêu cầu trên cho mình được ko?(hì hì), vì mình đang làm bài tập lớn, tốn 2 tuần với mớ sách VB mà chưa được gì (cùi bắp quá), nếu có được CT demo thì mình sẽ chỉnh sửa lại theo kiến thức của mình (ko chôm chỉa)
        ...có gì bí mình sẽ hỏi tiếp
        thz for ur read and reply
        Đoạn code trên có một số phần không hợp lý lắm. Tôi xin sửa lại như sau :
        1.Đoạn code cho VDK:
        /*Đoạn chương trình này sẽ gửi xâu "OK" và dữ liệu đọc từ Port0 lên PC khi nhận được ký tự 0x55 từ máy tính truyền xuống.
        */

        #include<at89x51.h>

        unsigned char Dulieu;

        void SendChr(unsigned char x); // Send data to PC

        void serial_int() interrupt 4 using 0 //
        {
        if(RI) // if received data from PC
        {
        Dulieu=SBUF; //nhận data từ comp
        P1=Dulieu;
        if(Dulieu == 0x55)
        {
        SendChr('O');SendChr('K');
        SendChr(P0);
        P2=P0;
        }
        RI=0; //sẵn sàng nhận byte tiếp theo
        }
        }
        void main()
        {
        P0=0xff; //input
        EA=1; //cho phép ngắt
        ES=1; //ngắt nối tiếp
        TMOD=0x20; //timer 1 mode 2
        TH1=0xe8; //toc độ baud 1200
        SCON=0x50; //1 start, 8data, 1 stop, non p, REN=1
        TR1=1; // chạy timer 1
        while(1)
        {
        }
        }

        void SendChr(unsigned char x)
        {
        EA=0; // Disable interrupt
        TI=0;
        SBUF=x;
        while(!TI);//wait until finished transmit data
        TI=0;
        EA=1; //Enable interrupt
        }


        2. Chương trình trên VB :
        - phần thủ tục Init comport nên đưa vào form_load:
        sub InitCom()
        with MSComm
        .CommPort = 1
        .Settings = "1200,N,8,1"
        .inputLen=0;
        .PortOpen = True
        end with
        end sub

        - phần gửi data xuống nên viết như sau :
        sub SendData(x)
        MSComm1.Output=chr(x) ' send Ascii character code
        end sub

        -Đoạn code truyền nhận có thể viết như sau :
        sub cmdSend_Click()
        dim bReceived as Boolean
        bReceived=FALSE;
        SendData(&H55)
        do
        DoEvent
        if(MSComm1.InBufferCount>=1) then
        str=str+MSComm1.Input
        if(len(str>3))then
        bReceived=TRUE
        text1.text=str
        str=""
        end if
        end if
        loop Until(bReceived)

        end sub

        * Vì máy không cài VB nên chỉ nhớ mang máng là như vậy. Có gì sai sót , xin mọi người sửa giúp .

        Comment


        • #5
          Cảm ơn trungkt rất nhiều, mình đang bí về phần code VB cho PC nhận data từ 8051 gửi lên.
          công việc: 8051 sẽ gửi data lên cho PC xử lý, kết quả xử lý của PC sẽ gửi ngược về cho 8051. Việc nhận và gửi data của PC xảy ra tự động chứ không đợi người dùng click mouse điều khiển. Mình không biết phải đặt code cho PC nhận và send data vào sự kiện nào. Về điều khiển MsComm có sự kiện OnCom nhưng mình chưa hiểu rõ lắm về sự kiện này (dù đã đọc MSDN). Mong được sự góp ý của trungkt và mọi người
          Sẵn đây mình up phần truyền data từ PC xuống 8051, đây là phần demo, điều khiển on/off Led gắn ở P1,2 của 8051, hy vọng giúp ích đuọc phần nào cho các bạn mới tìm hiểu về serial port như mình

          Comment


          • #6
            Re

            Về sự kiện Oncomm thì bạn cần chú ý đặt thuộc tính của RTreshold phải là 1 số lớn hơn 0 (tui[FONT=Arial] thường đặt là 1) thì khi đó mới có sự kiện Oncomm xảy ra

            Comment


            • #7
              bạn nhansky có thể xem bài mình viết ở http://dientuvietnam.net/board/showt...=5223#post5223
              mình viết rất đầy đủ về cái này.
              Technical sale at WT Microelectronics S'pore
              Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
              Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

              Comment


              • #8
                Mình đang kẹt tại việc truyền data từ 8051 lên PC, đây là code chương trinh test thử, mình dùng ngắt ngoài để thực hiện việc truyền data, mong được góp ý:
                ===8051===
                #include <at89x51.h>
                void delay(int i)
                { while(i--);
                }

                void ngatngoai0()interrupt 0
                {
                delay(2000);
                P2=0x00; //P2 được nối với Led dể test khi nhấn sw gọi ngắt
                delay(1000);
                P2=0xff;
                SBUF =65;//send to PC
                }

                void main()
                {
                EA=1; // cho phep ngat
                ES=1; //ngat noi tiep
                EX0=1;
                IT0=1; //ngat ngoai theo canh
                TMOD=0x20; //che do 2, timer 1
                SCON= 0x50; //1 start,8 bit data,1 stop, non parity, REN=1
                TH1=0xe8; //toc do baud 1200bps
                TR1=1; //cho timer 1 chay
                }

                ===VB===

                Private Sub cmdExit_Click()
                MSComm.PortOpen = False
                Unload Me
                End Sub

                Private Sub Form_Load()
                With MSComm
                .CommPort = 2 'dung Com 2
                .Settings = "1200,N,8,1"
                .RThreshold = 1 'receive 1 byte thi goi OnCom
                .PortOpen = True
                End With
                End Sub

                Private Sub MSComm_OnComm()
                Dim re As Variant
                If MSComm.CommEvent = comEvReceive Then
                re = MSComm.Input
                lblReceive.Caption = "nhan duoc:" & re
                End Sub

                ===
                mình dùng lblReceive để hiển thị giá trị nhận được từ 8051,nhưng khi test thì nó không hiện thị ra giá trị nhận được, mà nó chỉ hiện ra câu thông báo "nhan duoc:", vậy có nghĩa là sự kiện OnCom đã được gọi, nhung tại sao vẫn không thể hiển thị được giá trị nhận được????????, mong được giúp đỡ

                Comment


                • #9
                  Bác thử kiểm tra xem nhận được bao nhiêu byte ?

                  Private Sub MSComm_OnComm()
                  Dim re As Variant
                  re = MSComm.Input
                  MsgBox(Len(re))
                  End Sub


                  Nếu mà nó hiện lên là 0 thì bác xem lại đoạn gởi data lên.

                  void sendData(unsigned char c)
                  {
                  SBUF = c;
                  while(TI); // chờ cho tới khi gởi xong.
                  }

                  Thân !

                  Comment


                  • #10
                    Cảm ơn mọi người và bác ANE nhé, mình nhận từ PC được rồi, lỗi là ở chỗ
                    void ngatngoai0()interrupt 0
                    {
                    delay(2000);
                    P2=0x00; //P2 được nối với Led dể test khi nhấn sw gọi ngắt
                    delay(1000);
                    P2=0xff;
                    SBUF =65;//send chữ "B" lên PC
                    //thiếu lệnh xóa cờ TI, thật ngớ ngẩn hì hì
                    while(!TI);
                    TI=0;

                    }

                    *Bây giờ mình hỏi thêm nhá, nếu như mình muốn PC giao tiếp với 3 con 8051, mình đấu trực tiếp 3 chân RxD và TxD của 8051 vào Max232. 3 con 89 chỉ có nhiem vụ send, PC thì receive lien tục. vậy có cách nào để send data lên PC mà không gặp lỗi trên đường truyền?
                    *Ý mình là sẽ phân chia thời gian truyền cho từng con 89, giả sử con 1 send thì 2 con còn lại sẽ phải chờ, cứ như vậy quét vòng tròn. Nhung vì 3 con 89 hoạt động độc lập, nên mình ko biết cách nào xác định được đường truyền tại thời điểm đó đang được chiếm dụng bởi con nào??
                    Không biết ý tưởng như vậy được ko?, mong được góp ý

                    mình up sourcecode send-receive lên cho các bạn mới như mình đỡ khó khăn khi làm quen voi serialport
                    Attached Files

                    Comment


                    • #11
                      Bạn có thể dùng IC75176 để giao tiếp theo dạng master/slave. Con master sẽ điều khiển việc truyền/nhận dữ liệu từ các slave, đồng thời kiêm thêm chức năng truyền DL lên PC.

                      Comment


                      • #12
                        Re

                        Trong 3 con bạn có thể chọn 1 con có vai trò như master. Hai con còn lại mối con có 1 PIN có vai trò như Chip Select (CS). Khi con master truyền thì cho các Pin CS tương ứng ở mức cấm truyền (do bạn quy định) sau khi Master truyền xong thì Master sẽ ra lệnh cho con thứ 2 truyền. Nếu bạn biết thời gian con này truyền là bao lâu thì sau khoãng thời gian đó bạn cho con khác truyền tiếp. Ngược lại nếu không biết thời gian thì phải có 1 dấu hiệu nào đó do con này báo cho Master biết là đã truyền xong chẵng hạn cho 1 Pin nào đó lên cao (hoặc xuống thấp). Bạn cần chú ý là nếu nối nhiều con trên đường RS232 có thể Pin-Out. Vì vậy nếu dữ liệu truyền thấy bị sai thì bạn có thể nối các chân Tx của 8051 qua một con Multiplex. Thông thường để giao tiếp như thế này người ta dùng chuẩn RS485 chứ ít dùng RS232.

                        Comment


                        • #13
                          Xin cac Bac cho hoi la luc viet chuong trinh giao tiep voi may tinh qua RS232 thi co can thiet lap gi trong he thong khong?VI du nhu la sua regedit chang han. Vi khong hieu sao tui viet theo tren mang huong dan ma cu bi bao loi hoai ha.
                          Van su nho cac Bac

                          Comment


                          • #14
                            bạn chẳng cần chỉnh gì trong hệ thống đâu, ngoại trừ ai đó nghịch trong hệ thốn diable cổng com1 của bạn thôi. Bạn thử up code của bạn lên cho mọi người xem mới biềt là bạn làm đúng không.
                            Technical sale at WT Microelectronics S'pore
                            Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
                            Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

                            Comment


                            • #15
                              thấy các bác trao đổi hoành tráng quá cho tại hạ góp vui với .Tại hạ đã viết mấy cái giao tiếp máy tính này lâu rồi firmware viết cho 8051 còn software thì viết bằng delphi7.0
                              giao tiếp cổng song song(LPT) thì các huynh đài có thể sử dụng các tệp đệm sau :inpout32.dll,NTPORT.dll,em sử dụng IO.Còn anh bạn PORT.dll thì mạnh thật nhưng chỉ support cho win98 thôi thế mới đau chứ!!!!!
                              giao tiep nối tiếp thì tại hạ sử dụng MSCOMM hì hì học tập chú VB ấy mà (anh em delphi tuy còn ít người dùng nhưng nhất định ko chịu thua kém đâu)
                              mấy cái này tại hạ làm cho đề tài thiết kế giao tiếp của mình gửi lên để làm quà cho anh em luôn gọi là quà trước khi tại hạ nghỉ ôn thi hi hi hi !!!!!!!!!!!!!!!!!!!!!
                              -----------------------------------------
                              chán quá mấy file exe khong thể load lên được lớn quá nén mọi cách rồi các bạn viết delphi chịu khó dịch vậy nhé.Còn các bạn tham khảo mã nguôn 8051 thì có thể xem ok.
                              diễn đàn này giới hạn dung lượng up lên nghiêm ngặt quá
                              Gạo cho vào giã bao đau đớn
                              Gạo giã xong rồi trắng tựa bông
                              Sống ở trên đời người cũng vậy
                              Gian nan rèn luyện mới thành công!
                              :cafe:

                              Comment

                              Về tác giả

                              Collapse

                              nhansky Tìm hiểu thêm về nhansky

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X