Thông báo

Collapse
No announcement yet.

Cấu hình cho IO như thế nào?

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

  • Cấu hình cho IO như thế nào?

    Chào các bác. Khi làm việc với các chân, từ trước đến giờ em toàn cấu hình từ trước. Bây giờ đụng tới một phần là cấu hình khi đang sử dụng, em lại thấy không như ý hiểu của mình.
    Một đoạn code của em như thế này :
    void main()
    {
    while (1)
    {
    // ban đầu cho là cổng vào :
    PRT0DM0 =0xff;
    PRT0DM1 =0x00;
    // đọc cổng
    data = PRT0DR;
    .... xử lý đủ kiểu....
    // chuyển sang cổng ra
    PRT0DM0 =0x00;
    PRT0DM1 =0xff;
    // Đưa dữ liệu ra :
    PRT0DR = data;
    .....
    }
    }
    Đoạn code đơn giản như vậy, em thử cả cho Port = giá trị hẳn hoi cũng không đc. Không biết có vấn đề gì sai ở đây. mong các bác chỉ giúp
    Thực chất em làm với bài toán ma trận phím 4x4. nhưng mãi không được, nên em chuyển sang thử cho cổng trước, ấy thế mà vẫn chưa được. Chẳng hiểu sao nữa. Các bác giúp em với. Thanks
    "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

  • #2
    tại sao không define ca thanh ghi ben ngoai ham main roi su dung no binh thường như một ten biến ma phai lam vay, chi mat cong vay.

    Comment


    • #3
      Dòng lệnh này là sao nhỉ bạn ?
      Nguyên văn bởi Innovated Xem bài viết
      while (1)
      {
      // ban đầu cho là cổng vào :
      PRT0DM0 =0xff;
      PRT0DM1 =0x00;

      // chuyển sang cổng ra
      PRT0DM0 =0x00;
      PRT0DM1 =0xff;

      }
      }
      Bạn chỉ cần thiết lập pull_Up hoặc Pull_down ( Tôi hay dùng Pull_down ) cho cổng trước khi đọc, gởi dữ liệu ra cổng là OK mà. Đâu cần mấy dòng lệnh trên nhỉ ? Mà mình cũng không biết cụ thể các lệnh đó dùng làm gì nữa

      Or call me 0903911109

      Comment


      • #4
        to Connection: Hình như bạn không hiểu ý mình rùi. Nếu thiết lập ban đầu thì còn nói làm gì. Nó chỉ có mỗi chức năng là thế thôi. Mình lấy ví dụ lấy PORT0 làm cổng dữ liệu của LCD chẳng hạn. Ban đầu cấu hình nó làm cổng ra để out dữ liệu ra. Sau khi bạn gửi dữ liệu xong thì cần đọc cờ bận. Như thế phải cấu hình cổng làm đầu vào mới đọc được chứ. Như 8051 thì đưa cổng lên = 0xff, avr thì cho DDR = 0x00,...
        to onggia: Bạn có thể nói rõ hơn không mình chưa hiểu lắm.
        "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

        Comment


        • #5
          ủa. Sao chẳng thấy bác nào giúp em một tay cả. Nếu mà giúp được cả hai tay thì tốt biết mấy. Em thử vẫn chẳng được. Em có down dc file IOConfig.pdf . Nhưng lại hướng dẫn bằng ASM, vậy bằng C thì thế nào? em đọc mà chả hiểu được, nhiều từ chuyên môn với lại tiếng anh kém.
          Attached Files
          "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

          Comment


          • #6
            Bác thử cái này xem sao nhé.
            Với lại, hiểu được ASM thì C quá đơn giản.
            /*
            DM2 DM1 DM0
            0 0 0 PULL DOWN
            0 0 1 STRONG
            0 1 0 HIGH IMPEDENCE
            0 1 1 PULL UP
            1 0 0 OPEN DRAIN, DRIVE HIGH
            1 0 1 SLOW STRONG DRIVE
            1 1 0 HIGH IMPEDENCE ANALOG
            1 1 1 OPEN DRAIN, DRIVE LOW
            */


            /*
            Port_HZ: Setting Port for High Z Mode -> Port Use as Input
            */

            void Port_HZ(unsigned int port){
            switch(port){
            case 0:{
            M8C_SetBank1;
            PRT0DM0 = 0x00; // Config port 0's PD
            PRT0DM1 = 0xFF;
            M8C_SetBank0;
            break;}
            case 1:{
            M8C_SetBank1;
            PRT1DM0 = 0x00; // Config port 1's PD
            PRT1DM1 = 0xFF;
            M8C_SetBank0;
            break;}
            case 2:{
            M8C_SetBank1;
            PRT2DM0 = 0x00; // Config port 2's PD
            PRT2DM1 = 0xFF;
            M8C_SetBank0;
            break;}
            default:
            break;
            }
            }

            //================================================== ======
            /*
            Port_Strong: Setting Port for Strong Mode -> Port Use as OutPut
            */

            void Port_Strong(unsigned int port){

            switch(port){
            case 0:{
            M8C_SetBank1;
            PRT0DM0 = 0xFF; // Config port 0's Strong
            PRT0DM1 = 0x00;
            M8C_SetBank0;
            break;}
            case 1:{
            M8C_SetBank1;
            PRT1DM0 = 0xFF; // Config port 1's Strong
            PRT1DM1 = 0x00;
            M8C_SetBank0;
            break;}
            case 2:{
            M8C_SetBank1;
            PRT2DM0 = 0xFF; // Config port 2's Strong
            PRT2DM1 = 0x00;
            M8C_SetBank0;
            break;}
            default:
            break;
            }
            }
            /*
            Port_PD: Setting Port for Pull Down Mode -> Port Use as Input/OutPut
            Open Drain, Drives High
            */
            void Port_PD(unsigned int port){

            switch(port){
            case 0:{
            M8C_SetBank1;
            PRT0DM0 = 0x00; // Config port 0's PD
            PRT0DM1 = 0x00;
            M8C_SetBank0;
            break;}
            case 1:{
            M8C_SetBank1;
            PRT1DM0 = 0x00; // Config port 1's PD
            PRT1DM1 = 0x00;
            M8C_SetBank0;
            break;}
            case 2:{
            M8C_SetBank1;
            PRT2DM0 = 0x00; // Config port 2's PD
            PRT2DM1 = 0x00;
            M8C_SetBank0;
            break;}
            default:
            break;
            }
            }

            /*
            Port_PU: Setting Port for Pull Up Mode -> Port Use as Input/OutPut TTL
            Open Drain, Drives Low
            */
            void Port_PU(unsigned int port){

            switch(port){
            case 0:{
            M8C_SetBank1;
            PRT0DM0 = 0xFF; // Config port 0's PU
            PRT0DM1 = 0xFF;
            M8C_SetBank0;
            break;}
            case 1:{
            M8C_SetBank1;
            PRT1DM0 = 0xFF; // Config port 1's PU
            PRT1DM1 = 0xFF;
            M8C_SetBank0;
            break;}
            case 2:{
            M8C_SetBank1;
            PRT2DM0 = 0xFF; // Config port 2's PU
            PRT2DM1 = 0xFF;
            M8C_SetBank0;
            break;}
            default:
            break;
            }
            }

            Chúc vui,
            Regards.

            "Never stop thingking!"

            Comment


            • #7
              Nguyên văn bởi Trent Xem bài viết
              Bác thử cái này xem sao nhé.
              Với lại, hiểu được ASM thì C quá đơn giản.
              /*
              DM2 DM1 DM0
              0 0 0 PULL DOWN
              0 0 1 STRONG
              0 1 0 HIGH IMPEDENCE
              0 1 1 PULL UP
              1 0 0 OPEN DRAIN, DRIVE HIGH
              1 0 1 SLOW STRONG DRIVE
              1 1 0 HIGH IMPEDENCE ANALOG
              1 1 1 OPEN DRAIN, DRIVE LOW
              */


              /*
              Port_HZ: Setting Port for High Z Mode -> Port Use as Input
              */

              void Port_HZ(unsigned int port){
              switch(port){
              case 0:{
              M8C_SetBank1;
              PRT0DM0 = 0x00; // Config port 0's PD
              PRT0DM1 = 0xFF;
              M8C_SetBank0;
              break;}
              case 1:{
              M8C_SetBank1;
              PRT1DM0 = 0x00; // Config port 1's PD
              PRT1DM1 = 0xFF;
              M8C_SetBank0;
              break;}
              case 2:{
              M8C_SetBank1;
              PRT2DM0 = 0x00; // Config port 2's PD
              PRT2DM1 = 0xFF;
              M8C_SetBank0;
              break;}
              default:
              break;
              }
              }

              //================================================== ======
              /*
              Port_Strong: Setting Port for Strong Mode -> Port Use as OutPut
              */

              void Port_Strong(unsigned int port){

              switch(port){
              case 0:{
              M8C_SetBank1;
              PRT0DM0 = 0xFF; // Config port 0's Strong
              PRT0DM1 = 0x00;
              M8C_SetBank0;
              break;}
              case 1:{
              M8C_SetBank1;
              PRT1DM0 = 0xFF; // Config port 1's Strong
              PRT1DM1 = 0x00;
              M8C_SetBank0;
              break;}
              case 2:{
              M8C_SetBank1;
              PRT2DM0 = 0xFF; // Config port 2's Strong
              PRT2DM1 = 0x00;
              M8C_SetBank0;
              break;}
              default:
              break;
              }
              }
              /*
              Port_PD: Setting Port for Pull Down Mode -> Port Use as Input/OutPut
              Open Drain, Drives High
              */
              void Port_PD(unsigned int port){

              switch(port){
              case 0:{
              M8C_SetBank1;
              PRT0DM0 = 0x00; // Config port 0's PD
              PRT0DM1 = 0x00;
              M8C_SetBank0;
              break;}
              case 1:{
              M8C_SetBank1;
              PRT1DM0 = 0x00; // Config port 1's PD
              PRT1DM1 = 0x00;
              M8C_SetBank0;
              break;}
              case 2:{
              M8C_SetBank1;
              PRT2DM0 = 0x00; // Config port 2's PD
              PRT2DM1 = 0x00;
              M8C_SetBank0;
              break;}
              default:
              break;
              }
              }

              /*
              Port_PU: Setting Port for Pull Up Mode -> Port Use as Input/OutPut TTL
              Open Drain, Drives Low
              */
              void Port_PU(unsigned int port){

              switch(port){
              case 0:{
              M8C_SetBank1;
              PRT0DM0 = 0xFF; // Config port 0's PU
              PRT0DM1 = 0xFF;
              M8C_SetBank0;
              break;}
              case 1:{
              M8C_SetBank1;
              PRT1DM0 = 0xFF; // Config port 1's PU
              PRT1DM1 = 0xFF;
              M8C_SetBank0;
              break;}
              case 2:{
              M8C_SetBank1;
              PRT2DM0 = 0xFF; // Config port 2's PU
              PRT2DM1 = 0xFF;
              M8C_SetBank0;
              break;}
              default:
              break;
              }
              }
              Thử xem sao nhé.

              Chúc vui,
              Regards.

              "Never stop thingking!"

              Comment


              • #8
                Nguyên văn bởi Innovated Xem bài viết
                Chào các bác. Khi làm việc với các chân, từ trước đến giờ em toàn cấu hình từ trước. Bây giờ đụng tới một phần là cấu hình khi đang sử dụng, em lại thấy không như ý hiểu của mình.
                Một đoạn code của em như thế này :
                void main()
                {
                while (1)
                {
                // ban đầu cho là cổng vào :
                PRT0DM0 =0xff;
                PRT0DM1 =0x00;
                // đọc cổng
                data = PRT0DR;
                .... xử lý đủ kiểu....
                // chuyển sang cổng ra
                PRT0DM0 =0x00;
                PRT0DM1 =0xff;
                // Đưa dữ liệu ra :
                PRT0DR = data;
                .....
                }
                }
                Đoạn code đơn giản như vậy, em thử cả cho Port = giá trị hẳn hoi cũng không đc. Không biết có vấn đề gì sai ở đây. mong các bác chỉ giúp
                Thực chất em làm với bài toán ma trận phím 4x4. nhưng mãi không được, nên em chuyển sang thử cho cổng trước, ấy thế mà vẫn chưa được. Chẳng hiểu sao nữa. Các bác giúp em với. Thanks
                void main()
                {
                while (1)
                {
                // ban đầu cho là cổng vào :
                PRT0DM0 =0x00;
                PRT0DM1 =0xff;
                // đọc cổng
                data = PRT0DR;
                .... xử lý đủ kiểu....
                // chuyển sang cổng ra
                PRT0DM0 =0xff;
                PRT0DM1 =0x00;
                // Đưa dữ liệu ra :
                PRT0DR = data;
                .....
                }
                }

                Comment


                • #9
                  Nguyên văn bởi Innovated Xem bài viết
                  Chào các bác. Khi làm việc với các chân, từ trước đến giờ em toàn cấu hình từ trước. Bây giờ đụng tới một phần là cấu hình khi đang sử dụng, em lại thấy không như ý hiểu của mình.
                  Một đoạn code của em như thế này :
                  void main()
                  {
                  while (1)
                  {
                  // ban đầu cho là cổng vào :
                  PRT0DM0 =0xff;
                  PRT0DM1 =0x00;
                  // đọc cổng
                  data = PRT0DR;
                  .... xử lý đủ kiểu....
                  // chuyển sang cổng ra
                  PRT0DM0 =0x00;
                  PRT0DM1 =0xff;
                  // Đưa dữ liệu ra :
                  PRT0DR = data;
                  .....
                  }
                  }
                  Đoạn code đơn giản như vậy, em thử cả cho Port = giá trị hẳn hoi cũng không đc. Không biết có vấn đề gì sai ở đây. mong các bác chỉ giúp
                  Thực chất em làm với bài toán ma trận phím 4x4. nhưng mãi không được, nên em chuyển sang thử cho cổng trước, ấy thế mà vẫn chưa được. Chẳng hiểu sao nữa. Các bác giúp em với. Thanks
                  Về nguyên tắc đúng là một cổng có thể đặt được câú hình vừa vào vừa ra theo kiểu như vậy nhưng theo mình thì không nên. Bạn thử tưởng tượng rằng: Trong lúc bạn đang nhập dữ liệu vào mà bên trong VĐK đã chuyển rang chế độ xuất dữ liệu ra ==> có khả năng bị ngắn mạch đầu ra ==> Chết cổng. Thật là tai hại quá phải không. Có lẽ bạn nên tìm cách chuyển sang thiết kế cách khác rõ ràng hơn. Thân.

                  Comment


                  • #10
                    Nguyên văn bởi sau Xem bài viết
                    Về nguyên tắc đúng là một cổng có thể đặt được câú hình vừa vào vừa ra theo kiểu như vậy nhưng theo mình thì không nên. Bạn thử tưởng tượng rằng: Trong lúc bạn đang nhập dữ liệu vào mà bên trong VĐK đã chuyển rang chế độ xuất dữ liệu ra ==> có khả năng bị ngắn mạch đầu ra ==> Chết cổng. Thật là tai hại quá phải không. Có lẽ bạn nên tìm cách chuyển sang thiết kế cách khác rõ ràng hơn. Thân.
                    Thanks. Nhưng nhiều ứng dụng bắt buộc phải thế và vdk cũng hỗ trợ cho phép làm điều này mà. Mình thấy ở 8051, đang là cổng ra, muốn làm cổng vào thì cho PORT=0xff, ở AVR thì cho DDR = 0x00 - vào, =0xff - ra, PIC cũng thế TRIS=0xff hoặc 0x00;... Đó là cả một thanh ghi điều khiển hướng của chân. Và PSoC cũng vậy, tuy nhiên nó nhiều thanh ghi hơn.
                    "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

                    Comment


                    • #11
                      cai nay co the la chet chip, ban thu dugn module dieu khien 1 led di,coi thu co dieu khien dc ko, roi hay tinh tiep, chu minh lam (ke ca cop code cua cau vao van bth ma)

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X