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

                              • since0501
                                Trả lời cho Pin Li-FePO4 (pin sắt) rất dể hỏng! Các biện pháp ngăn ngừa.
                                bởi since0501
                                Mình đào mộ xíu, cho mình hỏi là pin của bác vẫn ok chứ? Mình vừa đóng khối pin 16 cell 40135 thì khi chạy điện áp nó sụt so với khi nghỉ như video mình dẫn link, vậy cho mình hỏi là dung lượng pin sẽ tính khi áp nghỉ hay áp đang hoạt động, và pin sụt áp như vậy là bình thường hay pin kém?
                                ht...
                                hôm nay, 17:56
                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                                Hôm qua, 13:11
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                                Hôm qua, 09:25
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                                Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                                Hôm qua, 09:10
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Mấy con...
                                09-01-2025, 19:44
                              • viettinh
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi viettinh
                                Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                                Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                                09-01-2025, 18:12
                              • nguyendinhvan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi nguyendinhvan
                                Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                                Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                                Cách đơn giản...
                                09-01-2025, 00:04
                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                                08-01-2025, 19:02
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                                08-01-2025, 15:43
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                                08-01-2025, 15:28
                              Đang tải...
                              X