PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   Xin Mọi Người Giúp đỡ (http://www.picvietnam.com/forum/showthread.php?t=1170)

dtnbk 06-06-2007 04:59 PM

Xin Mọi Người Giúp đỡ
 
Em Dùng đoạn Chương Trình Này để Thực Hành Ngắt.
Dùng Pic16f84a
A0,a1,a2,a3,a4 Là Input
B0 Là Input Dùng Cho Việc Ngắt
B1,..,b7 Là Các Chân Output
ý định Là Khi Nhấn Switch Nối ở Các Chân Porta Thì Ghi Lại Giá Trị Của Porta Và Cộng Dồn Vào Cho Count.khi Bấm Ngắt Thì Kiểm Tra Giá Trị Của Count Xem Có Bằng Giá Trị Bất Kì Mà Mình Gán Vào W Hay Ko.nếu Bằng Thì Bật B6, Nếu Ko Bằng Thì Bật B5.
Nhưng Sau Khi Nạp Xong Thì Kết Quả Ko Như Mong đợi. Lúc đúng Lúc Sai. Mong Các Sửa Giúp .thanks
Code:

Org                0x0000
       
                Count        Equ                0ch
                Count1        Equ                0dh
                W_save        Equ                0eh
                Stat_sv        Equ                0fh
                Goto        Main
;----------interrupt Routine---------------------
Org                0x0004
                Movwf        W_save                ;ghi Lai Tri W Va Status
                Swapf        Status,0
                Clrf        Status
                Movwf        Stat_sv

                Clrw                    ;
                Movlw        B'00001111'      ;gia tri cho vao W de so sanh voi count
                Clrf    Status          ;xoa status
                Subwf        Count,0          ;
                Btfss        Status,z        ;neu Z=1 thì count=w --->escape set B6
                Goto        Alarm            ;neu Z=0 thi count!=w ---->alarm
                Goto        Escape
Alarm
                Bsf        Portb,5                ;set b5 để nhận biết trường hợp
                Btfss        Portb,0          ;kiểm tra nếu vẫn nhấn b0 thì ko thoát
                Goto        $+2
                Goto        $-2
                                        ;tra Ve Tri W Va Status
                Swapf        Stat_sv,w
                Movwf        Status
                Swapf        W_save,f
                Swapf        W_save,w

                Bcf        Intcon,1        ;xóa intcon,1 để có thể nhận interrupt
                Retfie
Escape
                Bsf        Portb,6          ;set b6 để nhận biết trường hợp
                Btfss        Portb,0          ;kiểm tra nếu vẫn nhấn b0 thì ko thoát ra
                Goto        $+2
                Goto        $-2

                                        ;tra Ve Tri W Va Status
                Swapf        Stat_sv,w
                Movwf        Status
                Swapf        W_save,f
                Swapf        W_save,w

                Bcf        Intcon,1        ;
                Retfie
;----------main Program----------------------------

Main               
                Bsf        Intcon,7        ;global Interrupt Enable
                Bsf        Intcon,4        ;rb0 Interrrup
                Bcf        Intcon,1        ;để nhận interrupt
                Bsf        Status,5        ;goto Bank 1
                Movlw        B'11111'
                Movwf        Trisa                               
                Movlw        B'00000001'
                Movwf        Trisb
;-------------------------------------------------------------------------------               
Start
                Bcf        Status,5        ;bank 0
                Clrf        Portb
                Clrf        Porta
                Clrf        Count                       
                Movlw        01h        ;chỉ là 1 giá trị cho vào count làm trị ban đầu
                Movwf        Count
;----------------------------------------------------------------------------       
Loop       
                Clrf        Count1       
                Bsf        Portb,2    ;chỉ là led bật để nhận biết vị trí trong loop
                Clrw       
                Swapf        Porta,w      ;ghi trị porta vào w và chuyển vào count1       
                Movwf        Count1

                Bcf        Status,z    ;đoạn kiểm tra xem có nhấn nút nào ko
                Sublw        B'00000000'  ;nếu ko nhấn thì ko clearporta
                Btfss        Status,z   
                Call        Clearporta
                Swapf        Count1,w    ;W=swapf(swapf(porta))       
                Addwf        Count,f            ; cộng w và count lưư lại ở count       
                                      ;đoạn kiểm tra xem có từ interrupt ra hay ko
                Btfsc        Portb,5     
                Goto        Start        ;nếu từ interrupt ra thì chạy lại start
                Btfss        Portb,6
                Goto        Loop            ;neu ko tu interrupt ra thi lặp lại loop
                Goto        Start        ;nếu từ interrupt ra thì chạy lại start
;-------------------------------------------------------------------------------
Clearporta                              ;đoạn xoá porta về 00000
                Bcf        Portb,2      ;chỉ  là 1 led nhận biết vị trí
                Bsf        Portb,1
                Swapf        Porta,w
                Sublw        0h
                Btfss        Status,z
                Goto        Clearporta
                Bcf        Portb,1
                Return
       
        End


namqn 06-06-2007 08:49 PM

Bạn chịu khó chú thích code của bạn và post lại. Code khá tối nghĩa nên rất khó theo dõi.

Thân,


Múi giờ GMT. Hiện tại là 05:55 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam