Thông báo

Collapse
No announcement yet.

gửi dữ liệu từ PIC lên máy tính và từ PIC sang PIC

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

  • gửi dữ liệu từ PIC lên máy tính và từ PIC sang PIC

    chào mọi người!
    mình mới bắt đầu nghiên cứu cách truyền dữ liệu qua cổng COM.nhưng mình gặp 1 vấn đề là khi truyền dữ liệu từ PIC lên PC thì trên PC xuất hiện toàn ký tự lạ,như vậy là sao nhi?.
    ý tưởng của mình là truyền những con số cụ thể lên PC
    vd: Nhiệt độ phòng là: 25...
    vậy làm sao để truyền được cái chữ nhiệt độ phòng và giá trị nhiệt độ?
    cám ơn các bạn!
    P/S vậy muốn truyền dữ liệu từ con PIC này qua con PIC khác thì phải làm như nào?

  • #2
    Theo như chổ mình được biết. Vấn đề nhận được những ký tự kiểu "loằng ngoằng" thường là do các nguyên nhân sau:
    + Tần số thạch anh không đúng với tính toán, hoặc tính toán tốc độ truyền thông thực tế và lý thuyết chênh lệch nhau lớn. (2% có thể coi là lớn rồi đó)
    + Tốc độ, khung truyền truyền thông của PIC và máy tính cài đặt không giống nhau.
    + Một số nguyên nhân lặt vặt khác.
    Theo như mình thì bạn không cần phải truyền chữ "Nhiệt độ phòng:" mà bạn chỉ cần truyền giá trị nhiệt độ thôi.
    Chữ nhiệt độ phòng bạn hoàn toàn có thể thay thế bằng một label trong VB, Vc hay gì gì đó.
    Còn nếu như bạn vẫn muốn truyền chữ đó lên, giả như bạn lập trình giao tiếp với máy tính qua Hyper Teminal thì bạn có thể dùng hàm printf đó mà.
    PS: Còn việc truyền dữ liệu từ PIC này sang PIC khác có vô số cách, thí dụ truyền song song nối port với port (Cách này chắc chẳng ai dùng). Truyền kiểu UART, giao tiếp I2C, SPI,... hay bạn tự nghĩ ra một protocol nào đó rồi quy ước cho hai con thống nhất dùng cái protocol của bạn là OK.
    YM: Noname_vnatr.
    Project mã nguồn mở:
    Học điện tử online:

    Comment


    • #3
      từ pic sang pc thì chỉnh baud rate giống nhau và phải gửi data bằng ascii.
      nếu đang viết chương trình thì đưa code lên.
      Mãi đi tìm vàng.

      Comment


      • #4
        Nguyên văn bởi KVLV Xem bài viết
        từ pic sang pc thì chỉnh baud rate giống nhau và phải gửi data bằng ascii.
        nếu đang viết chương trình thì đưa code lên.
        code mình đang viết nè!
        các bác xem rùi góp ý cho mình với

        #include <htc.h>
        __CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF);
        __CONFIG(BOR4V_BOR40V & WRT_OFF);

        #define TX_TRIS TRISC6
        #define RX_TRIS TRISC7
        #ifndef _XTAL_FREQ
        #define _XTAL_FREQ 11059200
        #endif

        void InitSystem();
        void uart_init();
        void uart_putc(char c);
        void uart_puts(const char* s);
        //================================================== ===================
        int main()
        {
        InitSystem();
        uart_init();

        while(1)
        {

        uart_puts("1234");

        }
        return 0;
        }

        //================================================== ===================
        void InitSystem()
        {
        ANSEL = 0x00;
        ANSELH = 0x00;
        }
        //================================================== ===================
        void uart_init()
        {
        SPBRG = 11;
        SYNC = 0;
        BRGH = 0;
        BRG16 = 0;
        SPEN = 1;
        CREN=1; //enable reception
        SREN=0; //no effect
        TXIE=0; //disable tx interrupts
        RCIE=0; //disable rx interrupts
        TX9=0; //8-bit transmission
        RX9=0; //8-bit reception
        TXEN=0; //reset transmitter
        TXEN=1; //enable the transmitter
        TX_TRIS = 0;
        RX_TRIS = 1;
        }
        //=================================
        void uart_putc(char c)
        {
        while(!TXIF);
        TXREG = c;
        }
        //===============================
        void uart_puts(const char* s)
        {
        while(*s != '\0'){
        uart_putc(*s);
        s++;
        }
        }

        sao trên hyper minal ko hiện số 1234 nhỉ toàn hiện ký tự lạ thui
        các bác giúp em với!
        cám ơn!

        Comment


        • #5
          Nguyên văn bởi kiemkhach10 Xem bài viết
          code mình đang viết nè!
          các bác xem rùi góp ý cho mình với

          #include <htc.h>
          __CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF);
          __CONFIG(BOR4V_BOR40V & WRT_OFF);

          #define TX_TRIS TRISC6
          #define RX_TRIS TRISC7
          #ifndef _XTAL_FREQ
          #define _XTAL_FREQ 11059200
          #endif

          void InitSystem();
          void uart_init();
          void uart_putc(char c);
          void uart_puts(const char* s);
          //================================================== ===================
          int main()
          {
          InitSystem();
          uart_init();

          while(1)
          {

          uart_puts("1234");

          }
          return 0;
          }

          //================================================== ===================
          void InitSystem()
          {
          ANSEL = 0x00;
          ANSELH = 0x00;
          }
          //================================================== ===================
          void uart_init()
          {
          SPBRG = 11;
          SYNC = 0;
          BRGH = 0;
          BRG16 = 0;
          SPEN = 1;
          CREN=1; //enable reception
          SREN=0; //no effect
          TXIE=0; //disable tx interrupts
          RCIE=0; //disable rx interrupts
          TX9=0; //8-bit transmission
          RX9=0; //8-bit reception
          TXEN=0; //reset transmitter
          TXEN=1; //enable the transmitter
          TX_TRIS = 0;
          RX_TRIS = 1;
          }
          //=================================
          void uart_putc(char c)
          {
          while(!TXIF);
          TXREG = c;
          }
          //===============================
          void uart_puts(const char* s)
          {
          while(*s != '\0'){
          uart_putc(*s);
          s++;
          }
          }

          sao trên hyper minal ko hiện số 1234 nhỉ toàn hiện ký tự lạ thui
          các bác giúp em với!
          cám ơn!
          Theo mình nghĩ, bạn có xem lại thử thiết lập trên máy tính đúng với tốc độ 14400 như bài lập trình của bạn không?
          Last edited by Noname_vnatr; 02-09-2011, 11:56.
          YM: Noname_vnatr.
          Project mã nguồn mở:
          Học điện tử online:

          Comment


          • #6
            Nguyên văn bởi Noname_vnatr Xem bài viết
            Theo mình nghĩ, bạn có xem lại thử thiết lập trên máy tính đúng với tốc độ 14400 như bài lập trình của bạn không?
            mình tính ra là tốc độ baus là 9600 mà?
            do đó mình để tốc độ truyền trên máy tính là 9600

            Comment


            • #7
              Theo như chổ mình được biết thì công thức tính là
              SPBRG = fosc/(16*baud)-1 với BRGH = 1
              SPBRG = fosc/(64*baud)-1 với BRGH = 0
              Vậy theo mình thì bài của bạn tính ra baud là 14400 đấy.
              Không biết mình có nhớ lộn không vì cũng giã từ PIC lâu phết rồi.
              YM: Noname_vnatr.
              Project mã nguồn mở:
              Học điện tử online:

              Comment


              • #8
                Nguyên văn bởi Noname_vnatr Xem bài viết
                Theo như chổ mình được biết thì công thức tính là
                SPBRG = fosc/(16*baud)-1 với BRGH = 1
                SPBRG = fosc/(64*baud)-1 với BRGH = 0
                Vậy theo mình thì bài của bạn tính ra baud là 14400 đấy.
                Không biết mình có nhớ lộn không vì cũng giã từ PIC lâu phết rồi.
                công thức đúng rùi thạch anh của mình là 11.0592M
                vậy chia ra là 11 ma
                pa có thể để lại yahoo để mình hỏi cho dễ ko?
                yahoo của mình la:quybm1011@yahoo.com
                cám ơn pa!

                Comment


                • #9
                  Mình kô hiểu bạn lắm, vì sao lại chia ra được 11??? Theo như ý hiểu thô thiển của mình thì
                  SPBRG = 11059200/(64*9600)-1 = 17 cơ mà!
                  Yahoo của mình là: noname_vnatr
                  YM: Noname_vnatr.
                  Project mã nguồn mở:
                  Học điện tử online:

                  Comment


                  • #10
                    thui chết mình tính lại rùi ra 17 mới đúng
                    nhưng sao khi mình thay SPBRG =17 thì lại ko nhận được cái gì từ PIC truyền lên máy tính nữa nhỉ?

                    Comment


                    • #11
                      Sao lại phải 11.0592 nhể.
                      Với 8051 và ASM thì dùng 11.0592 để dễ dàng đồng bộ tốc độ truyền do khó cái khâu tính toán.
                      PIC với PIC C Compiler tớ dùng 20M, 40M vẫn nhận bình thường cơ mà ?

                      Comment


                      • #12
                        Nguyên văn bởi duong_act Xem bài viết
                        Sao lại phải 11.0592 nhể.
                        Với 8051 và ASM thì dùng 11.0592 để dễ dàng đồng bộ tốc độ truyền do khó cái khâu tính toán.
                        PIC với PIC C Compiler tớ dùng 20M, 40M vẫn nhận bình thường cơ mà ?
                        hi vì mình muốn tận dụng con thạch anh thừa lúc làm với 8051
                        nói vạy thui chứ ở datasheet có cái tính bau lỗi đó
                        thạch anh 110592 sẽ có bau lỗi it nhất hình như là 0% ấy
                        mình chưa tính chỉ nghe nói qua thế thui
                        p/s: bài trên chỉ việc thay SPBRG = 17 và chon bau là 9600 là chay ok.
                        cám ơn các bạn nhiều!
                        Last edited by kiemkhach10; 03-09-2011, 18:58.

                        Comment


                        • #13
                          cho mình hỏi thêm chút nữa nhé!
                          với cách mắc như trên.
                          U2 đọc nhiệt độ từ U1==> truyền sang U3==> hiển thị lên PC.

                          code truyền thì mình viết được rùi
                          với code U2:
                          void main()
                          {
                          int nhietdo;
                          nhietdo=readadc(0);//đọc nhiệt độ từ U1
                          putc(nhietdo);//truyền dữ liệu sang U3
                          }
                          //===========
                          giờ mình ko biết viết cho con U3 nhận dữ liệu như thế nào cho chuẩn và ko bị mất dữ liệu sau đó truyền lên PC.
                          mong các bạn giúp đỡ
                          cám ơn!

                          Comment


                          • #14
                            Nguyên văn bởi kiemkhach10 Xem bài viết
                            hi vì mình muốn tận dụng con thạch anh thừa lúc làm với 8051
                            Thạch anh nào thì khi khai báo với CCS cần khai báo đúng là OK mà ?
                            Ví dụ dùng con 11.0592 thì khai báo :

                            #use delay(clock=11059200)
                            hoặc
                            #ocs 11059200.

                            Comment


                            • #15
                              Nguyên văn bởi duong_act Xem bài viết
                              Thạch anh nào thì khi khai báo với CCS cần khai báo đúng là OK mà ?
                              Ví dụ dùng con 11.0592 thì khai báo :

                              #use delay(clock=11059200)
                              hoặc
                              #ocs 11059200.
                              mình dùng HT PIC nên hơi mất công 1 chút

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X