Thông báo

Collapse
No announcement yet.

5 nút nhấn điều khiển 5 hiệu ứng (không dùng ngắt thì làm sao ?)

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

  • 5 nút nhấn điều khiển 5 hiệu ứng (không dùng ngắt thì làm sao ?)

    Mình dùng 89S52, kết nối 5 nút nhấn để đk 8 led với 5 hiệu ứng khác nhau. Yêu cầu là khi bấm nút thì sẽ chuyển hiệu ứng ngay lập tức.

    Ban đầu mình nghĩ đến ngắt, nhưng 89S52 chỉ có 2 nguồn ngắt ngoài & 1 ngắt cứng (reset) để làm cho 3 nút nhấn, vẫn còn thiếu 2 nút nhấn. Với lại, sử dụng ngắt vẫn không đảm bảo chạy đúng, và phạm vi chương trình ngắt không cho phép viết dài dòng.

    Giờ không dùng ngắt thì làm sao để khi bấm nút thì nó chuyển hiệu ứng ngay lập tức. Không lẽ cứ mỗi đoạn lại phải kiểm tra nút nhấn lại.?

  • #2
    Sao lại phải ngắt ở đây, bạn cứ kiểm tra 5 phím liên tục, phím nào ấn thì chuyển hiệu ứng. Trong khi gọi chương trình con chạy hiệu ứng nào đó thì bạn cũng phải kiểm tra xem có 1 trong 5 phím được ấn hay không, nếu không thì tiếp tục thực hiện hiệu ứng đó, có nút ấn thì quay về chương trình chính, xét nút đang được ấn và gọi chương trình con tương ứng với nút ấn đó!
    Do tốc độ vi điều khiển rất nhanh nên bạn sẽ có cảm giác ngay tức thời (như bạn mong muốn)!

    Comment


    • #3
      Nguyên văn bởi natra2k2 Xem bài viết
      Sao lại phải ngắt ở đây, bạn cứ kiểm tra 5 phím liên tục, phím nào ấn thì chuyển hiệu ứng. Trong khi gọi chương trình con chạy hiệu ứng nào đó thì bạn cũng phải kiểm tra xem có 1 trong 5 phím được ấn hay không, nếu không thì tiếp tục thực hiện hiệu ứng đó, có nút ấn thì quay về chương trình chính, xét nút đang được ấn và gọi chương trình con tương ứng với nút ấn đó!
      Do tốc độ vi điều khiển rất nhanh nên bạn sẽ có cảm giác ngay tức thời (như bạn mong muốn)!
      Quan trọng là chỗ in đậm. Cái hiệu ứng viết bằng ASM mà cứ mỗi chút lại phải kiểm tra nút nhấn 1 lần thì rất mất công, mà mình kiểm tra tới 5 nút nhấn lận. Mỗi cái hiệu ứng cũng viết cả đống lệnh nó mới chạy, chẳng hạn như hiệu ứng sáng dần, ai viết ASM nhiều chắc biết điều này. Vấn đề là mình muốn giảm việc kiểm tra phím lại, vì code cho hiệu ứng khá dài..

      Comment


      • #4
        Ở 89s52 cũng có chế độ chạy một lúc nhiều trương trình. Đại loại là bạn lập trình theo cấu trúc trương trình con. Mỗi chương trình thực hiện một công việc. Chương trình chính chỉ có nhiệm vụ duy nhất là gọi chương trình con. Mình quên mất cái tên chuyên ngành của nó rồi. Bạn tìm hiểu kỹ lại đi. Nếu không được thì mình sẽ lục lại tài liệu và viết lên đây tiếp.
        Nhà phân phối, đại lý bán biến tần,PLC,HMI,AC Servo... Delta

        Mr.Quỳnh 0978706839

        Comment


        • #5
          thứ nhất là bạn nên sử dụng chương trình con quynhnb nói. đó là điều cần thiết để giúp bạn dễ lập trình hơn. thứ hai là việc kiểm tra nút nhấn bạn chỉ cần để trong chương trình con delay là đủ khi phát hiện nút nhấn thì chuyển đến chương trình con cần thực hiện. và mỗi chương trình con phải đọc lập với nhau. trong chương trình con lại gọi ham delay vậy là ok. việc kiểm tra nút nhấn liên tục được kiểm tra và thực thi chương trình rất nhanh

          Comment


          • #6
            Sao lại không dùng ngắt nhỉ? Nếu các nút nhấn có sự liên quan đến nhau thì chỉ cần một ngắt là được.
            Mình VD thế này cho bạn dể hiểu nha. Với mạch đo nhiệt độ, cần điều chỉnh nhiệt độ cài đặt để báo động thì cần 4 nút (mình làm vậy) TĂNG, GIẢM, OK, SET. Nút SET sử dụng ngắt, khi nhấn nút SET thì chương trình nhảy vào ngắt thực hiện hàm quét phím thực hiện tăng giảm nhiệt độ đặt.OK đêt thoát.
            Với các mạch khác cũng vậy, bạn tùy biến tí là được thôi mà.
            Các pác góp ý thêm nha
            Cuộc đời như bánh omi, không biết rồi sẽ về đâu?

            Comment


            • #7
              nếu không dúng ngắt thì tất nhiên bạn phỉa dùng cách kiểm tra nút nhấn liên tục. Mỗi trạng thái kiểm tra một lần như thế độ đáp ứng của phím sẽ nhanh hơn, Bấm phái ăn ngay

              Comment


              • #8
                hê, mình không nhớ lệnh asm lắm vì mấy năm không có dùng tới, mình nghĩ là như thế này.

                org

                ..
                ..
                chuongtrinh:
                call kiemtraphim
                sjmp$

                kiemtraphim:
                kiemtra0: jb P1.0,kiemtra1
                call ct1
                jmp thoat
                kiemtra1: jb P1.1,kiemtra2
                call ct2
                jmp thoat
                kiemtra2: jb P1.2,kiemtra3
                call ct3
                jmp thoat
                kiemtra3: jb P1.3,kiemtra4
                call ct4
                jmp thoat
                kiemtra4: jb P1.4,kiemtra5
                call ct5
                jmp thoat
                thoat: kiemtraphim

                ct1:
                ..
                ..
                ret

                ct2:
                ..
                ..
                ret
                ..
                ...
                ....
                .....
                ...
                ..

                Hê, viết trên này nên hơi khó quan sát, mình nghĩ là thuật toán như vậy, hi.
                Thân,
                Last edited by vuxuanloi; 10-11-2010, 18:41.
                Vũ xuân Lợi
                YM!:

                Comment


                • #9
                  Không dùng ngắt thì chỉ còn cách là quét phím thôi bạn à, với lại sử dụng theo cấu trúc gọi chương trình con của vuxuanloi là hợp lí nhất.
                  À mà ở nhãn thoát phải là nhảy lên chương trình chính chứ theo như trên thì ct1 sẽ "bị" gọi cuối cùng cho dù không có tác động phím nhấn.
                  "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
                  Lê lết, lay lất sống qua ngày! >:)

                  Comment


                  • #10
                    Nguyên văn bởi BabyKid Xem bài viết
                    Không dùng ngắt thì chỉ còn cách là quét phím thôi bạn à, với lại sử dụng theo cấu trúc gọi chương trình con của vuxuanloi là hợp lí nhất.
                    À mà ở nhãn thoát phải là nhảy lên chương trình chính chứ theo như trên thì ct1 sẽ "bị" gọi cuối cùng cho dù không có tác động phím nhấn.
                    hi, bạn thay kiemtra5 thành kiemtra0 nha,
                    Còn ở nhãn thoát thì lệnh nhảy lên ct chính với nhảy lên nhãn kiemtraphim như nhau bạn à, vì nó sẽ vẫn nhảy xuống nhãn kiemtraphim thôi, mình dùng lện jb là để kiểm tra xem có sự kiện nhấn không, nếu không có thì nó nhẩy sang nhãn tiếp theo bạn à, còn việc nó đang ở ct con nào thì vẫn tiếp tục thực hiện ct đó đến khi có sự kiện nhấn phím khác, lưu ý khi người dùng sử dụng trễ nha, hi.
                    Thân!
                    Thân,
                    Vũ xuân Lợi
                    YM!:

                    Comment


                    • #11
                      Không, mình hiểu ý chương trình của bạn, mình muốn nhắc bạn chủ topic thôi. Do trong cấu trúc của bạn thiếu lệnh jump về nhãn kiemtraphim, dễ gây hiểu lầm cho các bạn mới vào lắm. Với lại mình nói thêm lệnh quay về chương trình chính vì có thể trong chương trình chính còn thực hiện việc khác nữa nếu như không có phím nào được nhấn.
                      "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
                      Lê lết, lay lất sống qua ngày! >:)

                      Comment


                      • #12
                        Nguyên văn bởi vuxuanloi Xem bài viết
                        hê, mình không nhớ lệnh asm lắm vì mấy năm không có dùng tới, mình nghĩ là như thế này.

                        org

                        ..
                        ..
                        chuongtrinh:
                        call kiemtraphim
                        sjmp$

                        kiemtraphim:
                        kiemtra0: jb P1.0,kiemtra1
                        call ct1
                        jmp thoat
                        kiemtra1: jb P1.1,kiemtra2
                        call ct2
                        jmp thoat
                        kiemtra2: jb P1.2,kiemtra3
                        call ct3
                        jmp thoat
                        kiemtra3: jb P1.3,kiemtra4
                        call ct4
                        jmp thoat
                        kiemtra4: jb P1.4,kiemtra5
                        call ct5
                        jmp thoat
                        thoat: kiemtraphim

                        ct1:
                        ..
                        ..
                        ret

                        ct2:
                        ..
                        ..
                        ret
                        ..
                        ...
                        ....
                        .....
                        ...
                        ..

                        Hê, viết trên này nên hơi khó quan sát, mình nghĩ là thuật toán như vậy, hi.
                        Thân,
                        Nếu viết như vầy thì chương trình con sẽ không được gọi liên tục. Cái mình muốn là chương trình con phải được thực hiện liên tục tới khi có phím nhấn khác được nhấn.

                        Ở đây mình có thể đưa chương trình kiểm tra phím lồng vào chương trình delay. Nhưng, giả sử như VDK đang thực hiện chương trình con 1, gặp nút nhấn, gọi chương trình con 2, vậy địa chỉ lệnh lúc trước khi nhảy sang chương trình con 2 đang thực hiện sẽ được thanh ghi PC ghi lại. Vậy sau khi thực hiện hết chương trình con 2 thì nó sẽ quay lại thực hiện chương trình con 1 thì sao ? Mình không muốn điều này. Với lại, nhảy liên tục vậy thì thanh ghi PC sẽ lộn lên hết, lúc đó thì có ảnh hưởng đến sự hoạt động lâu dài của vdk không ?
                        --> Chính vì vậy mà code của mình không đưa vào chương trình con, mà tất cả đều để nhãn để phân biệt thôi, và có thể nhảy đi nhảy lại bất cứ lúc nào. Vậy nên việc kiểm tra phím cũng chỉ nằm ở cuối chương trình hiệu ứng.

                        ------
                        Ở đây, VDK chỉ làm 1 trong 5 hiệu ứng, và hiệu ứng đó được thực hiện liên tục liên tục đến khi nào có phím mới được nhấn. Nếu như chương trình 3 đang thực hiện & phím 3 đang được nhấn, thì chương trình 3 vẫn thực hiện tiếp, chứ chương trình 3 không thực hiện lại từ đầu. Và cái mình muốn là sự tức thời, xảy ra khi có phím mới được ấn, chứ không phải sự tức thời giả (do VDK thực thi câu lệnh rất nhanh).
                        Last edited by TheHouse; 11-11-2010, 06:41.

                        Comment


                        • #13
                          Vì yêu cầu tức thời, nên mình đã thử 1 cách lập trình khác là dùng ngắt để ghi dữ liệu nút nhấn mới nhất lên thanh ghi R5. Rồi chỉ việc kiểm tra R5 là biết phím được nhấn gần đây nhất là phím nào, so sánh với chương trình đang thực hiện là biết ngay. Việc kiểm tra thực hiện tương tự là lồng vào chương trình delay. Nhưng khổ nỗi, phần cứng của mình đã cố định 5 phím nhấn rồi. Nên khó mà thay lại được.

                          Comment


                          • #14
                            Hình như bạn định dùng ngắt ngoài nên mới sửa phần cứng.
                            Mình không rõ về ASM mấy. Bạn dùng thử một ngắt time, để kiểm tra định kì tất cả nút nhấn và cũng dùng thanh ghi R5 để lưu lại ct gọi như của bạn nói, ở chương trình chính thì so sánh thanh ghi rồi nhảy để gọi ct con đó được mà.
                            Còn phần mình viết bài trên không phải là chương trình con không thực hiện liên tục mà trong chương trình con bạn có thể xử lí một chút là: trong chương trình con của bạn nồng thêm kiểm tra phím 4 phím còn lại vào đầu mỗi chương trình con. nếu có sự kiện nhấn phím thì thoát và gọi ct đó, nếu không có thì thực hiện liên tục chương trình hiện hành.
                            Vũ xuân Lợi
                            YM!:

                            Comment


                            • #15
                              các bác cho e hỏi là khi e nhấn cùng lúc 2 nút ấn thì phải làm như thế nào để nó ra 1 trạng thái khác khi e nhấn từng nút 1 ạ ?

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X