Thông báo

Collapse
No announcement yet.

Anh em nào có kinh nghiệm về ngắt trong trao đổi cho mọi người cùng học hỏi?

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

  • Anh em nào có kinh nghiệm về ngắt trong trao đổi cho mọi người cùng học hỏi?


    em đang có vấp phải vấn đề về ngắt trong mà tìm hiểu mãi không ra,bác nào có kinh nghiệm về ngắt trao đổi anh em cùng học hỏi được không.?
    bjo em muốn sử dụng ngắt trong thì làm như thế nào nhỉ các bác.chẳng nhẽ lại setb TF à nếu chương trình mình viết mà khi gặp lệnh setb TF nó sẽ nhảy đến chương trình ngắt thì có khác nào sử dụng lệnh jmp hay call.cac bác có thể giải thích cho em về vấn đề nay không em đọc sách mã mà chănggr hiểu quái j cả..
    đùa chứ tớ hơi ngu...thông cảm nha..heee...

  • #2
    bạn cho timer chạy (SETB TRx), khi timer tràn tự thân cờ TFx nó lên 1 thì 8051 tự biết mà nhảy vào chương trình ngắt.

    Comment


    • #3
      Nó cũng giống cái lệnh nhảy có điều kiện.Làm như bạn thì nó chậm hơn dÙng timer.Bạn phải có 1 biến đếm,lệnh kiểm tra biến đếm. 1 điều bạn viết được định 1 khoảng thời gian giống nhau lại thực hiện 1 chương trình con không?.Nó chỉ có việc chạy rồi nhảy.Chủ yếu timer làm việc để đồng bộ trong truyền dữ liệu.
      , , ,

      Comment


      • #4
        Ngắt thì bạn cứ hiểu như mình luôn thiết lập trạng thái " Sẵn sàng nhận một sự kiện " ở một chân ngắt.
        Chuơng Trình Điều khiển ngắt chỉ là.
        Thiết lập thanh ghi điều khiển ngắt.
        Và chờ nhận thôi.

        Comment


        • #5
          Nguyên văn bởi chung1608 Xem bài viết
          bạn cho timer chạy (SETB TRx), khi timer tràn tự thân cờ TFx nó lên 1 thì 8051 tự biết mà nhảy vào chương trình ngắt.
          bác có thể cho một ví dụ được không em chưa hiểu cho lắm
          giờ giả sử em xét time1
          em viết thế này có được không bác:
          org 0000h
          ljmp main
          org 001bh
          ljmp chay_tu_dong
          org 0030h
          main:
          chay_bang_tay:
          ........
          doan_chuong_trinh_xay_ra_ngat:
          setb tr1 ;cho phep ngat
          setb tf1 ;xay ra ngat luon
          mov ie,#88h
          .........
          jmp main
          chay_tu_dong:
          .......
          reti
          ....
          end
          bac xem em viết thế liệu co đúng không bác
          liệu có cần khai báo tmod không bác
          Last edited by toan258; 12-10-2011, 14:49.
          đùa chứ tớ hơi ngu...thông cảm nha..heee...

          Comment


          • #6
            em có một thắc mắc nữa là nếu chương trình đang phục vụ ngắt(đang chạy trong chương trình ngắt) mà có một lệnh thoát khỏi ngắt ví dụ như mov ie,#00h hay có thể clr TFx thì chương trình có trở về chương trình chính không các bác
            đùa chứ tớ hơi ngu...thông cảm nha..heee...

            Comment


            • #7
              Nguyên văn bởi toan258 Xem bài viết
              em có một thắc mắc nữa là nếu chương trình đang phục vụ ngắt(đang chạy trong chương trình ngắt) mà có một lệnh thoát khỏi ngắt ví dụ như mov ie,#00h hay có thể clr TFx thì chương trình có trở về chương trình chính không các bác
              ặc ặc ,bạn này bị nhầm lẫn ngắt ngoài và ngắt trong thì pải =.=
              ngắtt ngoài là dùng để khi bạn muốn sài chương trình cho thiết bị ngoài

              chờ xíu mình up cái file kia cho bạn đọc về 8051 ,hay mà dễ hiểu phết
              k nhớ là tớ down như 2pic nào trong này nữa ~.~

              Comment


              • #8
                Cau truc va lap trinh ho VDK 8051.pdf

                Comment


                • #9
                  Nguyên văn bởi toan258 Xem bài viết
                  bác có thể cho một ví dụ được không em chưa hiểu cho lắm
                  giờ giả sử em xét time1
                  em viết thế này có được không bác:
                  org 0000h
                  ljmp main
                  org 001bh
                  ljmp chay_tu_dong
                  org 0030h
                  main:
                  chay_bang_tay:
                  ........
                  doan_chuong_trinh_xay_ra_ngat:
                  setb tr1 ;cho phep ngat
                  setb tf1 ;xay ra ngat luon
                  mov ie,#8ah
                  .........
                  jmp main
                  chay_tu_dong:
                  .......
                  reti
                  ....
                  end
                  bac xem em viết thế liệu co đúng không bác
                  liệu có cần khai báo tmod không bác
                  hì hì ,nếu là ngắt ngoài thì pải tác động lên thanh ghi cho phép ngắt chứ
                  còn cái lệnh set tr1 của bạn là chỉ có tác dụng khởi động timer1 thôi

                  Comment


                  • #10
                    Nguyên văn bởi voiconvuive Xem bài viết
                    ặc ặc ,bạn này bị nhầm lẫn ngắt ngoài và ngắt trong thì pải =.=
                    ngắtt ngoài là dùng để khi bạn muốn sài chương trình cho thiết bị ngoài

                    chờ xíu mình up cái file kia cho bạn đọc về 8051 ,hay mà dễ hiểu phết
                    k nhớ là tớ down như 2pic nào trong này nữa ~.~
                    đọc kĩ hướng dẫn sử dụng trước khi dùng.

                    Nguyên văn bởi toan258 Xem bài viết
                    em có một thắc mắc nữa là nếu chương trình đang phục vụ ngắt(đang chạy trong chương trình ngắt) mà có một lệnh thoát khỏi ngắt ví dụ như mov ie,#00h hay có thể clr TFx thì chương trình có trở về chương trình chính không các bác
                    thật chất chương trình phục vụ ngắt chỉ là 1 chương trình con thôi bạn, vấn đề nó luôn nằm ở con trỏ PC. Bạn SETB TRx là cho phép time hoạt động, Cờ TFx mới là cờ tạo nên việc ngắt. Nếu bạn làm lệnh SETB TFx trước lệnh MOV IE,#8ah thì ngắt sẽ không xảy ra vào thời điểm đó. TMOD phải được thiết lập chế độ.
                    Mình ví dụ cho dễ hiểu:
                    chương trình chính đang chạy (TFx đang bằng 0), vì 1 lý do nào đó TFx bằng 1. VDK sẽ hoàn tất lệnh đang làm, nạp địa chỉ lệnh tiếp theo vào PC rồi sau đó mới nhảy tới trình phục vụ ngắt. Trong thời gian làm trình phục vụ ngắt ( giả sử chỉ là các lệnh đơn giản ko có lệnh nhảy) VDK chỉ thoát khỏi trình phục vụ ngắ, khi gặp phải lệnh RETI thôi chứ ngoài ra ko có lệnh nào ( ngoài lệnh nhảy) làm cho nó thoát khỏi trình phục vụ ngắt.
                    Bạn nên viết 1 số chương trình nhỏ và dùng phần mềm mô phỏng quá trình thực thi lệnh để hiểu rõ hơn
                    Last edited by chung1608; 11-10-2011, 18:25.

                    Comment


                    • #11
                      Nguyên văn bởi voiconvuive Xem bài viết
                      ặc ặc ,bạn này bị nhầm lẫn ngắt ngoài và ngắt trong thì pải =.=
                      ngắtt ngoài là dùng để khi bạn muốn sài chương trình cho thiết bị ngoài

                      chờ xíu mình up cái file kia cho bạn đọc về 8051 ,hay mà dễ hiểu phết
                      k nhớ là tớ down như 2pic nào trong này nữa ~.~
                      bác này củ chuối quá.em đã nói rõ là dùng time1 rồi mà bác còn bảo nhầm j nữa.nhưng cũng rất cám ơn tinh thần của bác.quyển của nguyễn tăng cường đó em đọc cũng nát rồi nhưng kinh nghiệm ít nên chưa lĩnh hội dc hết,nhiều vấn đề vẫn không hiểu..
                      đùa chứ tớ hơi ngu...thông cảm nha..heee...

                      Comment


                      • #12
                        Nguyên văn bởi chung1608 Xem bài viết
                        đọc kĩ hướng dẫn sử dụng trước khi dùng.


                        thật chất chương trình phục vụ ngắt chỉ là 1 chương trình con thôi bạn, vấn đề nó luôn nằm ở con trỏ PC. Bạn SETB TRx là cho phép time hoạt động, Cờ TFx mới là cờ tạo nên việc ngắt. Nếu bạn làm lệnh SETB TFx trước lệnh MOV IE,#8ah thì ngắt sẽ không xảy ra vào thời điểm đó. TMOD phải được thiết lập chế độ.
                        Mình ví dụ cho dễ hiểu:
                        chương trình chính đang chạy (TFx đang bằng 0), vì 1 lý do nào đó TFx bằng 1. VDK sẽ hoàn tất lệnh đang làm, nạp địa chỉ lệnh tiếp theo vào PC rồi sau đó mới nhảy tới trình phục vụ ngắt. Trong thời gian làm trình phục vụ ngắt ( giả sử chỉ là các lệnh đơn giản ko có lệnh nhảy) VDK chỉ thoát khỏi trình phục vụ ngắ, khi gặp phải lệnh RETI thôi chứ ngoài ra ko có lệnh nào ( ngoài lệnh nhảy) làm cho nó thoát khỏi trình phục vụ ngắt.
                        Bạn nên viết 1 số chương trình nhỏ và dùng phần mềm mô phỏng quá trình thực thi lệnh để hiểu rõ hơn
                        vấn đề 1: có nhất thiết phải thiết lập tmod không bác,bác có thể giải thích kĩ hơn vấn đề này không,theo em cái tmod chỉ dùng để trễ time,hoặc đếm xung từ ngoài hay chỉ dùng để tạo xung thôi chứ.nó có các chế độ # nhau là để tạo khoảng time dài hay ngắn hay có tự động load lại không thôi chứ,hay trong các cach thiết lập chế độ đó nó có nhiều tính năng # mà em đọc mãi không rõ lắm.
                        còn ý của em là đang muốn nó xảy ra ngắt luôn khi gặp lệnh tràn ở một đoạn chương trình chính nào đó: setb tr1 ; nhảy đến chương trình ngắt
                        vấn đề 2: VDK sẽ hoàn tất lệnh đang làm, nạp địa chỉ lệnh tiếp theo vào PC rồi sau đó mới nhảy tới trình phục vụ ngắtnghĩa là sao hay chỉ đơn thuần là nó sẽ thực hiện nạp các địa chỉ, các giá trị vào PC trước khi gặp lệnh setb tf1 mà em thấy đó là điều đương nhiên,hay ý của bác là khi gặp lệnh tràn rồi setb tf1 rồi mà nó còn thực hiện cố nối mấy lệnh kế tiếp sau đó mới nhảy đến chương trình ngắt.
                        vấn đề nữa là:
                        reti là lệnh kết thúc chương trình ngắt,khi gạp lệnh này ngoài tác dụng như ret nó còn có tác dụng tắt tất cả các cờ ngắt đã được dựng lên liên quan tới nó(các cờ thuộc ngắt đó)để trở về chương trình chính.đương nhiên lệnh này để ở cuối chương trình ngắt
                        IE là khai báo ngắt
                        TRx là cho phép ngắt time hoạt động
                        còn TFx= 1 thì xảy ra ngắt
                        nhưng vấn đề của em thắc mắc là khi đang xảy ra ngắt (VDK đang hoạt động trong chương trình ngắt)thì gặp lệnh nhảy ra ngoài chương trình ngắt để kiểm tra lại cờ ngắt TRx.nếu cờ ngắt đó =0 (tr=0 ) thì nó có kết thúc ngắt không hay vẫn quay về thực hiện nối chương trình ngắt.hay không quay về nhưng bị treo chip.
                        tại vì chương trình của em nó dài quá sợ bác không chuyên tâm về vấn đề này nên em chỉ hỏi để biết cách làm thôi
                        giả sử : ct
                        main:

                        ........
                        mov ie.#88h
                        setb TR1
                        setb TF1 ; xảy ra ngắt
                        ........
                        kt: jnb p2.0,chương trình ngắt
                        clr TR1
                        ..............
                        jmp main
                        chương trinh ngat:
                        .......
                        JMP kt
                        .......
                        reti
                        mà nếu nó không nhảy đến ngắt nữa thì pc nó vẫn lưu giu trang thái của các cờ ngắt đúng không bác vì nó chưa gặp lệnh reti để xóa các cờ ngắt đã dựng.
                        Last edited by toan258; 12-10-2011, 16:22.
                        đùa chứ tớ hơi ngu...thông cảm nha..heee...

                        Comment


                        • #13
                          TMOD là thanh ghi chọn chế độ hoạt động của 2 timer (mặc định cả hai chạy ở chế độ 0) nếu bạn muốn chạy nó ở chế độ 1 ( hoặc chế độ 2 hoặc chế độ đếm )thì bắt buột phải nạp giá trị cho nó.
                          Dấu # để chỉ việc ghi 1 giá trị vào 1 thanh ghi.

                          Vấn đề 2: bạn nên đọc phần nói về 12 xung/1 chu kì máy bạn sẽ thấy mỗi 1 xung VDK lại có 1 chuyện để làm.
                          Về vụ PC nó chỉ : giả sử nó đang thực hiện 1 lệnh 2 chu kì máy (MC), đang trong MC đầu tiên nó phát hiện cờ TFx được SET lên 1 nó sẽ không lặp tức nhảy tới thì ngắt mà nó sẽ làm cho hết MC thứ 2 của lệnh 2 MC, thì VDK sẽ cất địa chỉ của lệnh tiếp theo vào PC rồi mới nhảy đi.

                          TRx là BIT cho phép timer chạy. BIT cho phép timer ngắt là BIT ETx
                          Khi bạn phân biệt đc 2 BIT này rồi có gì thắc mắc nữa thì hỏi.

                          Comment


                          • #14
                            Nguyên văn bởi toan258 Xem bài viết
                            bác này củ chuối quá.em đã nói rõ là dùng time1 rồi mà bác còn bảo nhầm j nữa.nhưng cũng rất cám ơn tinh thần của bác.quyển của nguyễn tăng cường đó em đọc cũng nát rồi nhưng kinh nghiệm ít nên chưa lĩnh hội dc hết,nhiều vấn đề vẫn không hiểu..
                            mình cũng mới học về 8051. mình khuyên bạn nên đọc kĩ những chỗ sau:
                            8051 có 6 loại ngắt gồm: 2 ngắt timer (đối với 89s52 thì có thêm ngắt timer2) , 2 ngắt ngoài ứng với các chân P3.2 và P3.3 và 1 ngắt nối tiếp
                            điều khiển và chọn chế độ cho timer gồm 2 thanh ghi TCON và TMOD
                            đối với ngắt thì có thanh ghi cho phép ngắt IE và thanh ghi ưu tiên ngắt IP

                            Comment


                            • #15
                              Nguyên văn bởi toan258 Xem bài viết
                              vấn đề 1: có nhất thiết phải thiết lập tmod không bác,bác có thể giải thích kĩ hơn vấn đề này không,theo em cái tmod chỉ dùng để trễ time,hoặc đếm xung từ ngoài hay chỉ dùng để tạo xung thôi chứ.nó có các chế độ # nhau là để tạo khoảng time dài hay ngắn hay có tự động load lại không thôi chứ,hay trong các cach thiết lập chế độ đó nó có nhiều tính năng # mà em đọc mãi không rõ lắm.
                              còn ý của em là đang muốn nó xảy ra ngắt luôn khi gặp lệnh tràn ở một đoạn chương trình chính nào đó: setb tr1 ; nhảy đến chương trình ngắt
                              timer 0 và timer 1 của 8051 có 3 chế độ hoạt động (mode 1, mode2 và mode3). thanh ghi tmod sẽ quyết định timer chạy ở chế độ nào. do đó khi khởi tạo timer bắt buộc phải có. (chi tiết về 3 chế độ bạn đọc tài liệu nhé)
                              Nguyên văn bởi toan258 Xem bài viết
                              vấn đề 2: VDK sẽ hoàn tất lệnh đang làm, nạp địa chỉ lệnh tiếp theo vào PC rồi sau đó mới nhảy tới trình phục vụ ngắtnghĩa là sao hay chỉ đơn thuần là nó sẽ thực hiện nạp các địa ch
                              - bạn hiểu đơn giản là khi có ngắt nó sẽ dừng mọi chương trình đang chạy. lưu các giá trị và địa chỉ các biến , địa chỉ câu lệnh nó đang chạy ngay trước khi xảy ra ngắt vào bộ nhớ và thực hiện chương trình ngắt. sau khi thực hiện xong ngắt nó sẽ lôi các giá trị được lưu ra và chạy tiếp từ câu lệnh ngay trước khi xảy ra ngắt.
                              Nguyên văn bởi toan258 Xem bài viết
                              IE là khai báo ngắt
                              TRx là cho phép ngắt time hoạt động
                              còn TFx= 1 thì xảy ra ngắt
                              có lẽ bạn hiểu nhầm:
                              - IE là thanh ghi cho phép ngắt. gồm 8 bit. mỗi bit sẽ quyết định những ngắt nào được phép xảy ra trong chương trình. ( ví dụ chương trình của bạn để IE=0 kể cả khi TF0=1 thì vẫn ko thể xảy ra ngắt)
                              - TR chỉ đơn giản là cho phép timer chạy, sau khi bạn nạp giá trị vào timer xong phải set bit tr lên =1 thì timer mới bắt đầu chạy
                              - TF là cờ ngắt của timer. khi timer tràn (trong chế độ đếm thời gian) thì cờ TF1 sẽ được set lên =1 báo hiệu đã thỏa mãn điều kiện để ngắt timer. nếu lúc này thanh ghi IE của bạn được cấu hình cho phép ngắt timer thì sẽ có ngắt xảy ra ( lưu ý nếu IE ko cho phép ngắt thì ngắt vẫn ko xảy ra)

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X