Hỏi về HIGH(x) và LOW(x) trong ASM

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • fan.8051
    Thành viên tích cực
    • Jul 2009
    • 145

    #1

    Hỏi về HIGH(x) và LOW(x) trong ASM

    mình có 2 đoạn code asm sau:
    CODE thu nhất:

    MOV TMOD,#02h
    MOV TH0,#(-50)
    MOV TL0,#(-50)
    SETB TR0 ; Cho phép timer 0 chạy
    Lap:
    JNB TF0,Lap ; Nếu Timer chưa tràn thì chờ
    CLR TF0
    CPL P1.0 ; Đảo bit P1.0 để tạo xung vuông
    SJMP Lap
    END

    CODE thứ hâi:

    MOV TMOD,#10h
    Batdau:
    MOV TH1,#HIGH(-500)
    MOV TL1,#LOW(-500)
    SETB TR1 ; Cho phép timer 1 chạy
    Lap:
    JNB TF1,Lap ; Nếu Timer chưa tràn thì chờ
    CLR TF1
    CPL P1.1 ; Đảo bit P1.1 để tạo xung vuông
    CLR TR1
    SJMP Batdau ; Quay lại nạp giá trị cho TH0_TL0
    END


    bạn nào hiểu thì cho mình hỏi cái:
    lệnh HIGH voi LOW có ý nghĩa gì vậy ? nếu ko dùng có được ko?
    " Muốn biết phải hỏi, muốn giỏi phải học "
  • futurek43
    Thành viên mới
    • Mar 2010
    • 7

    #2
    theo mình biết thì lệnh MOV,TH1 HIGH(-500) là gán 4 bít cao cua 500 vào TH1 và lệnh MOV, TL1 LOW(-500) là gán 4bit thấp của 500 vào TL1.

    Comment

    • hoanglongroy
      Thành viên chính thức
      • Oct 2008
      • 97

      #3
      sao lại là 4 bit hả bạn ? hình như future nhằm rồi..
      HiGH và LOW là lấy byte cao và byte thấp (8bit)
      như lệnh trên thì ta có -500 = FE0C (số bù 2 của 500)
      TH sẽ có giá trị byte cao của -500 tức là FE
      TL sẽ có giá trị byte thấp của -500 tức là 0C

      Comment

      • fan.8051
        Thành viên tích cực
        • Jul 2009
        • 145

        #4
        tại sao ta ko nạp thẳng giá trị 250 vào TH va TL mà phait thông qua hàm trung gian như vay ? mà em chưa hiểu cách quy đổi từ 500 sang FE0C !!!!!!!! bác nào nói sơ qua cho em với nha !!!!
        " Muốn biết phải hỏi, muốn giỏi phải học "

        Comment

        • hoanglongroy
          Thành viên chính thức
          • Oct 2008
          • 97

          #5
          bạn đem 500/2 = 250 rồi nạp vô 2 cái H L của Timer là sai khủng khiếp, vì khi chuyển ra nhị nhân thì nó đâu có dính dán gì, giá trị rõ ràng sai, người ta chia H-L là dựa vào byte cao-thấp của mã nhị phân.ngôn ngữ máy tính ko bàn đến thập phân.
          còn FE0C không phải = 500 mà là -500, bạn thử chuyển đổi sẽ thấy...
          ta cần đếm 500 xung, nhưng timer chỉ đếm lên và phát tràn khi FFFF(tức là 65535)->0000, vì vậy không thể dùng giá trị 500(cái này chỉ đúng khi đếm xuống--> ta muốn là 1 chuyện,vđk nó vẫn cứ đếm lên), vì vậy ta phải lấy -500 (FE0C hay 65036), rõ ràng bạn thấy từ 65036-->0000 cần 500 chu kỳ máy.(bạn để 500-->0000 thì cần đến 65036 chu kỳ máy)

          Comment

          • fan.8051
            Thành viên tích cực
            • Jul 2009
            • 145

            #6
            bác hoanglongroy cho em nick chat duoc ko ? em ko hieu lắm, xin bác chỉ giáo thêm cho, bác gắng giúp em với

            nick em: sutuden_195
            " Muốn biết phải hỏi, muốn giỏi phải học "

            Comment

            • a2ofu
              Thành viên chính thức
              • Sep 2009
              • 59

              #7
              Nguyên văn bởi fan.8051 Xem bài viết
              tại sao ta ko nạp thẳng giá trị 250 vào TH va TL mà phait thông qua hàm trung gian như vay ? mà em chưa hiểu cách quy đổi từ 500 sang FE0C !!!!!!!! bác nào nói sơ qua cho em với nha !!!!
              Tùy theo mỗi tính linh hoạt của mỗi chương trình mà người lập trình viết để dễ dàng thay đổi về sau. Muốn đổi -500 sang Hex cách đơn giản nhất là mở chương trình máy tính trong computer len gõ vào phần nhị phân -500 và sau đó nhấn vào chữ Hex để chuyển qua Hex.

              Comment

              • futurek43
                Thành viên mới
                • Mar 2010
                • 7

                #8
                Uh mình nhầm thật, TH và TL có độ dài 8 bit.

                Comment

                • hoanglongroy
                  Thành viên chính thức
                  • Oct 2008
                  • 97

                  #9
                  để hiểu đc phần này, bạn nên đọc và hiểu rõ các vấn đề sau:
                  cụ thể l ở mỗi chế độ thì nó đếm thế nào ? lưu ý là timer vđk chỉ đếm lên, không có vụ đếm xuống.
                  biết được khi nào nó tràn, và tràn thì nó sẽ làm gì.
                  vậy là bạn có thể hiểu timer hoạt động thế nào

                  Comment

                  Về tác giả

                  Collapse

                  fan.8051 Say mê Điện tử Tìm hiểu thêm về fan.8051

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

                  Collapse

                  Đang tải...