Thông báo

Collapse
No announcement yet.

Ngôn ngữ lập trình VĐK

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

  • Ngôn ngữ lập trình VĐK

    Nhiều bạn hỏi tôi về ngôn ngữ lập trình cho VĐK, khác nhau giữa C và Asm ... Xin trả lời vắn tắt như sau:

    - C là ngôn ngữ lập trình cấp cao, lệnh đơn giản hơn & dễ hiểu hơn. Để lập trình VĐK bằng C thì chỉ cần biết sơ qua về cấu trúc tổng quan của VĐK và thuật toán lập trình. Mới bắt đầu lập trình VĐK thì nên làm với C cho nhanh và dễ hiểu.

    - Asm là ngôn ngữ cấp thấp. Muốn lập trình bằng Asm được thì phải hiểu tường tận cấu trúc của VĐK và chức năng của từng bit. Để tối ưu hóa Code cho một sản phẩm chuyên nghiệp thì ta nên dùng Asm (Tuy nghiên ngày nay các hãng sản xuất chip thường viết riêng các C-Compiler tối ưu hóa Code cho các dòng chíp của mình) . Nếu mới học VĐK mà dùng Asm thì sẽ mất rất nhiều thời gian để sửa các lỗi li ti, dễ nản chí.
    Last edited by pavo_lusa; 01-01-2010, 22:56.
    :-)

  • #2
    bác ơi cho em hoi em muốn gửi bài lên diễn đàn em phải vào đâu

    Comment


    • #3
      Bác giúp em với! em muốn gửi bài em phải vào đâu.

      Comment


      • #4
        Nguyên văn bởi cpsaoviet Xem bài viết
        Bác giúp em với! em muốn gửi bài em phải vào đâu.
        muốn viết bài mới---> bé vào chuyên mục cần viết, nhấn New Thread (góc trái-dưới), viết và POST.
        trả lời bài nào đó ---> bé xem bài của ai đó, nhấn Post Reply hoặc QUOTE, viết và POST.

        Comment


        • #5
          Nguyên văn bởi pavo_lusa Xem bài viết
          Nhiều bạn hỏi tôi về ngôn ngữ lập trình cho VĐK, khác nhau giữa C và Asm ... Xin trả lời vắn tắt như sau:

          - C là ngôn ngữ lập trình cấp cao, lệnh đơn giản hơn & dễ hiểu hơn. Để lập trình VĐK bằng C thì chỉ cần biết sơ qua về cấu trúc tổng quan của VĐK và thuật toán lập trình. Mới bắt đầu lập trình VĐK thì nên làm với C cho nhanh và dễ hiểu.

          - Asm là ngôn ngữ cấp thấp. Muốn lập trình bằng Asm được thì phải hiểu tường tận cấu trúc của VĐK và chức năng của từng bit. Để tối ưu hóa Code cho một sản phẩm chuyên nghiệp thì ta nên dùng Asm (Tuy nghiên ngày nay các hãng sản xuất chip thường viết riêng các C-Compiler tối ưu hóa Code cho các dòng chíp của mình) . Nếu mới học VĐK mà dùng Asm thì sẽ mất rất nhiều thời gian để sửa các lỗi li ti, dễ nản chí.
          Tớ thì lại nghĩ khác như bác.

          - Dùng C hay Assembly language đều cần phải biết rõ về cấu trúc của VĐK. Nếu không rành về cấu trúc VĐK, biết rõ C hay không cũng đều là vô dụng.

          - Assembly language dùng cho một VĐK cho nên học nó phải đi đôi với việc học về cấu trúc của VĐK. Học ASM sẽ làm cho người học hiểu cặn kẽ về VĐK, và sẽ không học dư ra những phần không cần tới nếu học C (loại C tổng quát). Lúc tớ học VĐK thì học cấu trúc, assembly language và machine language chung một lớp. Còn chuyện nản chí hay không thì tại học trò thôi. Muốn thành tài mà nả chí thì đổi qua nghề khác mà học cho dễ hơn. Vả lại những chương trình dậy là do trường đặt ra, nản hay không nản thì cũng phải học thôi (trừ khi bác tự học hoặc mướn thầy dậy riêng).

          - Những ngôn ngữ cao hơn C như VB6, BASIC, v.v nếu muốn nói chuyện thẳng với VĐK hoặc uP thì bắt buộc phải biết về ASM nếu không muốn mất thì giờ học thêm C. Tuy nhiên nếu đã biết về C thì có thể viết DLL để điều khiển VĐK, uP dễ dàng hơn khi dùng VB9 hay BASIC. Tớ không chuyên làm về VĐK, cho nên khi dùng một con VĐK mới tớ nhẩy vô học thẳng ASM của nó (dựa trên sự hiểu biết của con VĐK tớ học cách đây hơn 20 năm). C thì tớ không đụng tới nhiều như ASM. Lý do chính là lập trình ngắn (chừng vài chục hàng thôi), và một lý do nữa là tớ hay dùng BASIC (bây giờ thì hết dùng rồi), VB6 cho nên C chỉ dùng để viết DLL thôi.

          Comment


          • #6
            Các bạn cho mình hỏi đoạn code mình viết bằng Assembler điều khiển led sáng tắt dùng cờ delay thời gian:
            ORG 0000H
            MOV R1,#0
            HIC:
            SETB P1.0
            HERE:
            ; Bat dau cho led sang

            MOV TL0,#000H
            MOV TH0,#000H
            DELAYBOMAY:
            SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
            AGAIN3: JNB TF0,AGAIN3 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
            CLR TR0 ; DUNG BO TIMER
            CLR TF0 ; XOA CO BO DINH THOI
            DELAYPHAI:
            ; TAO 255 VONG LAP
            INC R1 ; Tang them 1
            CJNE R1,#255,HERE


            CLR P1.0 ; Bat dau cho led tat
            HERE5:


            MOV TL0,#000H
            MOV TH0,#000H
            DELAYBOMAY5:
            SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
            AGAIN5: JNB TF0,AGAIN5 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
            CLR TR0 ; DUNG BO TIMER
            CLR TF0 ; XOA CO BO DINH THOI
            DELAY5:
            ; TAO 255 VONG LAP
            INC R1 ; Tang them 1
            CJNE R1,#255,HERE5

            ACALL HIC
            END



            Theo tính toán lý thuyết của mình thì với cờ TF cho chạy từ 0000H tới FFFFH đã mất khoảng 1.085 microgiay * 2^16 = 0.077s. Sau đó mình tạo một vòng lặp khoảng 255 lần . Như vậy tổng thời gian ít nhất cho việc delay tắt và bật là 0.077*255= 19,67s( chưa kể thêm vài xung nhịp thời gian dùng cho các lệnh khác trong nhãn ). Nhưng thực tế khi chạy thử trên proteus nó chỉ delay trong khoảng 2s. Không biết mình sai lập trình hay sai ở chương trình proteus. Mong các bạn chỉ giúp vì mình rất cần sự chính xác trong delay tắt bật của led.

            Comment


            • #7
              Nguyên văn bởi huancao_8x Xem bài viết
              Các bạn cho mình hỏi đoạn code mình viết bằng Assembler điều khiển led sáng tắt dùng cờ delay thời gian:
              ORG 0000H
              MOV R1,#0
              HIC:
              SETB P1.0
              HERE:
              ; Bat dau cho led sang

              MOV TL0,#000H
              MOV TH0,#000H
              DELAYBOMAY:
              SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
              AGAIN3: JNB TF0,AGAIN3 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
              CLR TR0 ; DUNG BO TIMER
              CLR TF0 ; XOA CO BO DINH THOI
              DELAYPHAI:
              ; TAO 255 VONG LAP
              INC R1 ; Tang them 1
              CJNE R1,#255,HERE


              CLR P1.0 ; Bat dau cho led tat
              HERE5:


              MOV TL0,#000H
              MOV TH0,#000H
              DELAYBOMAY5:
              SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
              AGAIN5: JNB TF0,AGAIN5 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
              CLR TR0 ; DUNG BO TIMER
              CLR TF0 ; XOA CO BO DINH THOI
              DELAY5:
              ; TAO 255 VONG LAP
              INC R1 ; Tang them 1
              CJNE R1,#255,HERE5

              ACALL HIC
              END



              Theo tính toán lý thuyết của mình thì với cờ TF cho chạy từ 0000H tới FFFFH đã mất khoảng 1.085 microgiay * 2^16 = 0.077s. Sau đó mình tạo một vòng lặp khoảng 255 lần . Như vậy tổng thời gian ít nhất cho việc delay tắt và bật là 0.077*255= 19,67s( chưa kể thêm vài xung nhịp thời gian dùng cho các lệnh khác trong nhãn ). Nhưng thực tế khi chạy thử trên proteus nó chỉ delay trong khoảng 2s. Không biết mình sai lập trình hay sai ở chương trình proteus. Mong các bạn chỉ giúp vì mình rất cần sự chính xác trong delay tắt bật của led.
              quote=huancao_8x;232328]Các bạn cho mình hỏi đoạn code mình viết bằng Assembler điều khiển led sáng tắt dùng cờ delay thời gian:
              ORG 0000H
              MOV R1,#0
              HIC:
              SETB P1.0
              HERE:
              ; Bat dau cho led sang

              MOV TL0,#000H
              MOV TH0,#000H
              DELAYBOMAY:
              SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
              AGAIN3: JNB TF0,AGAIN3 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
              CLR TR0 ; DUNG BO TIMER
              CLR TF0 ; XOA CO BO DINH THOI
              DELAYPHAI:
              ; TAO 255 VONG LAP
              INC R1 ; Tang them 1
              CJNE R1,#255,HERE


              CLR P1.0 ; Bat dau cho led tat
              HERE5:


              MOV TL0,#000H
              MOV TH0,#000H
              DELAYBOMAY5:
              SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
              AGAIN5: JNB TF0,AGAIN5 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
              CLR TR0 ; DUNG BO TIMER
              CLR TF0 ; XOA CO BO DINH THOI
              DELAY5:
              ; TAO 255 VONG LAP
              INC R1 ; Tang them 1
              CJNE R1,#255,HERE5

              ;ACALL HIC;thay thu lenh nay xem sao (lenh nay de goi mot ct con)
              JMP HIC
              END
              |

              Comment


              • #8
                Nguyên văn bởi tdm Xem bài viết
                quote=huancao_8x;232328]Các bạn cho mình hỏi đoạn code mình viết bằng Assembler điều khiển led sáng tắt dùng cờ delay thời gian:
                ORG 0000H
                MOV R1,#0
                HIC:
                SETB P1.0
                HERE:
                ; Bat dau cho led sang

                MOV TL0,#000H
                MOV TH0,#000H
                DELAYBOMAY:
                SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
                AGAIN3: JNB TF0,AGAIN3 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
                CLR TR0 ; DUNG BO TIMER
                CLR TF0 ; XOA CO BO DINH THOI
                DELAYPHAI:
                ; TAO 255 VONG LAP
                INC R1 ; Tang them 1
                CJNE R1,#255,HERE


                CLR P1.0 ; Bat dau cho led tat
                HERE5:


                MOV TL0,#000H
                MOV TH0,#000H
                DELAYBOMAY5:
                SETB TR0 ; KHOI DONG BO DINH THOI TIMER 0
                AGAIN5: JNB TF0,AGAIN5 ; HIEN THI CO TF DEN KHI NO VUOT QUA FFFFH....4
                CLR TR0 ; DUNG BO TIMER
                CLR TF0 ; XOA CO BO DINH THOI
                DELAY5:
                ; TAO 255 VONG LAP
                INC R1 ; Tang them 1
                CJNE R1,#255,HERE5

                ;ACALL HIC;thay thu lenh nay xem sao (lenh nay de goi mot ct con)
                JMP HIC
                END
                Thực ra 2 lệnh đó cũng không thay đổi chương trình mà bạn. ACALL là lệnh gọi tuyệt đối, lệnh nhảy ngắn JMP thì ở tình huống này kết quả tương đương nhau! Mình cũng test lại proteus rồi và thấy thế. Thực sự điều mình quan tâm lúc này là mã delay cho led có phải là gần 20s như mình tính toán không trong khi test proteus lại chỉ khoảng 2,3s. Mong các bạn có thể tính toán chính xác thời gian delay bật tắt led theo lý thuyết ở đoạn mã đó.

                Comment


                • #9
                  Nguyên văn bởi huancao_8x Xem bài viết
                  Thực ra 2 lệnh đó cũng không thay đổi chương trình mà bạn. ACALL là lệnh gọi tuyệt đối, lệnh nhảy ngắn JMP thì ở tình huống này kết quả tương đương nhau! Mình cũng test lại proteus rồi và thấy thế. Thực sự điều mình quan tâm lúc này là mã delay cho led có phải là gần 20s như mình tính toán không trong khi test proteus lại chỉ khoảng 2,3s. Mong các bạn có thể tính toán chính xác thời gian delay bật tắt led theo lý thuyết ở đoạn mã đó.
                  bạn đã thử thay đổi lệnh và chay thử hay chưa?
                  nếu bạn dùng lệnh ACALL thì HIC sẽ được hiểu như là một ct con thì lệnh kết thúc ct con ờ đâu?
                  cho lên ct sẽ chạy sai.
                  |

                  Comment


                  • #10
                    MÌnh chạy thử rồi, không thay đổi gì mà.

                    Comment


                    • #11
                      Nguyên văn bởi huancao_8x Xem bài viết
                      MÌnh chạy thử rồi, không thay đổi gì mà.
                      bạn chưa khởi tạo time_0 ở chế độ 16bít cụ thề là thanh ghi TMOD.cho lên mặc định time_0 của bạn đang chạy ở chế độ 13 bít lên delay sai la phài rồi.
                      |

                      Comment


                      • #12
                        Nguyên văn bởi tdm Xem bài viết
                        bạn chưa khởi tạo time_0 ở chế độ 16bít cụ thề là thanh ghi TMOD.cho lên mặc định time_0 của bạn đang chạy ở chế độ 13 bít lên delay sai la phài rồi.
                        Thực sự là thiếu cái lệnh MOV TMOD,#01H đó, thanks bạn nhiều lắm! mình test lại thì thấy chạy gần chính sác 17s so với tính toán là 18.13s. Không biết còn nguyên nhân sai sót nào nữa không tdm có thể giúp với. Mà sao bạn biết được khi không cho lệnh TMOD cụ thể nó sẽ hiểu 13bit, cái delay 13bit khác 16 bit như nào bạn chỉ mình biết luôn được không? Những tài liệu ASM mình có không nói rõ phần này.

                        Comment


                        • #13
                          bác giúp em làm cái này với:
                          thiết kế bộ cộng trừ các bít(có 1 bít dấu) phép toán thực hiện ở dạng mã ngược 1 cột dấu.
                          Với định nghĩa mã ngược như sau:
                          muốn cộng 2 số mã ngược ta cộng bình thường ở tất cả các cột kể cả cột dấu. nếu cột dấu có nhớ thì đơn vị nhớ đó được chuyển đến cột có trọng lượng thấp nhât của kết quả.
                          THANKS BÁC TRƯỚC NHA!!!!

                          Comment


                          • #14
                            em đang làm đồ án về từ điển tra cứu chân IC.phần cứng gồm các khối gì ai biết giúp giùm với.nếu có sơ đồ càng tốt.cảm ơn nhiều luôn.

                            Comment


                            • #15
                              Nguyên văn bởi huancao_8x Xem bài viết
                              Thực sự là thiếu cái lệnh MOV TMOD,#01H đó, thanks bạn nhiều lắm! mình test lại thì thấy chạy gần chính sác 17s so với tính toán là 18.13s. Không biết còn nguyên nhân sai sót nào nữa không tdm có thể giúp với. Mà sao bạn biết được khi không cho lệnh TMOD cụ thể nó sẽ hiểu 13bit, cái delay 13bit khác 16 bit như nào bạn chỉ mình biết luôn được không? Những tài liệu ASM mình có không nói rõ phần này.
                              13bit :time đếm đến 8192 thì tràn.
                              16bit:time đếm đến 65356 thì tràn.
                              bạn muốn biết chính xác hay không lên chạy trên mạch thật.ngoài ra sai số của thạnh anh cũng là nguyên nhân.
                              không khời tạo TMOD=00
                              |

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X