Thông báo

Collapse
No announcement yet.

Đoạn chương trình tạo trễ trong ASM

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

  • Đoạn chương trình tạo trễ trong ASM

    Chào các bạn !
    Mình có đoạn chương trình tạo trễ sau với yêu cầu là trễ 1 phút .
    Mình chạy mô phỏng thì lại thấy nó trễ đến 75 giây, mặc dù theo mình tính toán tổng thời gian của vòng lặp + ngắt + chu kỳ lệnh là vừa đủ 1 phút.
    Không biết là do mình tính sai hay là do mô phỏng không chính xác ?
    Vì cái này mà mình " đau đầu " mấy hôm rồi mà vẫn " không hiểu nổi " !
    Các bạn giúp mình với !
    Cảm ơn nhiều nha !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!


    INCLUDE 89C51.mc

    org 00h
    SJMP Main

    ;**************************
    org 0Bh
    LJMP delay_1ph

    ;**************************
    org 30h
    Main:
    MOV TMOD,#01
    MOV TL0,#00h
    MOV TH0,#00h
    MOV IE,#10000010b
    MOV IP,#00000010b
    SETB TR0

    ;**************************
    ; doan chuong trinh doi ngat

    doi: CJNE R2,#0,doi
    CLR TR0
    LJMP Main

    ;**************************


    delay_1ph:
    CLR TR0
    CLR TF0
    MOV TL0,#01h
    MOV TH0,#00h
    DEC R2

    MOV R7,#201
    ham_0: MOV R6,#215
    ham_1: MOV R5,#255
    ham_2: MOV R4,#1
    ham_3: DJNZ R4,ham_3
    DJNZ R5,ham_2
    DJNZ R6,ham_1
    DJNZ R7,ham_0
    SETB TR0
    RETI
    ;**************************
    Last edited by success.tl; 03-08-2008, 13:08.

    Mobile: 0169.966.3867
    Email:

  • #2
    Khó nhỉ, muốn tính toán tổng thời gian trong ấy cũng mệt đó. Sao ko dùng timer viết cho chính xác?

    Comment


    • #3
      Mình thấy hình như chương trình của bạn còn thiếu phần khai báo để làm việc ở chế độ ngắt timer ?
      Mình thấy trong chương trình con ngắt bạn chỉ nên nạp giá trị cho Timer chạy thôi.Mọi lệnh khác nên đưa ra ngoài thì sẽ tốt hơn.
      Để biết thời gian có chính xác ko bạn nên ráp thử mạch và kiểm chứng bằng đồng hồ thực tế.
      Mô phỏng là một chuyện,thực tế sẽ ko hoàn toàn giống vậy đâu.Vì mô phỏng là ở điều kiện linh kiện là lý tưởng rồi.
      Mà này.Bạn nên tìm hiểu RTC để làm đồng hồ với thời gian chính xác hơn.
      Chúc bạn thành công!

      Comment


      • #4
        Đọc mãi chả hiểu gì cả. Timer thì chưa thấy bật.
        AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
        Xem thêm tại Online Store ---> Click here
        Mob: 0982.083.106

        Comment


        • #5
          chương trình của bạn thiếu tùm lum bạn ạ
          bạn không khai báo timer
          kg cho timer chạy ngắt dc chết liền
          R2 chưa nạp giá trị làm sao giảm dc
          ...

          Comment


          • #6
            Nguyên văn bởi success.tl Xem bài viết
            Chào các bạn !
            Mình có đoạn chương trình tạo trễ sau với yêu cầu là trễ 1 phút .
            Mình chạy mô phỏng thì lại thấy nó trễ đến 75 giây, mặc dù theo mình tính toán tổng thời gian của vòng lặp + ngắt + chu kỳ lệnh là vừa đủ 1 phút.
            Không biết là do mình tính sai hay là do mô phỏng không chính xác ?
            Vì cái này mà mình " đau đầu " mấy hôm rồi mà vẫn " không hiểu nổi " !
            Các bạn giúp mình với !
            Cảm ơn nhiều nha !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!


            INCLUDE 89C51.mc

            org 00h
            SJMP Main
            ;**************************
            org 0Bh
            LJMP delay_1ph

            ;**************************
            org 30h
            Main:

            ;**************************
            ; doan chuong trinh doi ngat

            doi: CJNE R2,#0,doi
            CLR TR0
            LJMP Main

            ;**************************


            delay_1ph:
            CLR TR0
            CLR TF0
            MOV TL0,#01h
            MOV TH0,#00h
            DEC R2

            MOV R7,#201
            ham_0: MOV R6,#215
            ham_1: MOV R5,#255
            ham_2: MOV R4,#1
            ham_3: DJNZ R4,ham_3
            DJNZ R5,ham_2
            DJNZ R6,ham_1
            DJNZ R7,ham_0
            SETB TR0
            RETI
            ;**************************
            nếu bạn muốn sửdungj timer để làm thời gian delay thìbanj phải khởi tạo ngắt trước đã. rồi cho phép ngắt timer0 rồi cho timer0 chạy. nên nạp giá tri ban đầu cho r2. chuong trình của bạn chỉ chạy lòng vòng trong main thôi, đâu co delay gi đâu..........
            hãy cố gắng dù vướn phải thất bại!!!!!!!!

            Comment


            • #7
              Xin lỗi các bạn nhé !
              Đây là đoạn chương trình mà mình đã cắt bỏ nhiều phần mà lại quên không Post lên để các bạn giúp. Trong nhãn Main : đã khai báo đầy đủ :
              MOV TMOD,#01
              MOV TL0,#00h
              MOV TH0,#00h
              MOV IE,#10000010b
              MOV IP,#00000010b
              SETB TR0

              Và mình đã cắt bớt đi cho gọn, chỉ còn lại là phần chính thôi .
              Đảm bảo với các bạn là chạy được rồi ! Chỉ có điều là độ trễ không như mong muốn thôi !
              Mình đã sửa lại ở bài viết phía trên rồi đó !
              Đoạn lệnh :
              doi: CJNE R2,#0,doi
              CLR TR0
              LJMP Main
              chỉ là thực hiện giảm giá trị R2 bất kỳ để đợi ngắt thôi mà ! Giá trị R2 không quan trọng !
              Các bạn tiếp tục giúp mình nhé !!!!
              Last edited by success.tl; 03-08-2008, 13:14.

              Mobile: 0169.966.3867
              Email:

              Comment


              • #8
                Cái vòng tạo trễ dùng các Rx của bạn với thạch anh 11,0592MHz là cũng ~ 1 phút đấy -> Bạn không có sai. Muốn biết sai hay không thì nạp vào mạch thực là biết ngay thôi

                email:mahaco@fpt.vn

                Comment


                • #9
                  Nguyên văn bởi success.tl Xem bài viết
                  Chào các bạn !
                  Mình có đoạn chương trình tạo trễ sau với yêu cầu là trễ 1 phút .
                  Mình chạy mô phỏng thì lại thấy nó trễ đến 75 giây, mặc dù theo mình tính toán tổng thời gian của vòng lặp + ngắt + chu kỳ lệnh là vừa đủ 1 phút.
                  Không biết là do mình tính sai hay là do mô phỏng không chính xác ?
                  Vì cái này mà mình " đau đầu " mấy hôm rồi mà vẫn " không hiểu nổi " !
                  Các bạn giúp mình với !
                  Cảm ơn nhiều nha !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!


                  INCLUDE 89C51.mc

                  org 00h
                  SJMP Main
                  ;**************************
                  org 0Bh
                  LJMP delay_1ph

                  ;**************************
                  org 30h
                  Main:

                  ;**************************
                  ; doan chuong trinh doi ngat

                  doi: CJNE R2,#0,doi
                  CLR TR0
                  LJMP Main

                  ;**************************


                  delay_1ph:
                  CLR TR0
                  CLR TF0
                  MOV TL0,#01h
                  MOV TH0,#00h
                  DEC R2

                  MOV R7,#201
                  ham_0: MOV R6,#215
                  ham_1: MOV R5,#255
                  ham_2: MOV R4,#1
                  ham_3: DJNZ R4,ham_3
                  DJNZ R5,ham_2
                  DJNZ R6,ham_1
                  DJNZ R7,ham_0
                  SETB TR0
                  RETI
                  ;**************************
                  Theo cách của mình thì như sau,bạn tham khảo nhé:
                  1phuts=60s=60.1000ms=60.250.4.1ms
                  Tre_1phut:
                  mov r1,#60
                  lap1:
                  mov r2,#250
                  lap2:
                  mov r3,#4
                  lap3:
                  mov TMOD,#20H ;timer1 chế độ 2(auto reload)
                  mov th1,#0fch
                  mov tl1,#18h
                  setb Tr1
                  lap4:
                  jnb Tf1,lap4 ;chờ ở đây cho đến khi xảy ra tràn timer
                  clr Tf1
                  clr Tr1
                  djnz r3,lap3
                  djnz r2,lap2
                  djnz r1,lap1
                  ret
                  YM :

                  Comment


                  • #10
                    Xin lỗi bạn trong đoạn chương trình tạo trễ vừa rồi ,mình đã làm sai một chỗ đó là ở đây sử dụng timer1 chế độ 1(đếm 16 bit)chứ ko phải chế độ 2 đâu bạn à,mình nhầm tí xíu.Bạn sửa lại là:
                    mov TMOD,#10H
                    Xin lỗi nha!
                    YM :

                    Comment


                    • #11
                      Bạn H.Hai à ! Mình chưa kịp kiểm tra chương trình của bạn mà mình mới chỉ xem để định hướng cho phần lập trình của mình thôi !
                      Cảm ơn bạn đã kịp " sửa sai " !!! Không sao đâu !!!

                      Mobile: 0169.966.3867
                      Email:

                      Comment


                      • #12
                        Bạn thử dùng chương trình này xem. Đơn giản lắm
                        mov r3, #60
                        delay1s:
                        mov r0,#10
                        k1: mov r1,#200
                        k2: mov r2,#229
                        djnz r2,$
                        djnz r1,k2
                        djnz r0,k1
                        djnz r3, delay1s
                        ret

                        Comment


                        • #13
                          Bạn 8X_cbg à ! Đoạn chương trình của bạn hoàn toàn đúng ! Tuy nhiên ,đối với chương trình của tớ thì đoạn chương trình đó không phù hợp cho lắm ! Vì tớ muốn trong thời gian đếm 1 phút thì VĐK làm một số việc khác mà không ảnh hưởng đến độ trễ 1 phút . Vì vậy tớ sử dụng ngắt Timer là tối ưu hơn !
                          Thankyou !!!

                          Mobile: 0169.966.3867
                          Email:

                          Comment


                          • #14
                            Nguyên văn bởi ngohaithien
                            Sao k cho no nhay tai cho de cho de tinh thoi gian hon ban nhay zay, su sai so se tro nen nhieu hon



                            trời có người làm nghề đào mộ kìa?


                            MOV NHÀ,ANH
                            MOV NHÀ,EM
                            ADD ANH,EM

                            Comment


                            • #15
                              pro nào có thể cho e xin code tạo trễ 100us được không( dùng asm) e mới học nên cũng chưa biết. cảm ơn các pro

                              Comment

                              Về tác giả

                              Collapse

                              success.tl Tìm hiểu thêm về success.tl

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

                              Collapse

                              Đang tải...
                              X