Thông báo

Collapse
No announcement yet.

Đố vui về PIC, các câu đố cực vui và cực hay... hehe..

Collapse
This topic is closed.
X
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #61
    Thôi, thấy các bác bí bách quá, đáp án đây nè:
    http://www.dientuvietnam.net/board/s...p?t=190&page=3
    -------------------

    Comment


    • #62
      Trong hàm ngắt, viết như sau:
      Ngắt_1()
      {
      //Chèn mã lệnh: disable ngắt 1,2,3 tại đây
      GIE=1;
      //Chèn mã lệnh trình phục vụ ngắt 1
      }

      Ngắt_2()
      {
      //Chèn mã lệnh: disable ngắt 2,3 tại đây
      GIE=1;
      //Chèn mã lệnh trình phục vụ ngắt 2
      }

      Ngắt_3()
      {
      //Chèn mã lệnh: disable ngắt 3 tại đây
      GIE=1;
      //Chèn mã lệnh trình phục vụ ngắt 3
      }
      -------------------

      Comment


      • #63
        Các bác phân tích cho rôm rả nhé
        -------------------

        Comment


        • #64
          Định đố tiếp các Fan PIC mấy câu nữa nhưng thấy ko khí trầm quá. Hẹn dịp khác vậy.Có vẻ câu hỏi của tui khó quá, lần sau sẽ post dễ hơn
          -------------------

          Comment


          • #65
            Nguyên văn bởi CHIBANG
            Trong hàm ngắt, viết như sau:
            Ngắt_1()
            {
            //Chèn mã lệnh: disable ngắt 1,2,3 tại đây
            GIE=1;
            //Chèn mã lệnh trình phục vụ ngắt 1
            }

            Ngắt_2()
            {
            //Chèn mã lệnh: disable ngắt 2,3 tại đây
            GIE=1;
            //Chèn mã lệnh trình phục vụ ngắt 2
            }

            Ngắt_3()
            {
            //Chèn mã lệnh: disable ngắt 3 tại đây
            GIE=1;
            //Chèn mã lệnh trình phục vụ ngắt 3
            }
            Éc ...chào bác...em kô hiểu sao kô đăng nhập được.
            Trời đất...Em thì cứ nghĩ giải quyết bài toán khác cơ...
            Mình cần sử dụng ba ngắt...xong rồi cho ngắt trong ngắt, chứ không có ưu tiên gì cả...Như vậy sẽ bình đẳng hơn.
            Em thích ưu tiên ngắt kiẻu một ngắt xảy ra mà có ngắt khác thì ngắt đầu thực hiện xong thi thực hiện ngắt sau...theo em là làm được như thế
            Last edited by tienvnu; 19-10-2005, 01:10.

            Comment


            • #66
              Em có một câu hỏi ... Bây giờ em có một cái remode ...và đầu thu hồng ngoại.
              Bây giờ giải mã làm sao để Pic biết được mình ấn nut 1 hay nut 2 , 3 , 4.

              Comment


              • #67
                Nguyên văn bởi tienvnu
                Éc ...chào bác...em kô hiểu sao kô đăng nhập được.
                Trời đất...Em thì cứ nghĩ giải quyết bài toán khác cơ...
                Mình cần sử dụng ba ngắt...xong rồi cho ngắt trong ngắt, chứ không có ưu tiên gì cả...Như vậy sẽ bình đẳng hơn.
                Em thích ưu tiên ngắt kiẻu một ngắt xảy ra mà có ngắt khác thì ngắt đầu thực hiện xong thi thực hiện ngắt sau...theo em là làm được như thế
                Bác thì cứ đi về vơi cội nguồn đơn giản.
                Nếu ko ưu tiên và ngắt trước xảy ra làm việc trước thì có gì hay nữa. Mà mặc định PIC là như vậy rồi.
                Ví dụ thiét kế 1 hê thống trong đó có một module bảo vệ 1 quá tải. Nếu xử lý ko nhanh thì nó nổ cái bòm. Nếu bình đẳng thì bòm bòm bòm...trời ơi khét quá.
                Còn câu remote của bác dễ quá. Nhường câu này cho các bác khác. Nhưng các bước làm:
                1-Tìm mã phát và quy luât phát = NET hoặc = OSC. Nó thường có 2 chuẩn: độ rộng xung(sony chẳng hạn) hoặc RC5(Phillips chẳng hạn) .
                2-Dùng tài nguyên 1 ngắt ngoài+1 timer.
                3-Mỗi 1 nút nó phát ra 1 mã khác nhau. Vậy thì coi như xong.
                Bye
                -------------------

                Comment


                • #68
                  Đề bài hay quá, mấy hôm định nhảy vô, nhưng hình như các bạn chưa nắm cái ý tưởng của Hàm Call để đưa vào.

                  Hãy tưởng tượng rằng Hàm Call gọi call trong lại gọi tiếp. Nguyên tắc gọi sâu vào trong được 8 lần.

                  Và tưởng tượng thêm một lần nữa, rằng nếu hàm call được gọi bất kỳ trong một khoảng nào đó của chương trình, mà ta không kiểm soát được. Vậy thì nó vẫn là Call.

                  Điều khó khăn nhất, chính là giữa các lần nhảy khác nhau, khi kết thúc chương trình. Lệnh nào để kết thúc trong Call, trong khi Call chỉ kết thúc bằng 1 lệnh, thì INT kết thúc bằng 2 lệnh.

                  Để giải, đầu tiên các bạn cho rằng Stack là dài vô cùng đi, đừng quan tâm đến stack. Sau đó, nếu có stack thì làm thế nào?

                  Đó là cách mà tôi đã nghĩ để giải quyết.
                  Falleaf
                  Công ty TNHH Thương mại và Giao nhận R&P
                  58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                  mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                  Comment


                  • #69
                    À, còn một điều nữa, các bạn lưu ý rằng, khi thực hiện lệnh quay về từ ngắt, thì GIE sẽ tự động trả lại 1.
                    Falleaf
                    Công ty TNHH Thương mại và Giao nhận R&P
                    58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                    mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                    Comment


                    • #70
                      Sorry, vừa nhảy vào trang đánh dấu xem, post reply luôn, ai dè việc thảo luận đã xong, tới 13 trang...

                      ặc, phát hiện ra thêm cái là bác ba đã post bài hướng dẫn rồi, mà không ai chịu để ý... hơ hơ...

                      bó tay...
                      Falleaf
                      Công ty TNHH Thương mại và Giao nhận R&P
                      58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                      mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                      Comment


                      • #71
                        Nguyên văn bởi CHIBANG
                        Bác thì cứ đi về vơi cội nguồn đơn giản.
                        Nếu ko ưu tiên và ngắt trước xảy ra làm việc trước thì có gì hay nữa. Mà mặc định PIC là như vậy rồi.
                        Ví dụ thiét kế 1 hê thống trong đó có một module bảo vệ 1 quá tải. Nếu xử lý ko nhanh thì nó nổ cái bòm. Nếu bình đẳng thì bòm bòm bòm...trời ơi khét quá.
                        Còn câu remote của bác dễ quá. Nhường câu này cho các bác khác. Nhưng các bước làm:
                        1-Tìm mã phát và quy luât phát = NET hoặc = OSC. Nó thường có 2 chuẩn: độ rộng xung(sony chẳng hạn) hoặc RC5(Phillips chẳng hạn) .
                        2-Dùng tài nguyên 1 ngắt ngoài+1 timer.
                        3-Mỗi 1 nút nó phát ra 1 mã khác nhau. Vậy thì coi như xong.
                        Bye
                        Bác nói thế này thì em cũng nói được.
                        Nhưng vấn đề ... bác có kinh nghiệm??? khi làm việc xác định mã có cần chú ý gì không??? cái vấn đề bắt lấy cái mã ấy và liệt kê có bao nhiêu mã...lúc đấy có khi mình đi ăn cắp thông tin được ấy chứ bác nhỉ??? VD nghe trộm điện thoại kéo dài(mẹ con)...hoặc mở cửa xe oto hu'hu'.
                        Thôi cái này với bác chắc là dễ rồi...
                        Bác cao tay hơn đàn em...bác giải thích cho em cái Cấu trúc lệnh Cisc và Risc (máy tính có tập lện phức tạp và đơn giản)...mà anh falleaf đã đưa ra...có phải nó liên quan gì đến bộ giải mã lệnh không bác nhỉ???

                        Comment


                        • #72
                          Nguyên văn bởi tienvnu
                          Bác nói thế này thì em cũng nói được.
                          Nhưng vấn đề ... bác có kinh nghiệm??? khi làm việc xác định mã có cần chú ý gì không??? cái vấn đề bắt lấy cái mã ấy và liệt kê có bao nhiêu mã...lúc đấy có khi mình đi ăn cắp thông tin được ấy chứ bác nhỉ??? VD nghe trộm điện thoại kéo dài(mẹ con)...hoặc mở cửa xe oto hu'hu'.
                          Thôi cái này với bác chắc là dễ rồi...
                          Bác cao tay hơn đàn em...bác giải thích cho em cái Cấu trúc lệnh Cisc và Risc (máy tính có tập lện phức tạp và đơn giản)...mà anh falleaf đã đưa ra...có phải nó liên quan gì đến bộ giải mã lệnh không bác nhỉ???
                          Câu 1: nếu bác nói được như tui thì nghĩa bác đã làm được rồi.
                          Câu 2: Kinh nghiệm, làm đúng các bc' tui nói ở trên. Bắt tay vào làm thì sẽ biết, chứ ngồi nghĩ thì ko thể hoàn thành được công việc. Bác cư bắt tay vào, nêu mắc chỗ nào sẽ ít nhất có 1 người gỡ cho bác là tui.
                          Câu 3:Mỗi nút 1 mã: Mã nhận dạng + Address+Command+Finish+Delay+Luật lặp lại nếu giữ phím.
                          Đương nhiên bác hoàn toàn lấy cắp được. Vì nó là mã cố định, gắn 1 mạch con con là bắt/copy mã được ngay.
                          Tuy nhiên hiểu sâu hơn thì hiện nay có những mã biến đổi theo thời gian, nghĩa là mỗi lúc phát một khác, nhưng bên thu vẫn thu được. Phát đúng lại mã cũ nó ko nhận. Mã này gần như ko có cao thủ nào copy được. Vì nếu copy thì copy quá khứ chứ ko copy tương lai.. Ví dụ mã 128 bit thì chục cái PEN4 chạy chục năm mới luận ra được mã. Mã này bảo mật khỏi bàn, và rất ít có ở các thiết bị du nhập về VN. Nói tơi cái này, nó phức tạp hơn cái ngắt ở trên đó bác....

                          Còn cấu trúc lệnh Cisc và Risc nếu đem so sánh thì mỗi cái có 1 điểm mạnh. Tốt nhất là đem mấy quyển sách về cấu trúc máy vi tính viết cho máy tính từ thời napoleoong mà đọc, từ thời 386 gi đó rồi có một số so sánh. Tui thì ko muốn đi vao cái này. Vì tui thích PIC 16 nhưng lại ghét cái tập lệnh bé xíu của nó, nên mới quay lại dùng C cho khỏe và ko quan tâm tới cái đó làm gì.

                          Nói đơn giản thì lệnh nhiều (ASM) vẫn hơn. Ví dụ nhé:
                          Ở 89: lệnh nhân 1 phát ăn luôn(khoảng 2 chu kỳ lệnh).
                          Ở PIC 16: làm 1 macro nhân 8 bit thì oải cả người(nhiều chu kỳ lệnh).
                          Nếu 1 phép tính nhân 8 bit thì tuy tốc độ pic16 gấp 2.5 lần 89C nhưng khi gặp cái lệnh khó chịu đó, thì PIC tốn thời gian hơn 89 là cái chắc.
                          Vì thế, cang về sau, PIC càng nhiều lệnh là vì lý do đó. PIC16--->PIC18--->PIC24--->dsPIC.
                          Ví dụ nữa nhé: Một phép tính PID của PIC 16 khoảng 1000 CK lệnh thì PIC18 và 89 khoảng 100 CK lệnh thôi. Nói tương đối chứ tui chưa thử những cái này.

                          Túm lại, nhiều lệnh vẫn hơn. Tuy nhiên nếu nhiều lệnh thì thường kéo theo core phức tạp hơn. Nhưng đó là chuyện của nhà sx, còn họ bán giá rẻ, đắt thì tùy ở họ. Mà tui nói cái này rối rắm, ko hiểu có bác nào hiểu tui ko? Nếu ko thì cứ coi như chưa bao giờ đọc nhá

                          Nếu nói về quan điểm ASM thì PIC ít lệnh nên dễ học là hoàn toàn sai. Ví dụ nhé: 89 khoảng 256 lệnh, ko nhớ thật rõ . PIC 16 có 35 lệnh.
                          Xem kỹ thấy số lênh 89= số lệnh PIC16+(256-35).(Đảm bảo 89 sẽ có 35 lệnh y như PIC).
                          Vậy vứt ngay đi 256-35 lệnh thi 2 thằng dễ học như nhau a?
                          Khà khà, lại khó hiểu nữa rồi. Thôi bye bye các bạn, đến hẹn lại lên bốc phét
                          -------------------

                          Comment


                          • #73
                            Nguyên văn bởi CHIBANG
                            Câu 1: nếu bác nói được như tui thì nghĩa bác đã làm được rồi.
                            Câu 2: Kinh nghiệm, làm đúng các bc' tui nói ở trên. Bắt tay vào làm thì sẽ biết, chứ ngồi nghĩ thì ko thể hoàn thành được công việc. Bác cư bắt tay vào, nêu mắc chỗ nào sẽ ít nhất có 1 người gỡ cho bác là tui.
                            Câu 3:Mỗi nút 1 mã: Mã nhận dạng + Address+Command+Finish+Delay+Luật lặp lại nếu giữ phím.
                            Đương nhiên bác hoàn toàn lấy cắp được. Vì nó là mã cố định, gắn 1 mạch con con là bắt/copy mã được ngay.
                            Tuy nhiên hiểu sâu hơn thì hiện nay có những mã biến đổi theo thời gian, nghĩa là mỗi lúc phát một khác, nhưng bên thu vẫn thu được. Phát đúng lại mã cũ nó ko nhận. Mã này gần như ko có cao thủ nào copy được. Vì nếu copy thì copy quá khứ chứ ko copy tương lai.. Ví dụ mã 128 bit thì chục cái PEN4 chạy chục năm mới luận ra được mã. Mã này bảo mật khỏi bàn, và rất ít có ở các thiết bị du nhập về VN. Nói tơi cái này, nó phức tạp hơn cái ngắt ở trên đó bác....

                            Còn cấu trúc lệnh Cisc và Risc nếu đem so sánh thì mỗi cái có 1 điểm mạnh. Tốt nhất là đem mấy quyển sách về cấu trúc máy vi tính viết cho máy tính từ thời napoleoong mà đọc, từ thời 386 gi đó rồi có một số so sánh. Tui thì ko muốn đi vao cái này. Vì tui thích PIC 16 nhưng lại ghét cái tập lệnh bé xíu của nó, nên mới quay lại dùng C cho khỏe và ko quan tâm tới cái đó làm gì.

                            Nói đơn giản thì lệnh nhiều (ASM) vẫn hơn. Ví dụ nhé:
                            Ở 89: lệnh nhân 1 phát ăn luôn(khoảng 2 chu kỳ lệnh).
                            Ở PIC 16: làm 1 macro nhân 8 bit thì oải cả người(nhiều chu kỳ lệnh).
                            Nếu 1 phép tính nhân 8 bit thì tuy tốc độ pic16 gấp 2.5 lần 89C nhưng khi gặp cái lệnh khó chịu đó, thì PIC tốn thời gian hơn 89 là cái chắc.
                            Vì thế, cang về sau, PIC càng nhiều lệnh là vì lý do đó. PIC16--->PIC18--->PIC24--->dsPIC.
                            Ví dụ nữa nhé: Một phép tính PID của PIC 16 khoảng 1000 CK lệnh thì PIC18 và 89 khoảng 100 CK lệnh thôi. Nói tương đối chứ tui chưa thử những cái này.

                            Túm lại, nhiều lệnh vẫn hơn. Tuy nhiên nếu nhiều lệnh thì thường kéo theo core phức tạp hơn. Nhưng đó là chuyện của nhà sx, còn họ bán giá rẻ, đắt thì tùy ở họ. Mà tui nói cái này rối rắm, ko hiểu có bác nào hiểu tui ko? Nếu ko thì cứ coi như chưa bao giờ đọc nhá

                            Nếu nói về quan điểm ASM thì PIC ít lệnh nên dễ học là hoàn toàn sai. Ví dụ nhé: 89 khoảng 256 lệnh, ko nhớ thật rõ . PIC 16 có 35 lệnh.
                            Xem kỹ thấy số lênh 89= số lệnh PIC16+(256-35).(Đảm bảo 89 sẽ có 35 lệnh y như PIC).
                            Vậy vứt ngay đi 256-35 lệnh thi 2 thằng dễ học như nhau a?
                            Khà khà, lại khó hiểu nữa rồi. Thôi bye bye các bạn, đến hẹn lại lên bốc phét
                            Em nói thật với bác là em muốn làm lắm rồi...lắm lúc thèm học...nhưng kổ nỗi tính em quái đản...không có cái máy tính thì em chịu ko học được...Nếu có máy thì em cũng có thể bớt nói phét đi nhiều hú hú
                            Và nhất định em sẽ làm xong cải bắt mã ấy trong tuần.
                            Còn về cisc và risc hôm trước lan man trên mạng thấy nó có từ lâu lắm rồi
                            Theo em CPU sẽ xử lý nhanh hơn với cấu trúc RISC vì tập lệnh đơn giản, thực hiện trực tiếp bằng một bộ phần cứng. Còn với CISC sẽ xử lý chậm hơn vì để thực hiện một lệnh thì phải qua nhiều các bộ khác. Và như vậy RISC sẽ hợp với CPU nhỏ như PIC,89 còn CISC sẽ hợp với các loại lớn. Em nói câu này có đúng không bác.

                            Comment


                            • #74
                              bạn tienvnu nói về việc dùng RISC cho những dòng nhỏ và CISC cho những máy lớn phức tạp thì đúng, nhưng nhỏ ở đây không phải là uC, mà là từ uC cho đến cái Pen4 mà bạn đang xài cũng vẫn là nhỏ. Không phải tôi nói bậy đâu, máy PC từ đời Pen trở đi, sử dụng cấu trúc này.

                              Về tập lệnh, nói riêng về các dòng 8 bit, do có độ dài mã lệnh dài hơn, có thể là 2 byte, do đó nó có thể mã hóa nhiều lệnh hơn. Và bản chất, chuyện mã hóa này còn kèm theo phần ALU của nó có khả năng tính toán logic như thế nào.

                              Như vậy, với trường hợp lệnh nhân 8 bit với 8 bit, 89 thực hiện với lệnh MUL AB một cách khá đơn giản như sau:

                              Code:
                              MOV A,R5 
                               MOV B,R7
                               MUL AB   
                               MOV R2,B 
                               MOV R3,A
                              Chúng ta không so sánh bộ chia dao động ở đây, vì về sau này người ta làm một số con bộ chia là 1. Tôi không hiểu rõ về công nghệ

                              Trong khi đó, PIC phải thực hiện đến 35 chu kỳ. Thuật toán tốt nhất theo xác suất mà nói thì kết quả là 34 lệnh

                              Tuy nhiên, nếu xem tiếp tới lệnh nhân 16 bit với 16 bit, trong 89 sẽ viết thế này:

                              Code:
                              MUL16_16: 
                               ;Multiply R5 by R7
                               MOV A,R5 ;Move the R5 into the Accumulator
                               MOV B,R7 ;Move R7 into B
                               MUL AB   ;Multiply the two values
                               MOV R2,B ;Move B (the high-byte) into R2
                               MOV R3,A ;Move A (the low-byte) into R3
                              
                               ;Multiply R5 by R6
                               MOV A,R5    ;Move R5 back into the Accumulator
                               MOV B,R6    ;Move R6 into B
                               MUL AB      ;Multiply the two values
                               ADD A,R2    ;Add the low-byte into the value already in R2
                               MOV R2,A    ;Move the resulting value back into R2
                               MOV A,B     ;Move the high-byte into the accumulator
                               ADDC A,#00h ;Add zero (plus the carry, if any)
                               MOV R1,A    ;Move the resulting answer into R1
                               MOV A,#00h  ;Load the accumulator with  zero
                               ADDC A,#00h ;Add zero (plus the carry, if any)
                               MOV R0,A    ;Move the resulting answer to R0.
                              
                               ;Multiply R4 by R7
                               MOV A,R4   ;Move R4 into the Accumulator
                               MOV B,R7   ;Move R7 into B
                               MUL AB     ;Multiply the two values
                               ADD A,R2   ;Add the low-byte into the value already in R2
                               MOV R2,A   ;Move the resulting value back into R2
                               MOV A,B    ;Move the high-byte into the accumulator
                               ADDC A,R1  ;Add the current value of R1 (plus any carry)
                               MOV R1,A   ;Move the resulting answer into R1.
                               MOV A,#00h ;Load the accumulator with zero
                               ADDC A,R0  ;Add the current value of R0 (plus any carry)
                               MOV R0,A   ;Move the resulting answer to R1.
                              
                               ;Multiply R4 by R6
                               MOV A,R4  ;Move R4 back into the Accumulator
                               MOV B,R6  ;Move R6 into B
                               MUL AB    ;Multiply the two values
                               ADD A,R1  ;Add the low-byte into the value already in R1
                               MOV R1,A  ;Move the resulting value back into R1
                               MOV A,B   ;Move the high-byte into the accumulator
                               ADDC A,R0 ;Add it to the value already in R0 (plus any carry)
                               MOV R0,A  ;Move the resulting answer back to R0
                              
                               ;Return - answer is now in R0, R1, R2, and R3
                               RET
                              và để gọi code thì chúng ta dùng lệnh:

                              Code:
                              ;Load the first value into R6 and R7
                               MOV R6,#62h
                               MOV R7,#30h
                               
                               ;Load the first value into R4 and R5
                               MOV R4,#43h
                               MOV R5,#2Eh
                              
                               ;Call the 16-bit subtraction routine
                               LCALL MUL16_16
                              Trong khi đó, đoạn code để thực hiện phép nhân 16bit trong PIC được thực hiện như ở picvietnam tôi đã trình bày:

                              http://picvietnam.com/showthread.php?t=149

                              Về việc CB nói về viết bộ PID cho 89 chỉ có 100 lệnh và 1000 lệnh cho PIC là sai. Bởi vì chỉ riêng việc tính toán PWM và điều khiển, thì PIC đã làm tốt hơn nhiều lần so với 89 rồi.

                              Chưa kể rằng trong thuật toán PID hoàn toàn không có chỗ nào nhân chia với số 8 bit, cho nên chẳng thể nào nói rằng 89 lơi hơn PIC ở điểm tính toán cả.

                              Nếu bạn điều khiển PID mà chỉ dùng số 8 bit thì e rằng không bao giờ đạt được bộ điều khiển.

                              Chính vì vậy phải dùng số thực, và với việc dùng số thực, thì việc tính toán gần như như nhau.

                              Bởi vì tất cả đều là số, và tất cả đều thực hiện qua phép toán logic, mà phép nhân bắt buộc thực hiện như nhau, nhưng ở đây phần cứng 89 hỗ trợ phép nhân 8 bit, chứ không phải do độ dài mã lệnh có thể nhiều hơn mà 89 thực hiện được lệnh nhân 8 bit tốt hơn PIC.

                              Còn nếu nói về tính đơn giản khi lập trình, nếu bạn dùng MUL AB, thì trong PIC thực hiện với directive * , thế là xong.

                              Dòng PIC 16 không hỗ trợ lệnh nhân.

                              Điều này chưa nói được gì về RISC và CISC trong PIC cả.
                              Falleaf
                              Công ty TNHH Thương mại và Giao nhận R&P
                              58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                              mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                              Comment


                              • #75
                                Nguyên văn bởi falleaf
                                bạn tienvnu nói về việc dùng RISC cho những dòng nhỏ và CISC cho những máy lớn phức tạp thì đúng, nhưng nhỏ ở đây không phải là uC, mà là từ uC cho đến cái Pen4 mà bạn đang xài cũng vẫn là nhỏ. Không phải tôi nói bậy đâu, máy PC từ đời Pen trở đi, sử dụng cấu trúc này.

                                Về tập lệnh, nói riêng về các dòng 8 bit, do có độ dài mã lệnh dài hơn, có thể là 2 byte, do đó nó có thể mã hóa nhiều lệnh hơn. Và bản chất, chuyện mã hóa này còn kèm theo phần ALU của nó có khả năng tính toán logic như thế nào.

                                Như vậy, với trường hợp lệnh nhân 8 bit với 8 bit, 89 thực hiện với lệnh MUL AB một cách khá đơn giản như sau:

                                Code:
                                MOV A,R5 
                                 MOV B,R7
                                 MUL AB   
                                 MOV R2,B 
                                 MOV R3,A
                                Chúng ta không so sánh bộ chia dao động ở đây, vì về sau này người ta làm một số con bộ chia là 1. Tôi không hiểu rõ về công nghệ

                                Trong khi đó, PIC phải thực hiện đến 35 chu kỳ. Thuật toán tốt nhất theo xác suất mà nói thì kết quả là 34 lệnh

                                Tuy nhiên, nếu xem tiếp tới lệnh nhân 16 bit với 16 bit, trong 89 sẽ viết thế này:

                                Code:
                                MUL16_16: 
                                 ;Multiply R5 by R7
                                 MOV A,R5 ;Move the R5 into the Accumulator
                                 MOV B,R7 ;Move R7 into B
                                 MUL AB   ;Multiply the two values
                                 MOV R2,B ;Move B (the high-byte) into R2
                                 MOV R3,A ;Move A (the low-byte) into R3
                                
                                 ;Multiply R5 by R6
                                 MOV A,R5    ;Move R5 back into the Accumulator
                                 MOV B,R6    ;Move R6 into B
                                 MUL AB      ;Multiply the two values
                                 ADD A,R2    ;Add the low-byte into the value already in R2
                                 MOV R2,A    ;Move the resulting value back into R2
                                 MOV A,B     ;Move the high-byte into the accumulator
                                 ADDC A,#00h ;Add zero (plus the carry, if any)
                                 MOV R1,A    ;Move the resulting answer into R1
                                 MOV A,#00h  ;Load the accumulator with  zero
                                 ADDC A,#00h ;Add zero (plus the carry, if any)
                                 MOV R0,A    ;Move the resulting answer to R0.
                                
                                 ;Multiply R4 by R7
                                 MOV A,R4   ;Move R4 into the Accumulator
                                 MOV B,R7   ;Move R7 into B
                                 MUL AB     ;Multiply the two values
                                 ADD A,R2   ;Add the low-byte into the value already in R2
                                 MOV R2,A   ;Move the resulting value back into R2
                                 MOV A,B    ;Move the high-byte into the accumulator
                                 ADDC A,R1  ;Add the current value of R1 (plus any carry)
                                 MOV R1,A   ;Move the resulting answer into R1.
                                 MOV A,#00h ;Load the accumulator with zero
                                 ADDC A,R0  ;Add the current value of R0 (plus any carry)
                                 MOV R0,A   ;Move the resulting answer to R1.
                                
                                 ;Multiply R4 by R6
                                 MOV A,R4  ;Move R4 back into the Accumulator
                                 MOV B,R6  ;Move R6 into B
                                 MUL AB    ;Multiply the two values
                                 ADD A,R1  ;Add the low-byte into the value already in R1
                                 MOV R1,A  ;Move the resulting value back into R1
                                 MOV A,B   ;Move the high-byte into the accumulator
                                 ADDC A,R0 ;Add it to the value already in R0 (plus any carry)
                                 MOV R0,A  ;Move the resulting answer back to R0
                                
                                 ;Return - answer is now in R0, R1, R2, and R3
                                 RET
                                và để gọi code thì chúng ta dùng lệnh:

                                Code:
                                ;Load the first value into R6 and R7
                                 MOV R6,#62h
                                 MOV R7,#30h
                                 
                                 ;Load the first value into R4 and R5
                                 MOV R4,#43h
                                 MOV R5,#2Eh
                                
                                 ;Call the 16-bit subtraction routine
                                 LCALL MUL16_16
                                Trong khi đó, đoạn code để thực hiện phép nhân 16bit trong PIC được thực hiện như ở picvietnam tôi đã trình bày:

                                http://picvietnam.com/showthread.php?t=149

                                Về việc CB nói về viết bộ PID cho 89 chỉ có 100 lệnh và 1000 lệnh cho PIC là sai. Bởi vì chỉ riêng việc tính toán PWM và điều khiển, thì PIC đã làm tốt hơn nhiều lần so với 89 rồi.

                                Chưa kể rằng trong thuật toán PID hoàn toàn không có chỗ nào nhân chia với số 8 bit, cho nên chẳng thể nào nói rằng 89 lơi hơn PIC ở điểm tính toán cả.

                                Nếu bạn điều khiển PID mà chỉ dùng số 8 bit thì e rằng không bao giờ đạt được bộ điều khiển.

                                Chính vì vậy phải dùng số thực, và với việc dùng số thực, thì việc tính toán gần như như nhau.

                                Bởi vì tất cả đều là số, và tất cả đều thực hiện qua phép toán logic, mà phép nhân bắt buộc thực hiện như nhau, nhưng ở đây phần cứng 89 hỗ trợ phép nhân 8 bit, chứ không phải do độ dài mã lệnh có thể nhiều hơn mà 89 thực hiện được lệnh nhân 8 bit tốt hơn PIC.

                                Còn nếu nói về tính đơn giản khi lập trình, nếu bạn dùng MUL AB, thì trong PIC thực hiện với directive * , thế là xong.

                                Dòng PIC 16 không hỗ trợ lệnh nhân.

                                Điều này chưa nói được gì về RISC và CISC trong PIC cả.
                                Khà khà bác Falleaf quên mất mấy điều roài:
                                1-Em chỉ nói về biểu thức tính toán PID(ý nói thời gian thực hiện) chứ ko nói tới tính năng PWM.
                                2-Em luôn nhấn mạnh là PIC16 rồi, chú ko nói PIC chung chung. Ai dám đem so sánh với PIC18/24/dsPIC30/33
                                3-He he.. bác ăn gian rùi. So sánh lệnh nhân thì ko chỉ tính đến dòng lệnh mà còn tính đến thời gian thực hiện nó. Thời gian thực hiện mới là quan trọng.
                                Em ví dụ nhé:
                                for (i=0;i<200;i++)
                                {
                                NOP();
                                }
                                2 dòng lệnh nhỉ?Nhưng nó thực hiện hết bao nhiêu chu kỳ lệnh?
                                Và cái lệnh lặp 16 lần như ví dụ bác F nói ở trên thì thời gian?
                                Khà khà, thì đem so sánh 2 cái lệnh nhân của PIC16 và 89 thì nếu đem thời gian thực hiện thì đọc kỹ sẽ biết ai nhanh hơn ai nhiều lần ngay.
                                -------------------

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X