Thông báo

Collapse
No announcement yet.

Hỏi Cách Ngăt Trong 89s

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

  • Hỏi Cách Ngăt Trong 89s

    Mình viết chương trình hiển thị led bật tắt lần lượt từ p2.0--> p2.3
    mối con led lấy tín hiệu từ cổng p2.x và viết dưới dạng chương trình con
    ,khi bình thường thì led sáng lần lượt ,mình muốn sử dụng ngắt để điều khiển led sáng theo ý muốn.Nhưng mình ko thạo ngắt nhờ mọi người giúp chỉ giúp.
    thanks.


    $mod851
    org 0000h
    ljmp main
    ; ---chuong trinh ngat
    org 0013h
    inc R4
    CMP R4,1
    JE LED1
    LED1:
    SETB P2.0
    ???????
    RETI
    org 0030h
    main:
    mov IE,#10000100b
    mov R4,#0

    led:
    mov p2,#0
    lcall led1
    lcall led2
    lcall led3
    lcall led4
    sjmp led

    ;-------cac chuong trinh con
    led1:
    setb p2.0 ;bat led1
    lcall delay
    clr p2.0
    ret
    led2:
    setb p2.1 ;bat led2
    lcall delay
    clr p2.1
    ret
    led3:
    setb p2.2 ;bat led3
    lcall delay
    clr p2.2
    ret
    led4:
    setb p2.3 ;bat led4
    lcall delay
    clr p2.3
    ret
    delay:
    mov R5,#14
    here:
    mov tmod,#01
    mov tl0,#0
    mov th0,#0
    setb tr0
    again: jnb tf0,again
    clr tr0
    clr tf0
    djnz R5,here
    RET
    end

  • #2
    ý bạn có phải là khi có xung kích ở chân ngắt INT1 thì thay đổi trạng thái của LED theo thứ tự phải không?
    Diễn đàn Vi điều khiển:

    Comment


    • #3
      Hi , bạn có thể điều khiển LED bằng ngắt TIMER (ở 8051 có 2 ngắt Timer : Timer0 ,Timer1 , với 4 chế độ hoạt động )

      CÒn nếu nhận tín hiệu điều khiển từ P2.X (mà dùng ngắt) để QUÉT LED --> ta có thể dùng ngắt NGOÀI ( External Interrupt)
      Vì việc khai báo ,sử dụng ngắt ở 8051 là đơn giản ,nhưng khó có thể nói nhanh được ,bạn có thể Tìm Hiểu ở 2 cuốn sách này - VÌ được trình bày rất kĩ ( bạn nghiên cứu trước để có những KIẾN THỨC Cơ bản về NGẮT đã hen)

      1. VI XỬ LÝ 8051 , tác giả HỒ TRUNG MỸ
      2. Xây dựng Hệ Thống với 8051 ,tác giả Tống Văn On
      ( 2 cuốn sách này ,có thể mua ở quầy sách ĐH Bách Khoa TPHCM )

      Khi đã nghiên cứu 1 cách Cơ bản trước ,Hiểu được những bước đầu ,bạn gặp thắc mắc gì ,Đặt câu hỏi ---> Được mọi người Giải Thích --> Sẽ Dễ Hiểu hơn nhiều

      Chúc bạn thành công!
      My department's Website: www4.hcmut.edu.vn/~thietbidien/trangchu

      Motorola-FreeScale's MCU 68HC11 & HCS12X Supporter

      Comment


      • #4
        Nguyên văn bởi hoanglongu Xem bài viết
        Khi đã nghiên cứu 1 cách Cơ bản trước ,Hiểu được những bước đầu ,bạn gặp thắc mắc gì ,Đặt câu hỏi ---> Được mọi người Giải Thích --> Sẽ Dễ Hiểu hơn nhiều
        Đây là cách học rất hiệu quả, mình tán đồng với ý kiến của bạn!
        Nguyên văn bởi hoanglongu Xem bài viết
        1. VI XỬ LÝ 8051 , tác giả HỒ TRUNG MỸ
        2. Xây dựng Hệ Thống với 8051 ,tác giả Tống Văn On
        ( 2 cuốn sách này ,có thể mua ở quầy sách ĐH Bách Khoa TPHCM )
        Cho phép mình bổ sung thêm 2 quyển này nữa nhé:
        3. HỌ VI ĐIỀU KHIỂN 8051 của Tống Văn On
        4. CẤU TRÚC - LẬP TRÌNH - GHÉP NỐI VÀ ỨNG DỤNG VI ĐIỀU KHIỂN (2 tập) của Nguyễn Mạnh Giang
        Nguyên văn bởi truongxun Xem bài viết
        Mình muốn sử dụng ngắt để điều khiển led sáng theo ý muốn. Nhưng mình ko thạo ngắt nhờ mọi người giúp chỉ giúp.
        Không nêu rõ giải thuật muốn thực hiện, dùng ngắt nào (ngắt Ngoài hay ngắt Timer)? Nên làm theo cách bạn hoanglongu đã nêu trên.
        Last edited by trong123; 19-04-2008, 17:13.
        Không TÔI là kẻ phàm phu
        Cái TÔI quá lớn làm ngu muội mình!
        - 0983.886.113

        Comment


        • #5
          đúng là ngắt ngoài ,mình dùng cách tác động vào chân p3.3 để chuyển đến ngắt ,trong ngắt này mỗi lần vào tăng biến đếm R4 lên 1 rồi so sánh để chọn chương trình con thực hiện,nhưng hình như ko dùng lện CMP được( thấy sách asm dùng các lệnh này thay cho case).

          Comment


          • #6
            Nguyên văn bởi truongxun Xem bài viết
            đúng là ngắt ngoài ,mình dùng cách tác động vào chân p3.3 để chuyển đến ngắt ,trong ngắt này mỗi lần vào tăng biến đếm R4 lên 1 rồi so sánh để chọn chương trình con thực hiện,nhưng hình như ko dùng lện CMP được( thấy sách asm dùng các lệnh này thay cho case).
            Hi,như vây bạn đã dùng chương trình ngắt ngoài (External Interrupt).

            Bạn cần có các chú ý sau:
            1. Khai báo chính xác địa chỉ của chương trình ngắt ngoài , chú ý là DÙNG Ngắt cạnh lên ,hay cạnh xuống ,hay sự kiện---> Có cần XÓA cờ NGẮt ( khi hết ngắt )HAY không?
            2. Trong chương trình NGẮT,bạn không nên dùng VÒNG LẶP hay GỌI chương trình con (vì không có "ý nghĩa" -->Chương trình Không TRONG SÁNG)

            3. Cách giải quyết : Mỗi khi có NGĂT xảy ra, bạn dùng 1 biến TẠM (thanh ghi nào đó), Trong chương trình NGẮT ,chỉ Tăng giá trị của BIẾN (thanh ghi ) đó lên 1 (hay bao nhiêu là tùy) ---> THOÁT NGẮT

            SAU ĐÓ Các chương trình con (đặt theo Số ) sẽ được GỌI (và thực hiện) trong chương trình chính,phụ thuộc vào giá trị BIẾN tạm (đã được thay đổi khi có ngắt )

            Chúc bạn thành công!
            My department's Website: www4.hcmut.edu.vn/~thietbidien/trangchu

            Motorola-FreeScale's MCU 68HC11 & HCS12X Supporter

            Comment


            • #7
              Cảm ơn bạn,đã chỉ bảo ,sử dụng ngắt thì hay nhưng thật ko dễ có lẽ mình phải tìm hiểu thêm nhiều.

              Comment


              • #8
                Nguyên văn bởi truongxun Xem bài viết
                Cảm ơn bạn,đã chỉ bảo ,sử dụng ngắt thì hay nhưng thật ko dễ có lẽ mình phải tìm hiểu thêm nhiều.
                Dùng NGẮT không khó lắm đâu bạn ơi ,nếu Nghiên cứu 1 cách Cơ Bản , làm những Ví Dụ nhỏ cho QUEN ---> Làm các chương trình lớn hơn.

                Khi giỏi NGẮT rồi thì mới Lập Trình được cho những Ứng dụng ĐA TÁC VỤ được
                Chúc bạn thành công!
                My department's Website: www4.hcmut.edu.vn/~thietbidien/trangchu

                Motorola-FreeScale's MCU 68HC11 & HCS12X Supporter

                Comment


                • #9
                  Nguyên văn bởi truongxun Xem bài viết
                  Cảm ơn bạn,đã chỉ bảo ,sử dụng ngắt thì hay nhưng thật ko dễ có lẽ mình phải tìm hiểu thêm nhiều.
                  Đây là 1 ví dụ đơn giản, tìm hiểu thêm nhé!
                  Code:
                  ORG 0000H
                  SETB EA ;Cho phép ngắt toàn cục
                  SETB EX0; Cho phép ngắt ngoài 0
                  MOV R0,#00H
                  SJMP MAIN
                  ORG 003H ;Vecto ngắt ngoài 0
                  INC R0
                  RETI ;Kết thúc ngắt ngoài 0
                  ORG 30H ;Chương trình chính
                  MAIN:
                  ...
                  SJMP $
                  Bây giờ thì bạn thấy Ngắt đơn giản hay phức tạp nào?
                  Last edited by trong123; 25-04-2008, 01:20.
                  Không TÔI là kẻ phàm phu
                  Cái TÔI quá lớn làm ngu muội mình!
                  - 0983.886.113

                  Comment


                  • #10
                    thanks các bạn ,mấy hôm ko lên dd

                    Comment


                    • #11
                      AI có tài liệu về ngắt và timer thì làm ơn send qua cho em ở địa chỉ mail :
                      vmt_cntt@yahoo.com

                      vmt thân!
                      ---------------------------------
                      Ai dám nói:
                      1 +1 =2 ^^

                      Comment


                      • #12
                        một đoạn ct sử dụng ngắt
                        THANKS ! MẤY BẠN ĐÃ CHỈ GIÚP ,mình đã sử dụng được ct ngắt, thanks you very much!
                        ******************
                        $mod851
                        ORG 00H ; Bat dau tai ngan nho 0


                        ljmp MAIN
                        org 0013h ; sử dụng ngắt ngoài 1
                        INC R0 ; dùng để chọn chương trình ngắt thực hiện
                        CJNE R0,#00,ngat1

                        LCALL CT1 ;cac chương trinh con để gọi

                        ngat1: CJNE R0,#1,ngat2

                        LCALL CT2
                        ngat2: CJNE R0,#2,ngat3

                        LCALL CT3
                        ngat3: CJNE R0,#3,ngat4
                        LCALL CT4

                        ngat4:
                        reti
                        org 30h

                        ;chuong trinh chinh

                        MAIN:
                        mov R0,#0
                        mov ie,#10000100b
                        MOV R1,#40H

                        ;
                        Last edited by truongxun; 28-04-2008, 16:44.

                        Comment


                        • #13
                          Nguyên văn bởi truongxun Xem bài viết
                          mình viết chương trinh cho bảng quang báo sử dụng chương trình ngắt,khi chưa có đoạn code ngắt này thì chương trình chạy bình thường và có thể RESET qua chân 9 nhưng từ khi có thêm đoạn code ngắt hay bị lỗi mọi người xem hộ mình với. lỗi là chương trình ko chạy chương trình chính mà nó bị nhảy vào ngắt ( đối với mạch thật còn dùng proteus thì vẫn chạy nhưng hơi bị lỗi) một lúc rồi đơ và dũng ko RESET được.
                          THANKS.
                          ******************
                          $mod851
                          ORG 00H ; Bat dau tai ngan nho 0
                          quetcot EQU 30H

                          ljmp MAIN
                          org 0013h ; sử dụng ngắt ngoài 1
                          INC R0 ; dùng để chọn chương trình ngắt thực hiện
                          CJNE R0,#00,ngat1

                          LCALL CT1 ;cac chương trinh con để gọi

                          ngat1: CJNE R0,#1,ngat2

                          LCALL CT2
                          ngat2: CJNE R0,#2,ngat3

                          LCALL CT3
                          ngat3: CJNE R0,#3,ngat4
                          LCALL CT4

                          ngat4:
                          reti
                          org 30h

                          ;chuong trinh chinh

                          MAIN:
                          mov R0,#0
                          mov ie,#10000100b
                          MOV R1,#40H
                          MOV DPTR,#SCANCODE
                          ; phan chương trinh chay bình thường

                          Mỗi vector ngắt chỉ được sử dụng 8 byte thôi, bạn viết chương trình phục vụ ngắt quá 8 byte nên nó xâm phạm qua vùng của vector ngắt tiếp theo rồi, vậy mới gây lỗi

                          phải làm thế này nếu chương trình con phục vụ ngắt quá 8 byte

                          ORG 0000
                          LJMP MAIN

                          ORG 0013H
                          LJMP EX0_ISR


                          ORG 0030H
                          MAIN:

                          ...
                          ..



                          EX0_ISR:

                          ..
                          ..
                          RETI

                          Chương trình của bạn vector ngắt quá 8 byte và cũng quá địa chỉ bắt đầu của chương trình main, tức nó sẽ nằm đè lên chương trình main, bạn phải sửa lại như mẫu trên là được.

                          Comment


                          • #14
                            Nguyên văn bởi truongxun Xem bài viết
                            mình viết chương trinh cho bảng quang báo sử dụng chương trình ngắt,khi chưa có đoạn code ngắt này thì chương trình chạy bình thường và có thể RESET qua chân 9 nhưng từ khi có thêm đoạn code ngắt hay bị lỗi mọi người xem hộ mình với. lỗi là chương trình ko chạy chương trình chính mà nó bị nhảy vào ngắt ( đối với mạch thật còn dùng proteus thì vẫn chạy nhưng hơi bị lỗi) một lúc rồi đơ và dũng ko RESET được.
                            THANKS.
                            ******************
                            $mod851
                            ORG 00H ; Bat dau tai ngan nho 0
                            quetcot EQU 30H

                            ljmp MAIN
                            org 0013h ; sử dụng ngắt ngoài 1
                            INC R0 ; dùng để chọn chương trình ngắt thực hiện
                            CJNE R0,#00,ngat1

                            LCALL CT1 ;cac chương trinh con để gọi

                            ngat1: CJNE R0,#1,ngat2

                            LCALL CT2
                            ngat2: CJNE R0,#2,ngat3

                            LCALL CT3
                            ngat3: CJNE R0,#3,ngat4
                            LCALL CT4

                            ngat4:
                            reti
                            org 30h

                            ;chuong trinh chinh

                            MAIN:
                            mov R0,#0
                            mov ie,#10000100b
                            MOV R1,#40H
                            MOV DPTR,#SCANCODE
                            ; phan chương trinh chay bình thường

                            Mỗi vector ngắt chỉ được sử dụng 8 byte thôi, bạn viết chương trình phục vụ ngắt quá 8 byte nên nó xâm phạm qua vùng của vector ngắt tiếp theo rồi, vậy mới gây lỗi

                            phải làm thế này nếu chương trình con phục vụ ngắt quá 8 byte

                            ORG 0000
                            LJMP MAIN

                            ORG 0013H
                            LJMP EX0_ISR


                            ORG 0030H
                            MAIN:

                            ...
                            ..



                            EX0_ISR:

                            ..
                            ..
                            RETI

                            Chương trình của bạn vector ngắt quá 8 byte và cũng quá địa chỉ bắt đầu của chương trình main, tức nó sẽ nằm đè lên chương trình main, bạn phải sửa lại như mẫu trên là được.
                            Sửa như thế này nhé:
                            Code:
                            quetcot	EQU	30H
                            ORG	00H                                      ; Bat dau tai ngan nho 0
                            ljmp  MAIN
                            
                            org 0013h              ; sử dụng ngắt ngoài 1
                            LJMP EX1_ISR
                            
                            org  30h
                            ;chuong trinh chinh
                            
                            MAIN:
                            	mov          R0,#0
                                               mov ie,#10000100b
                            	MOV	R1,#40H
                            	MOV	DPTR,#SCANCODE			
                            ; phan chương trinh chay bình thường[/QUOTE]
                            
                            
                            EX1_ISR:
                                 INC  R0             ; dùng để chọn chương trình ngắt thực hiện
                                  CJNE R0,#00,ngat1
                            
                                  LCALL    CT1  ;cac chương trinh con để gọi
                            
                            ngat1:  CJNE R0,#1,ngat2
                            
                                   LCALL   CT2
                            ngat2: CJNE R0,#2,ngat3
                                  
                                    LCALL   CT3
                            ngat3:  CJNE R0,#3,ngat4
                                  LCALL   CT4
                            
                            ngat4:
                                reti

                            Comment


                            • #15
                              cảm ơn bạn đã chỉ giúp

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X