Thông báo

Collapse
No announcement yet.

Hỏi về lập trình giao tiếp

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

  • #31
    Nguyên văn bởi heoluoi2006 Xem bài viết
    bạn cho mình hỏi luôn nhé. mình đang use ngắt timer, mục đích của mình là khi mình truyền số xung từ pc xuống vdk, vdk nhận giá trị xung đó và tính toán giá trị nạp cho timer, sau đó timer sẽ đếm hết số xung đó thì xảy ra ngắt, nhưng mình đang không biết làm cách nào để nạp giá trị cho TH va TL của timer. ban cho minh y kiến nhé. mình làm ví dụ như sau

    vd: 65535-400=65135 /*400 là giá trị nhận được từ pc*/
    làm sao để nạp giá trị 65135 cho TH va TL vậy bạn.
    Như tôi đã hướng đãn rồi đấy, bạn chỉ việc lấy số này chia 256 là được byte cao và gán vào TH ( kết quả phải là số nguyên) hay viết TH= sodem / 256; - sodem la 65535-400.
    Byte thấp thì: TL =sodem % 256 ; đây là lấy phần dư = byte thấp.
    Kiểu trên là viết cho C.
    Chúc thành công.

    email:mahaco@fpt.vn

    Comment


    • #32
      cám ơn bạn rất nhiều vì đã nhiệt tình giúp mình

      Comment


      • #33
        nhờ bạn kiểm tra giúp mình xem mình có sai chỗ nào kg mà mình làm nó kg chạy
        *trên máy tính mình nhập số xung vào rồi nhấn start
        Private Sub START_Click()
        GTDAT = Val(txtGTD.Text)
        CAO = GTDAT / 256
        THAP = GTDAT Mod 256
        MSComm1.Output = Chr(CAO)
        MSComm1.Output = Chr(THAP)
        End Sub

        *còn đây là cho VDk
        #include"p89v51rx2.h"
        sbit DAO=P1^7;
        unsigned char CAO,THAP ;
        unsigned int SOXUNG,SODEM;

        void setuptimer(void)
        {
        SOXUNG = CAO*256+THAP;
        SODEM = 65535-SOXUNG;
        SCON = 0x50;
        TMOD=0x05;
        TH0=SODEM/256;
        TL0=SODEM%256;
        TR0=1;
        EA=1;
        ET0=1;
        ES0=1;

        }

        void main()
        {
        setuptimer();
        CMOD=0;
        CCAP3H=0; //chân PWM
        CCAPM3=0x42;
        CR=1;
        DAO=0; //động cơ đang chạy thuận
        while(1)
        {

        }
        }
        void timer0(void)interrupt 1
        {
        CCAP3H=1; //dừng động cơ
        TF0=0;
        }

        void serial(void)interrupt 4
        {
        if(RI)
        {
        RI=0;
        CAO = SBUF;
        THAP = SBUF ;

        }
        }

        Comment


        • #34
          Nguyên văn bởi heoluoi2006 Xem bài viết
          void serial(void)interrupt 4
          {
          if(RI)
          {
          RI=0;
          CAO = SBUF;
          THAP = SBUF ;

          }
          }
          Phần này sai cơ bản bạn ạ.
          Khi PC truyền byte cao xuống VĐK, ngắt nối tiếp được gọi, lúc này bạn chỉ có thể đọc SBUF cho CAO được thôi. Phải đến ngắt tiếp theo mới là byte thấp.
          Có nhiều cách để nhận 2 byte cho 1 gói. Cách đơn giản bạn hãy dùng biến đếm. bạn đầu cho dem =0; khi có ngắt nối tiếp thì dem ++; kiểm tra nếu dem ==1; thì CAO = SBUF; nếu dem==2; thì THAP = SBUF; và dem =0;

          email:mahaco@fpt.vn

          Comment


          • #35
            cám ơn bạn nhiều

            Comment


            • #36
              mình post một mậu lập trình nhé bạn nào cần thì tham khảo nhé:Giao diện điều khiển của mình như sau: Nó gồm một nút START (vb gửi chứ A ra cổng) STOP (vb gửi chữ B ra cổng ) kiểu string. và một Textbox dùng để hiển thị những giá trị mà máy tính nhận được từ cổng com. Ngoài ra còn có nút connect để mở cổng trước khi truyền nhận và nút Clear dùng để xóa giá trị hiển thị trong Textbox và nút close để đóng ứng dụng lại.

              '---------------CHUONG TRINH TEST -----------
              '**********************************************
              Private Sub cmdclose_Click()
              If MSComm1.PortOpen Then
              MSComm1.PortOpen = False
              End If
              End
              End Sub
              '------- THIET LAP CONG NOI TIEP --------
              Private Sub cmdopen_Click()
              MSComm1.Settings = "9600,n,8,1"
              MSComm1.CommPort = 1
              MSComm1.PortOpen = True
              MSComm1.InputLen = 0
              MSComm1.RThreshold = 1
              MsgBox " CONG DA MO "
              End Sub
              '-------- TRUYEN KY TU A RA CONG ----------
              Private Sub cmdstart_Click()
              Dim datasend As String
              datasend = "A"
              MSComm1.Output = datasend
              End Sub
              '-------- TRUYEN KY TU B RA CONG ----------
              Private Sub cmdstop_Click()
              Dim datasend1 As String
              datasend1 = "B"
              MSComm1.Output = datasend1
              End Sub
              Private Sub Command5_Click()
              Text1.Text = ""
              End Sub
              Private Sub Form_Load()
              Text1.Text = ""
              'RThreshold = 1
              'SThreshold = 0
              End Sub
              ' ********** SU KIEN ONCOM MOI**************
              Private Sub MSComm1_OnComm()
              Dim t As String
              If (MSComm1.CommEvent = comEvReceive) Then
              Text1.Text = MSComm1.Input
              End If

              End Sub
              NGUYỄN XUÂN VŨ
              Mua bán, sửa chữa PLC, biến tần
              Vỉ mạch điện tử công nghiệp các loại
              0978462163

              Comment


              • #37
                Cái mình cần bây giờ là làm sao để vẽ đồ thị được những giá trị nhận được đó trên VB (dữ liệu mình nhận được là dạng số nguyên do PLC gửi về 1s một giá trị) bạn nào giúp được mình thì post bài hướng dẫn hay gửi cho mình vào mail của mình nhé cảm ơn các bạn nhiều mình cần gấp lắm.
                xuanvudk2@gmail.com
                NGUYỄN XUÂN VŨ
                Mua bán, sửa chữa PLC, biến tần
                Vỉ mạch điện tử công nghiệp các loại
                0978462163

                Comment


                • #38
                  bạn xem dùm mình nhé hoctro89 ơi. mình làm giống như bạn hướng dẫn rồi nhưng nó vẫn kg chạy, mình cũng kg hiểu tại sao nữa. mình truyền 2 ky tự xuống và nạp cho timer nhưng hình như nó kg chịu, timer kg xay ra ngắt.

                  #include"p89v51rx2.h"
                  sbit DAO=P1^7;
                  unsigned char CAO,THAP,NHAN,uart_data,THUCTHI ;
                  unsigned int SOXUNG,SODEM;

                  void setuptimer(void)
                  {
                  SOXUNG = CAO*256+THAP;
                  SODEM = 65535-SOXUNG;
                  SCON = 0x50;
                  TMOD=0x25;
                  TH0=SODEM/256;
                  TL0=SODEM%256;
                  TR0=1;
                  TH1 = 0xFD;
                  TR1=1;
                  EA=1;
                  ET0=1;
                  ES0=1;

                  }

                  void main()
                  {
                  setuptimer();
                  CMOD=0;
                  CCAP3H=0x00; //động cơ dừng
                  CCAPM3=0x42;
                  CR=1;
                  DAO=0;
                  while(1)
                  {}

                  }
                  void timer0(void)interrupt 1
                  {
                  CCAP3H=0x00;
                  DAO=0;
                  TF0=0;
                  }

                  void serial(void)interrupt 4
                  {
                  if(RI==1)
                  {
                  NHAN++;

                  }
                  if(NHAN==1)
                  {
                  RI=0;
                  CAO = SBUF;
                  }
                  if(NHAN==2)
                  {
                  RI=0;
                  THAP = SBUF ;
                  CCAP3H=0x50; //nhận hết ký tự thứ 2 thì động cơ chạy
                  NHAN=0;
                  }

                  Comment


                  • #39
                    ban hoctro oi giup dum mình chương trình này luôn nhé, chương trình của minh là truyền ký tự 1 byte (số xung) xuống, vdk nhận và lưu vào uart_data đồng thời khởi động động cơ, khi xảy ra ngắt ngoài thì tăng số xung lên 1 và so sánh có băng với giá trị nhận được kg, nếu băng thì dừng đông cơ. mình làm rồi nhưng kg xay ra ngắt (giống trường hợp bài toán trên mình đã hỏi bạn). hình như cách lấy dữ liệu nhận được đem ra so sánh kg đúng thi phải. bạn xem rồi giúp mình với nhé, mình kg biết hỏi ai hết chỉ biết lên diễn đàn hỏi các bạn thôi, mong các bạn nhiệt tình giúp đỡ nhé. cám ơn các bạn nhiều.

                    void serial(void)interrupt 4
                    {
                    if(RI==1)
                    {
                    RI=0;
                    uart_data=SBUF;

                    CHAY = 0; //dong co chay
                    delay(8);
                    CHAY = 1;
                    delay(12);

                    }

                    }
                    void NGATNGOAI(void)interrupt 0
                    {
                    SOXUNG++;
                    if(SOXUNG==uart_data)
                    {

                    CHAY=1; //dung dong co

                    }
                    }

                    Comment


                    • #40
                      vui lòng giúp mình nhé mình đang rất mong hồi âm của bạn

                      Comment


                      • #41
                        Bạn hãy kiểm tra lại mạch và nói thêm về nó nhé. Hãy đưa cả phần thiết lập COM của VB để mọi người kiểm tra cho. Nếu code đúng mà chạy ko được thì có nhiều nguyên nhân lắm. Cũng nên gỡ từng phần, ví dụ khi nhận đủ 2 byte COM thì cho sáng 1 LED nào đó, đúng giá trị thì cho sáng LED tiếp theo...
                        Tôi đang xem code cho bạn, máy tôi post bài khó quá

                        email:mahaco@fpt.vn

                        Comment


                        • #42
                          code VB cho bài truyền 2 byte.

                          Dim GTDAT As Integer
                          Dim BUFFER As String
                          Dim CAO As Integer
                          Dim GTHT As Integer
                          Dim THAP As Integer

                          Private Sub Form_Load()
                          MSComm1.CommPort = 1 'dung cong com 1
                          MSComm1.RThreshold = 1 'dung su kien oncomm nhan
                          MSComm1.OutBufferSize = 1024 'dat kich thuoc bo dem truyen
                          MSComm1.InBufferSize = 1024 'dat kich thuoc bo dem nhan
                          MSComm1.Settings = "9600,n,8,1" 'thiet lap toc do baud
                          'khong bit chan le, 8 bit du lieu va 1 bit stop
                          MSComm1.InputLen = 0 ' doc het bo dem nhan
                          MSComm1.InputMode = comInputModeText
                          If MSComm1.PortOpen = False Then 'thiet lap va tra lai tinh trang cua cong
                          MSComm1.PortOpen = True
                          End If
                          Label4.Caption = Time


                          End Sub

                          Private Sub START_Click()
                          GTDAT = txtGTD.Text
                          CAO = GTDAT / 256
                          THAP = GTDAT Mod 256
                          MSComm1.Output = Chr(CAO)
                          MSComm1.Output = Chr(THAP)

                          End Sub

                          Private Sub STOP_Click()
                          MSComm1.Output = "S"
                          End Sub
                          Private Sub BACK_Click()
                          MSComm1.Output = "N"
                          End Sub
                          Private Sub CLOSE_Click()
                          MSComm1.Output = "S"
                          End
                          End Sub

                          Private Sub MSComm1_OnComm()
                          If MSComm1.CommEvent = comEvReceive Then
                          BUFFER = MSComm1.Input
                          End If
                          If BUFFER = "r" Then
                          thongbao = "DA TRUYEN DU LIEU"
                          End If
                          If BUFFER = "s" Then
                          thongbao = "DA DUNG DONG CO"
                          End If
                          If BUFFER = "b" Then
                          thongbao = "DANG TRO VE VI TRI DAU"
                          End If

                          End Sub

                          Comment


                          • #43
                            mạch mình đã kiểm tra rồi, khi mình truyền ký tự 1byte va cho vdk so sánh chính xã giá trị nhận được thi nó vẫn hoạt động nhưng khi minh truyền một số bất kỳ và muốn nó hiểu được số bất kỳ đó thì nó lại kg hiểu.

                            void serial(void)interrupt 4
                            {
                            if(RI==1)
                            {
                            RI=0;
                            uart_data = SBUF;
                            }
                            if (uart_data==200)
                            {
                            CCAP3H=0x7F;
                            DAOCHIEU = 0;
                            uart_data1 = 'r';
                            SBUF = uart_data1;
                            TI=0;
                            }
                            if (uart_data=='N')
                            {
                            CCAP3H=0x7F;
                            DAOCHIEU = 1;
                            uart_data1 = 'b';
                            SBUF = uart_data1;
                            TI=0;
                            }
                            if(uart_data=='S')
                            {
                            CCAP3H=0x00;
                            DAOCHIEU=0;
                            uart_data1 = 's';
                            SBUF = uart_data1;
                            TI=0;
                            }

                            }

                            khi truyền số 200 xuống thì động cơ vẫn chạy bình thường. còn khi mình làm như bên dưới thi nó im re.

                            void serial(void)interrupt 4
                            {
                            if(RI==1)
                            {

                            RI=0;
                            uart_data=SBUF;
                            CCAP3H=0x7F; //động cơ chạy

                            }


                            }
                            void NGATNGOAI(void)interrupt 0
                            {
                            SOXUNG++;
                            if(SOXUNG==uart_data)
                            {

                            CCAP3H=0x00; //động cơ dừng
                            }

                            }

                            Comment


                            • #44
                              GTDAT = txtGTD.Text
                              CAO = GTDAT / 256
                              --> phải là dấu \ như tôi đã nói. Nếu dùng / thì nhiều giá trị >=0.5 nó sẽ làm tròn lên 1--> quá sai.
                              Biến số = val(text) --> nên viết như vậy.
                              CAO, THAP nên khai báo kiểu byte
                              Phần truyền trên của bạn tôi đã test ( khi sửa như trên) là đã tốt.
                              Bạn hãy cho biết các thiết lập của VĐK về COM và int0 và nguồn tạo ngắt ngoài nữa thì mới biết lỗi do đâu.

                              email:mahaco@fpt.vn

                              Comment


                              • #45
                                minh xài thạch anh 11.0592, tốc độ baul 9600. đây là chương trình nhận 2 byte use ngắt timer0

                                #include"p89v51rx2.h"
                                sbit DAO=P1^7;
                                unsigned char CAO,THAP,NHAN,uart_data,THUCTHI ;
                                unsigned int SOXUNG,SODEM;

                                void setuptimer(void)
                                {
                                SOXUNG = CAO*256+THAP;
                                SODEM = 65535-SOXUNG;
                                SCON = 0x50;
                                TMOD=0x25;
                                TH0=SODEM/256;
                                TL0=SODEM%256;
                                TR0=1;
                                TH1 = 0xFD;
                                TR1=1;
                                EA=1;
                                ET0=1;
                                ES0=1;

                                }

                                void main()
                                {
                                setuptimer();
                                CMOD=0;
                                CCAP3H=0x00;
                                CCAPM3=0x42;
                                CR=1;
                                DAO=0;
                                while(1)
                                {}

                                }
                                void timer0(void)interrupt 1
                                {
                                CCAP3H=0x00;
                                DAO=0;
                                TF0=0;
                                }

                                void serial(void)interrupt 4
                                {
                                if(RI==1)
                                {
                                NHAN++;

                                }
                                if(NHAN==1)
                                {
                                RI=0;
                                CAO = SBUF;
                                }
                                if(NHAN==2)
                                {
                                RI=0;
                                THAP = SBUF ;
                                CCAP3H=0x50;
                                NHAN=0;
                                }
                                }

                                càn đay là chương trình nhận 1byte dùng ngắt ngoài 0

                                #include "p89v51rx2.h"
                                sbit DAOCHIEU = P1^7;
                                int NHAN;
                                int TRUYEN;
                                int SOXUNG;
                                int SOVONG;
                                int uart_data,uart_data1;


                                void SetupEx0(void)
                                {
                                SCON = 0x50;
                                TMOD = 0x20;
                                TH1 = 0xFD;
                                TR1=1;
                                EX0 = 1;
                                IT0 = 1;
                                EA = 1;
                                ES0=1;
                                }
                                void main(void)
                                {

                                DAOCHIEU=0;
                                SetupEx0();
                                CMOD=0;
                                CCAP3H=0x00;
                                CCAPM3=0x42;
                                CR=1;
                                while(1);

                                }
                                void serial(void)interrupt 4
                                {
                                if(RI==1)
                                {
                                RI=0;
                                uart_data=SBUF;
                                CCAP3H=0x50; //dong co chay

                                }

                                }
                                void NGATNGOAI(void)interrupt 0
                                {
                                SOXUNG++;
                                if(SOXUNG==uart_data)
                                {
                                CCAP3H=0x00; //dung dong co

                                }
                                }

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X