Thông báo

Collapse
No announcement yet.

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

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

  • 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 "

  • #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


    • #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


      • #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


        • #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


          • #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


            • #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


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

                Comment


                • #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...
                  X