Thông báo

Collapse
No announcement yet.

tutorial cho HTPIC

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

  • #16
    quả thực mình nghỉ đây là điều rất quan trọng, trước đây khi mình có làm một số công việc liên quan đến ngắt, và không hiểu tại sao chương trình của mình lúc sai lúc đúng và sau đó mình phát hiện ra điều mà bạn đã đề cập đến. Nói chung tối ưu chương trình là giải pháp lựa chọn chung, đối với các công việc khác nhau là rất khác nhau.
    |

    Comment


    • #17
      Bạn nói ngắt giải quyết được mọi vấn đề liên quan đến delay là hoàn toàn đúng, bạn cũng đã đúng khi phát hiện ra khi timer hoạt động không làm mất thời gian xử lý của vxl, nhưng điều quan trọng mà mình nghĩ là ứng dụng các lợi thế đó cho công việc của mình cho tối ưu, trước đây khi bắt đầu làm về vxl mình ít khi dùng đến ngắt nói chung, nhưng khi hiểu được một chút về ngắt, hình như trong công việc nào của mình cũng có đụng đến ngắt. mình lấy một công việc mọi người vẫn hay sử dụng:khi muốn phát hiện một phím nào đó của bàn phím tác động thay vì phương pháp quét vòng ta có thể sử dụng ngắt, còn đối với ngắt tràn timer chẳng hạn trong công việc mà mình đang làm mình lấy thời gian này để cập nhật các tham số và như vậy trong chương trình của mình mình không cần phải quan tâm đến thời gian ấy. có thể là ý kiến chủ quan của riêng mình nhưng nếu học về vxl nói chung nếu không hiểu về ngắt là một thiếu sót, còn đối với pic ngoài điều đó còn một điều thú vị nữa là PWM.
      |

      Comment


      • #18
        Nguyên văn bởi minhpic1
        còn đối với pic ngoài điều đó còn một điều thú vị nữa là PWM.
        Thú vị như thế nào anh nhỉ? hihi...chỉ có PWM ko thôi à?

        Comment


        • #19
          Tại sao lại có ngắt trong ngắt nhỉ. Với MCU loại nhỏ còn không thể thực hiện ưu tiên được nữa cơ mà ( dừng ngắt A để chạy ngắt B chẳng hạn). Bạn nào cho ví dụ về nó đi. Phải là tài liệu của nhà SX chip nhé.
          Làm sao mà trong INT0 lại chạy INT0 được. Bạn có biết khi đang thực hiện INT0 thì bộ điều khiển ngắt của MCU hoạt động như thế nào không? Xem lại chỗ này nhé.
          Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

          Biến tần
          Máy giặt
          Lò vi sóng
          Bếp từ.
          Tủ lạnh.
          Điều hòa

          Comment


          • #20
            Nguyên văn bởi MinhHa
            Tại sao lại có ngắt trong ngắt nhỉ. Với MCU loại nhỏ còn không thể thực hiện ưu tiên được nữa cơ mà ( dừng ngắt A để chạy ngắt B chẳng hạn). Bạn nào cho ví dụ về nó đi. Phải là tài liệu của nhà SX chip nhé.
            Làm sao mà trong INT0 lại chạy INT0 được. Bạn có biết khi đang thực hiện INT0 thì bộ điều khiển ngắt của MCU hoạt động như thế nào không? Xem lại chỗ này nhé.
            Em có đọc một bài viết về kỹ thuật này của anh BinhAnh viết về ngắt trong ngắt đối với PSoC và PIC16 bên diendandientu.com . Thấy rất khả thi.
            Nhưng em nghi ngờ anh MinhPIC áp dụng kỹ thuật này, nếu ko tuân thủ đúng quy tắc bắt buộc nào đó thì ko thể làm được.
            Chờ bài viết về kỹ thuật ngăt trong ngắt áp dụng họ PIC16 mới này của anh Minhpic.

            Comment


            • #21
              3T xem lại ngắt trong ngắt nhé. Không thể có ngắt lồng được.
              Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

              Biến tần
              Máy giặt
              Lò vi sóng
              Bếp từ.
              Tủ lạnh.
              Điều hòa

              Comment


              • #22
                QUY TRÌNH SỬ DỤNG NGẮT
                LÝ THUẾT
                Khi có một ngắt yêu cầu thì vi điều khiển phải phục vụ thì VDK sẽ tạm ngưng công việc hiện tại, hoàn thành lệnh thời ngay tức khắc để nhày vào chương trình phục vụ ngắt ISR. Khi đó bộ đếm chương trình PC sẽ được đẩy vào ngăn xếp STACK và đồng bit cho phép ngắt toàn cục GIE sẽ bị xóa về 0. chương trình rẽ nhánh đến địa chỉ vectow ngắt, tại đây VDK sẽ thực hiện các yêu cầu mà ngắt đòi hỏi.
                Sau khi thực hiện xong thì VDK sẽ tự set bit GIE=1 trở lại, và ngăn xếp sẽ trả lại địa chỉ lệnh cho bộ đếm chương trình PC, để VDK quya lại thực hiện tiếp công việc đã bỏ dở, tức là nó sẽ thực tiếp địa chỉ lệnh kế tiếp.
                Tuy nhiên chúng ta cũng cần lưu ý rằng "Cờ ngắt" sẽ không được tự động xỏa bởi phần cứng mà nếu muốn xóa thì phải xóa bằng phần mềm.
                NHẬN XÉT
                Như vậy bit GIE sẽ tự xóa và set bởi phần cứng nhưng cờ ngắt sẽ không tự xóa được và vấn đề theo tôi cần quan tâm là: Có thể thực hiện nghắt lồng trong ngắt với điều kiện "Cờ ngắt" phải được xóa trước trước khi bit GIE được xóa bởi phần mềm. Nếu không sau khi chúng ta xóa bit GIE trong khi cờ ngắt chưa xóa thì đó có thể là một nguyên nhân sinh ra ngắt--> việc làm này cũng trở nên vô nghĩa và có thể VDK sẽ bị treo vì một chuỗi ngắt vô tận sẽ được thực hiện mãi.
                Last edited by MicroDuyphi; 15-03-2006, 16:33.

                Comment


                • #23
                  To anh MinhHa:
                  Em ko cần phải xem lại đâu, mà kỹ thuật đó rất khả thi, trong hàm ngắt, bật cờ GIE theo một luật logic nhất định.
                  To anh DuyPhi:
                  Lý thuyết chung như anh nói về ngắt thì ko sai về đoạn đầu(datasheet của PIC có nói rõ, đấy là vấn đề cơ bản thôi), nhưng ...hihi... đi xa hơn một tý thì kỹ thuật về ngắt trong ngắt anh đưa ra ở trên là sai:
                  Trích nguyên văn MicroDuyPhi
                  ISR
                  1-Kiểm tra ngắt ngoài
                  2-Kiểm tra ngắt TIMER
                  3-Thực thi trình phục vụ ngắt ngoài nếu có
                  - xóa cờ & set GIE
                  4-Thực thi trình phục vụ ngắt TIMER nếu có
                  - xóa cờ & set GIE
                  5-Thoát ngắt
                  Đơn cử ví dụ:
                  1-Ngắt ngoài xảy ra liên tục--->kết quả sẽ treo PIC.
                  2-Ngắt ngoài và ngắt TIMER liên tiếp thay phiên xảy ra--->cũng treo PIC luôn.
                  Hihi....

                  Comment


                  • #24
                    Ví dụ như:Làm cái đồng hồ đếm giây:
                    Dùng ngắt timer0 tạo 1s, và
                    Dùng ngắt ngoài để chỉnh giời phút
                    Thế nào cô bạn THÁI, có bị treo không?

                    Comment


                    • #25
                      Nói chung, anh rất bảo thủ.
                      Em chỉ ra cái sai của giải thuật anh đưa ra, sẽ bị sai ở một số trường hợp, anh lại bảo là "có những trường hợp còn lại sẽ ko sai". Hihi..... Em cũng chịu cái tính cố cãi của anh...Hihi...

                      Comment


                      • #26
                        3T xem lại nhé vấn đề là nếu 2 ngắt giống nhau thì không thể. Còn khác nhau thì các MPU đã hỗ trợ rồi. Ví dụ như 8088 chẳng hạn đang chạy ngắt 13 để ghi đĩa nhưng nếu gặp phép chía cho 0 lập tức nó thực hiện ngắt ưu tiên này trước sau đó mới quay lại int13.

                        hungtbinh: Ngắt trong ngắt
                        minh5sao: OK
                        phungtbinh: Có thể làm được bằng phần mềm đó anh ạ
                        minh5sao: Nhung neu chua ket thuc ngat
                        phungtbinh: http://dientuvietnam.net/forums/show...0&page=3&pp=10
                        phungtbinh: được chứ
                        phungtbinh: Anh xem cái bài 29 em viết đó
                        phungtbinh: ưu tiên ngắt
                        phungtbinh: và ngắt trong ngắt
                        phungtbinh: Em định viết appnote cho Microchip và Cypress về ý tưởng này
                        phungtbinh: Nhưng nó ko trả tiền
                        phungtbinh: Nên em ko viết
                        phungtbinh: He he
                        minh5sao: khong phai y minh nhu vay. Nhu vay thi kiem soat no se rat phien phuc. Boi minh tu ket thuc ngat
                        minh5sao: Se co luc trung nhau thanh vong lap lai
                        phungtbinh: Nhưng với thuật toán em đưa ra
                        phungtbinh: thì ko sao
                        phungtbinh: Nhưng
                        phungtbinh: Tất nhiên nó giới hạn
                        phungtbinh: ưu tiên
                        minh5sao: goi de qui nhu vay thi phai kiem soat no rat met
                        phungtbinh: Ko
                        phungtbinh: đơn giản mà anh
                        phungtbinh: Ngắt_1()
                        {
                        //Chèn mã lệnh: disable ngắt 1,2,3 tại đây
                        GIE=1;
                        //Chèn mã lệnh trình phục vụ ngắt 1
                        }

                        Ngắt_2()
                        {
                        //Chèn mã lệnh: disable ngắt 2,3 tại đây
                        GIE=1;
                        //Chèn mã lệnh trình phục vụ ngắt 2
                        }

                        Ngắt_3()
                        {
                        //Chèn mã lệnh: disable ngắt 3 tại đây
                        GIE=1;
                        //Chèn mã lệnh trình phục vụ ngắt 3
                        }

                        phungtbinh: Áp dụng đc cho PIC16
                        phungtbinh: Ngắt 1,2,3 theo thứ tự ưu tiên
                        phungtbinh: 1 cao nhất
                        phungtbinh: 3 thấp nhất
                        phungtbinh: Khi vào ngắt thấp hơn, nó sẽ có thể nhảy vào ngắt mức cao hơn
                        phungtbinh: Ví dụ: ngắt 3 đang chạy, thì nó sẽ nhảy vào ngắt 1 hoặc 2
                        phungtbinh: Khi ngắt 2 chạy thì nếu ngắt 1 xuất hiện nó sẽ nhảy vào ngắt 1
                        minh5sao: nhuwng minh phai biet chac thoi gian thuc hien ngat do
                        phungtbinh: Đây là kỹ thuật chung
                        phungtbinh: thôi
                        phungtbinh: Chứ bài toán cụ thể thì tuỳ
                        phungtbinh: Ví dụ: ngắt 2 đang làm thực hiện giang giở
                        phungtbinh: Thì nếu co ngắt 1, nó sẽ lại nhay vảo ngắt 1 ngay
                        phungtbinh: gần như tức thì
                        minh5sao: nhung co van de la dang thuc hien ngat 1. lai nhay vao ngat 1 tiep thi khi ket thuc no quay ra nhu the nao
                        phungtbinh: À
                        phungtbinh: Nếu ngắt 1 đang thực thi, ngắt 1 lại xuất hiện
                        minh5sao: trong khi do no push 2 lan PC vao stack
                        phungtbinh: thì nó phải làm hết ngắt 1 hiện tại đã
                        phungtbinh: rồi mới nhảy ra
                        phungtbinh: làm tiếp ngắt 1 lần 2
                        phungtbinh: Vì quan điểm
                        minh5sao: nhu vay thi khong phai long nhau
                        phungtbinh: Lồng nhau
                        minh5sao: OK
                        phungtbinh: Nhưng khác nguồn ngắt
                        phungtbinh: 3 có thể lồng vào 2, 2 có thể lồng vào 1
                        minh5sao: nhung chi co 1 lenh reti thoát ngắt. Nhưng có 2 PC trong stack
                        minh5sao: Nếu các ngắt lồng nhau nhưng khác nhau thì OK. Các vi xử lý như 8088 đều hợt động được. theo mức ưu tiên có thể có 256 ngắt lồng nhau từ thấp lên cao
                        minh5sao: nhưng cùng 1 ngăt thì không lồng nhau được
                        phungtbinh: Vâng
                        phungtbinh: nếu cùng thì ko đc
                        minh5sao: Vấn đề mình hỏi là có 1 bạn cho 2 ngắt INT1 lồng nhau cơ
                        phungtbinh: Vậy thì em chưa nghĩ ra
                        phungtbinh: Lúc nào rỗi thì nghĩ thêm
                        phungtbinh: Vì PIC
                        minh5sao: nó sẽ thành đệ qui ngay kể cả mỗi ngắt chỉ vào xong quay ra ngay không làm gì vì còn 1 thanh ghi chưa POP ra. Tất nhiên nếu POP ra thì có thể được nhưng rất khó kiểm soát
                        phungtbinh: Phần cứng nó ko support ngắt trong ngắt
                        phungtbinh: PIC16
                        phungtbinh: Vâng
                        Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

                        Biến tần
                        Máy giặt
                        Lò vi sóng
                        Bếp từ.
                        Tủ lạnh.
                        Điều hòa

                        Comment


                        • #27
                          Các bạn thử làm ngắt INT0 trong ngắt INT0 xem. Vẫn có cách nhưng không bài bản cho lắm. Cần kiểm soát được chương trình ngắt thì có thể được nhưng không an toàn khi thời gian thực hiện CODE của ngắt thay đổi. Thực tế thì chẳng khi nào dùng kiểu này, nhưng đây là 1 câu hỏi về PIC.
                          Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

                          Biến tần
                          Máy giặt
                          Lò vi sóng
                          Bếp từ.
                          Tủ lạnh.
                          Điều hòa

                          Comment


                          • #28
                            Đúng vậy, giải thuật của anh đưa ra chỉ thực hiện ở các ngắt khác số hiệu lồng nhau(theo mức ưu tiên) chứ ko thưc hiện các ngắt cùng tên.
                            Ví dụ: giả sử có 3 ngắt:
                            Ngắt 1: ưu tiên nhất
                            Ngắt 2: bình thường
                            Ngắt 3: kém ưu tiên nhất.
                            Vậy với giải thuật trên, đang thực hiện ngắt i, nếu thì nếu ngắt j ưu tiên hơn(j<i) xuất hiện, nó sẽ nhảy vào ngắt j . Vậy là có thể ngắt lồng nhau.
                            Nhưng j=i hoặc j>i thì nó sẽ thực hiện ngắt i hiện tại đã.

                            3T kéo được anh MH vào đây tranh luận với anh cả buổi chiều đấy!!!

                            Comment


                            • #29
                              Nguyên văn bởi BinhAnh
                              Đúng vậy, giải thuật của anh đưa ra chỉ thực hiện ở các ngắt khác số hiệu lồng nhau(theo mức ưu tiên) chứ ko thưc hiện các ngắt cùng tên.
                              Nói vậy không có cách nào để có thể thực hiện ngắt cùng tên lồng nhau được sao anh?
                              Chẳn hạn có thể dùng thêm 1 bỉ cờ!
                              Nếu có ngắt xảy ra ta set bit cờ =1, nếu trong lúc đang xử lý ngắt đó chưa xong mà cũng chính ngắt đó lại xãy ra thì chúng ta sẽ dựa vào bỉt này mà biết được rằng trước đó có một ngắt cùng tên đang thực thi.

                              Comment


                              • #30
                                Nguyên văn bởi MicroDuyphi
                                Nói vậy không có cách nào để có thể thực hiện ngắt cùng tên lồng nhau được sao anh?
                                Chẳn hạn có thể dùng thêm 1 bỉ cờ!
                                Nếu có ngắt xảy ra ta set bit cờ =1, nếu trong lúc đang xử lý ngắt đó chưa xong mà cũng chính ngắt đó lại xãy ra thì chúng ta sẽ dựa vào bỉt này mà biết được rằng trước đó có một ngắt cùng tên đang thực thi.
                                Có chứ, cách của mình nói ở các bài hướng dẫn trước là nói về ưu tiên ngắt và lồng các ngắt mức ưu tiên cao hơn. Còn ngắt trong ngắt cùng tên vẫn có thể làm được, ko khó đâu

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X