Thông báo

Collapse
No announcement yet.

Khó khăn trong việc gom 4 port vào thành một biến ??? Xin các bậc cao thủ chỉ giáo

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

  • Khó khăn trong việc gom 4 port vào thành một biến ??? Xin các bậc cao thủ chỉ giáo

    Mình có một vấn đề cần các bạn trợ giúp.
    Trong bài lập trình cho vi điều khiển 8051 điều khiển 2 cái động cơ bước( loại hỗn hợp, 4 đầu vào/1 động cơ),mình dùng nguyên port2(8 cổng) để điều khiển. Bố trí sơ đồ từ chân vi điều khiển ra mạch như sau ( đã có IC chuyên dụng khuếch đại công suất , mình chỉ xét về mặc truyền tín hiệu):
    - động cơ 1 : P2.0 --> P2.3
    - động cơ 2 : P2.4 --> P2.7

    Ý tưởng của mình là muốn điều khiển 2 độc cơ độc lập, không liên quan gì tới nhau. Vậy bạn nào có thể chỉ cho mình cách để gom 4 port thành một biến không ?

    Mình có biết một lệnh hay dùng :
    #define out P2
    Lệnh này gán rất hay được sử dụng, nhưng nó gán nguyên cả Port2(8 cổng) vào biến "out". Trong khi mình chỉ muốn 4 port làm thành một biến, để có thể điều khiển 2 động cơ tách rởi riêng biệt nhau.

    Mình mong muốn có một lệnh nào đó có thể gán 4 port thành một biến như sau :

    #define ĐC1 [ P2^0 P2^1 P2^2 P2^3]
    #define ĐC2 [ P2^4 P2^5 P2^6 P2^7]

    Tất nhiên 2 lệnh này khi chạy thì báo lỗi, nhưng đây thực sự mới là vấn đề cần giải quyết.
    Mong các bậc cao thủ trong diễn đàn , ai biết xin chỉ zùm với ! Mạch phần cứng đã lắp rồi, không đổi một động cơ gắn sang port khác được ! hix hix
    Last edited by trieuphong; 07-11-2011, 20:55.

  • #2
    dùng lệnh & và lệnh | :
    P2 &= 0xF0
    P2 |= ABC ( ABC chỉ dùng 4 bít cuối )

    cậu hiểu ý là chính nhé, chứ mình có thể viết sai chính tả

    Comment


    • #3
      Hoành tráng !
      4 Port hay 4 bit?

      Comment


      • #4
        SPI mềm.
        5 chân điều khiển 10 động cơ

        Comment


        • #5
          VIết hàm riêng cho nó !! Thay vì DC1=giá trị thì thành DC1(giá trị) !!

          Comment


          • #6
            Trước hết, có lời cảm ơn các bác đã quan tâm đến topic của em.
            @ssgabeo : bạn có thể giải thích rõ 2 câu lệnh đó được không, cái gạch dọc đó mình lạ lắm
            @Multi system : 4 pin bạn hiền à tui nhầm
            @duong_act : thành viên tích cực với 2912 bài viết ^^ câu trả lời của bác mang tính hàn lâm quá, em là gà, có đọc chút về spi (serial peripheral bus) nhưng mà ko hiểu nó áp dụng trong bài của em như thế nào ? bác chỉ rõ giúp em với
            @AKA_QUAN : bạn viết giúp mình được không? Đây là đoạn code của mình kèm theo file mô phỏng và file c, hex
            LINK: http://www.mediafire.com/?iijoic1f0zdw3qb
            #include <REGX51.H>
            #include <stdio.h>
            #define stepper P2
            #define button P0^0 // khoi tao nut an


            /* cac day xung dieu khien da quy doi sang nhi phan
            0x02 = 0010 0x06 = 0110 0x22 = 0010 0010 0x66 = 0110 0110
            0x04 = 0100 0x0c = 1100 0x44 = 0100 0100 0xcc = 1100 1100
            0x08 = 1000 0x09 = 1001 0x88 = 0001 0001 0x99 = 1001 1001
            0x01 = 0001 0x03 = 0011 0x11 = 0001 0001 0x33 = 1001 1001
            */
            void delay(unsigned int); // khai bao chuong trinh chinh

            const sequence1[] = {0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}; // chuoi xung dieu khien hafl step
            const sequence2[] = {0x02,0x04,0x08,0x01}; // chuoi xung dieu khien full step


            void main(){
            unsigned char i,j;
            while (1){ // tao vong lap vo han
            if(!button){ // chua bam phim,quay voi toc do nhanh
            i = i<3 ? i+1 : 0;
            stepper = sequence2[i];
            delay(50);}

            if(button){ // bam phim , chuyen sang toc do cham
            j = j<7 ? j+1 : 0;
            stepper = sequence1[j];
            delay(50);}
            }
            }
            void delay(unsigned int time){ // chuong trinh tao tre miligiay
            while(time--){
            unsigned int temp = 120;
            while(temp--);
            };}
            Last edited by trieuphong; 09-11-2011, 00:57.

            Comment


            • #7
              ----------------------------------------------------------------------------
              Last edited by trieuphong; 09-11-2011, 00:55.

              Comment


              • #8
                Để cho việc hoạt động chính xác thì bạn nên đọc P2 rồi mới xử lý dữ liệu xuất ra.
                ví dụ:
                uRead=P2;
                uRead&=0xF0;
                uRead|=0x0X;
                P2=uRead;
                0x0X là giá trị cần set 4bit thấp.
                , , ,

                Comment


                • #9
                  Nguyên văn bởi rptdnmqs Xem bài viết
                  Để cho việc hoạt động chính xác thì bạn nên đọc P2 rồi mới xử lý dữ liệu xuất ra.
                  ví dụ:
                  uRead=P2;
                  uRead&=0xF0;
                  uRead|=0x0X;
                  P2=uRead;
                  0x0X là giá trị cần set 4bit thấp.
                  Cảm ơn rptdnmqs đã quan tâm. Để hoạt động chính xác thì mình đã xử lý được đoạn đó. Mình viết một đoạn code đọc trạng thái hiện hành ở đầu ra, rồi sau đó so sánh với giá trị trong chuỗi xung,xác định được chuỗi xung hiện hành thì chuỗi xung tiếp sau đó sẽ được đặt vào động cơ. Nhất là lúc động cơ chuyển từ chương trình chính sang chương trình con, nếu ko có chương trình con, việc đặt chuỗi xung hay bị lỗi dấn đến việc khi chạy khúc quanh, động cơ hay bị giật bánh( lúc giật tiến, lúc giật lùi ), quay ko liên tục , ko êm. Mình xử lý chỗ đó khá ổn thỏa. Nhưng vấn đề chính mình muốn hỏi các cao thủ, là cách gom 4 port thành một biến, hoặc làm gì đó tương tự, để có thể đồng thời điều khiển 2 động cơ riêng rẽ cùng một lúc

                  Comment


                  • #10
                    Vi điều khiển 8 bit nên thao tác cao nhất là 8 bit cho nên khi bạn dÙng nhiều port thì phải đặt lần lượt giá trị từng port rồi.Tôi thấy bạn làm cái chương trình con xét trạng thái điều khiển là hay đó.
                    , , ,

                    Comment


                    • #11
                      Vậy là dứt khoát là gom 4 Port vào 1 biến hả?
                      Vậy thì biến của ta có độ rộng 4Byte, giả sử Result_Var.
                      Result_Var = (P3 << 24) | (P2 << 16) | (P1 << 8) | P0 ;
                      Đúng ý không?

                      Comment


                      • #12
                        theo mình hiểu thì bạn ấy chỉ muôn nhóm 4 chân từ P2_0 đến P2_3 vào 1 biến là motor1, từ P2_4 đến P2_8 vào một biến là motor2,vấn đề này mình đã từng gặp, đi hỏi nhiều nơi , nhiều người nhưng k có giải pháp nào hết, trong C chỉ có cách nhóm thế này nhưng nó k phải yêu cầu của bạn : #define led1=P2_0=0;P2_1=1;P2_2=0, trong chương trình mình gọi led1 là nó hiểu mặc nhiên P2_0=0;P2_1=1;P2_2=0,

                        Comment


                        • #13
                          Cái đó gọi là macro.Mà viết macro thì kô có dấu bằng và chấm phẩy,kô có từ khoá,việc ngăn cách thì dÙng dấu phẩy (',') .
                          , , ,

                          Comment


                          • #14
                            THử xem có được hay không nhé !! Nhập n vào thì P2.0 đến P2.3 chỉ lấy 4 bit thấp của n mà thôi !! TUơng từ với P2.4 --> P2.7 !
                            void DC1(unsigned char n){
                            P2_0= n&1;
                            n>>=1;
                            P2_1=n&1;
                            n>>=1;
                            P2_2=n&1;
                            n>>=1;
                            P2_3=n&1;

                            }
                            Nếu muốn đưa giá trị cho nó vd: n=0x03 thì ta viết DC1(0x03);

                            Comment


                            • #15
                              Nguyên văn bởi AKA_QUAN Xem bài viết
                              THử xem có được hay không nhé !! Nhập n vào thì P2.0 đến P2.3 chỉ lấy 4 bit thấp của n mà thôi !! TUơng từ với P2.4 --> P2.7 !
                              void DC1(unsigned char n){
                              P2_0= n&1;
                              n>>=1;
                              P2_1=n&1;
                              n>>=1;
                              P2_2=n&1;
                              n>>=1;
                              P2_3=n&1;

                              }
                              Nếu muốn đưa giá trị cho nó vd: n=0x03 thì ta viết DC1(0x03);

                              ÔI, cao thủ, xin phục, tớ làm mô phỏng ra rồi, thanks nhiều nhé , AKA_QUAN

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X