Thông báo

Collapse
No announcement yet.

Về vấn đề dùng 2 USART trong PIC16F877A

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

  • Về vấn đề dùng 2 USART trong PIC16F877A

    Tôi định cấu hình 2 bộ USART cho pic16f877a và sử dụng ngắt để lấy dữ liệu. Khi test tôi thấy khi dữ liệu được truyền đến từ <b>2 bộ usart</b> thì nó đều nhảy vào ngắt. Vậy làm thế nào để phân biệt được chính xác dữ liệu do bộ usart nào truyền đến.
    Dưới đây là code trong chương trình của tôi.

    include <16F877A.H>
    #FUSES HS,NOWDT,NOPROTECT,NOLVP
    #USE DELAY(CLOCK=11059200)
    //================================================== ===
    //INIT UART0
    //================================================== ===
    #USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) //UART0
    VOID PUTC1(CHAR C)
    {
    PUTC(C);
    }
    CHAR GETC1(VOID)
    {
    RETURN GETC();
    }
    //================================================== ===
    //INIT UART1
    //================================================== ===
    #USE RS232(BAUD=9600,XMIT=PIN_A0,RCV=PIN_A1) //UART1
    VOID PUTC2(CHAR C)
    {
    PUTC(C);
    }
    CHAR GETC2(VOID)
    {
    RETURN GETC();
    }
    //================================================== ===
    #INCLUDE <DEFS.H>
    UNSIGNED CHAR MSG[50];
    //================================================== ===
    //ISR
    //================================================== ===
    #INT_RDA
    RX_ISR()
    {

    PUTC1(GETC1()); //GET DATA FROM UART0
    PUTC2(GETC2()); //GET DATA FROM UART1
    }
    //================================================== ===
    //MAINLINE...
    //================================================== ===
    VOID MAIN(VOID)
    {
    #ASM
    MOVLW 0X20 //ENABLE RX INTERRUPT
    MOVWF 0X8C //PIE1 REGISTER
    #ENDASM
    ENABLE_INTERRUPTS(GLOBAL); //ENABLE GLOBAL INTERRUPT
    WHILE(1)
    {
    }
    }

    Mọi người cho ý kiến đóng góp về vấn đề này giúp tôi.
    Cảm ơn tất cả mọi người.

  • #2
    Nguyên văn bởi hungnp Xem bài viết
    Tôi định cấu hình 2 bộ USART cho pic16f877a và sử dụng ngắt để lấy dữ liệu. Khi test tôi thấy khi dữ liệu được truyền đến từ <b>2 bộ usart</b> thì nó đều nhảy vào ngắt. Vậy làm thế nào để phân biệt được chính xác dữ liệu do bộ usart nào truyền đến.
    Dưới đây là code trong chương trình của tôi.

    include <16F877A.H>
    #FUSES HS,NOWDT,NOPROTECT,NOLVP
    #USE DELAY(CLOCK=11059200)
    //================================================== ===
    //INIT UART0
    //================================================== ===
    #USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) //UART0
    VOID PUTC1(CHAR C)
    {
    PUTC(C);
    }
    CHAR GETC1(VOID)
    {
    RETURN GETC();
    }
    //================================================== ===
    //INIT UART1
    //================================================== ===
    #USE RS232(BAUD=9600,XMIT=PIN_A0,RCV=PIN_A1) //UART1
    VOID PUTC2(CHAR C)
    {
    PUTC(C);
    }
    CHAR GETC2(VOID)
    {
    RETURN GETC();
    }
    //================================================== ===
    #INCLUDE <DEFS.H>
    UNSIGNED CHAR MSG[50];
    //================================================== ===
    //ISR
    //================================================== ===
    #INT_RDA
    RX_ISR()
    {

    PUTC1(GETC1()); //GET DATA FROM UART0
    PUTC2(GETC2()); //GET DATA FROM UART1
    }
    //================================================== ===
    //MAINLINE...
    //================================================== ===
    VOID MAIN(VOID)
    {
    #ASM
    MOVLW 0X20 //ENABLE RX INTERRUPT
    MOVWF 0X8C //PIE1 REGISTER
    #ENDASM
    ENABLE_INTERRUPTS(GLOBAL); //ENABLE GLOBAL INTERRUPT
    WHILE(1)
    {
    }
    }

    Mọi người cho ý kiến đóng góp về vấn đề này giúp tôi.
    Cảm ơn tất cả mọi người.
    #USE RS232(BAUD=9600,XMIT=PIN_A0,RCV=PIN_A1) //UART1
    day la uart mem. Ccs dung code de tao tin hieu UART nen khong co ngat cho uart nay

    Comment


    • #3
      Tôi đã test thử với Proteus và thấy các vấn đề sau và post lên mọi người cùng bàn luận.

      - Nếu trong hàm phục vụ ngắt nhận của tôi chỉ sử dụng câu lệnh:
      PUTC1(GETC1()); thì không có vấn đề gì. Khi gửi một ký tự từ VM UART0(xem trong bản file proteus đính kèm) thì pic sẽ trả về đúng ký tự đó.
      - Nếu trong Hàm đó chỉ viết một câu lệnh:
      PUTC2(GETC2()); thì có 2 trường hợp xẩy ra:
      + nếu không gửi một ký tự nào cho PIC qua UART0 mà chỉ gửi qua UART1 thì ngắt không xẩy ra đồng nghĩa với pic không trả về ký tự đó cho VM.
      + nếu dùng VM gửi một ký tự xuống pic qua UART0 trước sau đó gửi ký tự tiếp theo qua UART1 thì ngắt sẽ được thực hiện như bình thường.
      - Nếu trong hàm phục vụ ngắt đặt lệnh: PUTC1(GETC1()); trước lệnh PUTC2(GETC2()); và ngược lại thì sẽ thế nào? các bạn thử xem nhé.

      Comment


      • #4
        À Quên, mình gửi luôn file proteus.
        Attached Files

        Comment


        • #5
          @hungnp: Khi bạn muốn làm giao tiếp nhiều hơn một bộ UART cho PIC, khi sử dụng, bạn chú ý khai báo StreamID cho từng Port RS232 của bạn, và phải sử dụng hàm truyền nhận tương ứng là fput(), fget(), fprintf với tham số truyền chính là StreamID. Bản thân CCS đã hỗ trợ việc giao tiếp multiPort, bạn ko cần viết hàm thêm. Xem kỹ phần help về RS232 để rõ.
          Ethernet-RS232, PIC Webserver, RFID Reader
          CallerID, Cảnh báo BTS, ...
          0988006696
          linhnc308@gmail.com
          http://linhnc308.blogspot.com

          Comment


          • #6
            em mới dùng PIC, bài toán của em như thế này ,rất đơn giản ,khi pic nhận được dữ liệu gì đó từ RC7(em đọc datasheet thì nó bảo bit RCIF lên 1) thì bật vài con led lên chẳng hạn...
            code em viết với pic 16F877a, hơi ngô nghê, mong các bác chỉ giáo cho..

            #include <16F877A.h>
            #use delay(clock=12000000) //dung thach anh 12Mhz
            #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7) //khoi tao truyen thong RS232)

            #byte porta=0x05 //tao ten cho port va gan dia chi cho cac port
            #byte portb=0x06
            #byte portc=0x07
            #byte portd=0x08


            //cho phep truyen ko dong bo..
            #bit spen=0x18.7 //RCSTA 7 dia chi 0x18h
            #bit cren=0x18.4 //RCSTA
            #bit sync=0x98.4 //TXSTA 4 dia chi 0x98h
            #bit rcif=0x0c.5 // rcif=1 thi co du lieu , va bat dau doc rcreg
            #byte rcreg=0xa //thanh ghi nhan du lieu tu Rs232
            void main()
            {

            set_tris_b(0x00);
            set_tris_d(0x00);
            set_tris_c(0x1) ; //rc0-6 la output, rc7 la input , chan rx

            portb=0x55; //10101010

            sync=0;
            spen=1;

            cren=1;

            while(TRUE)
            {
            portb=~(portb);
            delay_ms(250);
            if(rcif==1)
            {
            portd=rcreg;
            delay_ms(1000);
            rcif=0;
            portb=0xff;
            delay_ms(1000);
            }
            }


            }

            vấn đề là :rcif chẳng bao giờ bằng 1 , em dùng phần mềm serial port monitor để gửi liên tiếp dữ liệu ra cổng com..,

            Comment


            • #7
              while(TRUE)
              {
              portb=~(portb);
              delay_ms(250); // Bạn đặt delay ở đây là ko ổn
              if(rcif==1)
              {
              portd=rcreg;
              delay_ms(1000);
              rcif=0;
              portb=0xff;
              delay_ms(1000);
              }
              }

              Comment


              • #8
                em nghĩ delay ở đó cũng có sao đâu, vì , nếu cái bit rcif mà ko lên 1 thì port b vẫn nháy cơ mà.., vấn đề chính là , bit rcif em đặt như thế , mà chẳng bao giờ lên 1 cả ,trong khi em gửi liên tiếp các ký tự đến pic...bằng phần mềm serial port monitor , ...các bác có biết phần mềm nào gửi và nhận dữ liệu từ cổng com của PC ko à ??

                Comment


                • #9
                  - Khi bạn gửi dữ liệu,nhưng chương trình vẫn đang thực hiện hàm delay() thi dữ liệu sẽ ko được xử lý
                  - Nếu bạn đã khai báo
                  Code:
                   #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7)
                  thì nên dùng các hàm sẵn về USART mà CCS C có
                  - Còn phần mềm gửi và nhận dữ liệu từ công COM của PC thì bạn chỉ việc nối chân 2 với chân 3 của cổng COM lại, rồi dùng phần mềm (Terminal, HyperTerminal ...) gửi dữ liệu, thì dữ liệu đó sẽ được ngược lại lên PC

                  Comment


                  • #10
                    em nghĩ delay ở đó cũng có sao đâu, vì , nếu cái bit rcif mà ko lên 1 thì port b vẫn nháy cơ mà.., vấn đề chính là , bit rcif em đặt như thế , mà chẳng bao giờ lên 1 cả ,trong khi em gửi liên tiếp các ký tự đếnpic...bằng phần mềm serial port monitor , ...các bác có biết phần mềm nào gửi và nhận dữ liệu từ cổng com của PC ko à ??
                    Em chuyển qua dùng hàm kbhit() nhé.

                    if(kbhit()){
                    portd = getc();
                    PORTB = 0xFF
                    delay_ms(1000);
                    }

                    Nên dùng thêm ngắt uart để nhận dữ liệu.
                    Ethernet-RS232, PIC Webserver, RFID Reader
                    CallerID, Cảnh báo BTS, ...
                    0988006696
                    linhnc308@gmail.com
                    http://linhnc308.blogspot.com

                    Comment


                    • #11
                      Các bác ơi. Em đang xài CCS cho con PIC8F25J11 có 2 bộ USART, nhưng ko biết xài ngắt cho hai cái này. Em ko muốn dùng kiểu đọc liên tục các thanh ghi của nó để biết khi nào dữ liệu truyền đến. Có bác nào có cách xử lý vấn đề này không ạ? Giúp em với

                      Nguyên văn bởi linhnc308 Xem bài viết
                      Em chuyển qua dùng hàm kbhit() nhé.

                      if(kbhit()){
                      portd = getc();
                      PORTB = 0xFF
                      delay_ms(1000);
                      }

                      Nên dùng thêm ngắt uart để nhận dữ liệu.

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X