PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   giải thích code (http://www.picvietnam.com/forum/showthread.php?t=5838)

tppdua 10-02-2010 08:08 PM

giải thích code
 
em mới học pic, đang tìm hiểu về ngắt và định thời của pic, nhưng ko có tài liệu cụ thể, nên em coi về các thanh ghi liên quan trong datasheet rồi xem các vd, có chỗ em ko hiểu , mong anh chị giải đáp

Code:

TITLE                " nhap nhay rb0_dung timer0 "                               
        PROCESSOR        P16F877A
        INCLUDE        <P16F877A.inc>
        __CONFIG          _CP_OFF        & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat bien=============================
                        COUNT        EQU        0X23
;===========Phan chuong trình chính======================
                        ORG        0x00
                        GOTO        MAIN
                        ORG        0X04                ; dia chi vector ngat, tat ca ngat chi co dia chi nay
                        GOTO        NGAT               
                        ORG        0x0005
MAIN
        MOVLW                .56                ; nap 56 vao de timer0 dem dc 200 lan thi tran
        MOVWF                TMR0
        BANKSEL                TRISB
        CLRF                TRISB
        MOVLW                B'10100000'        ; cho phep ngat GLOBAL, ngat TIMER0
        MOVWF                INTCON
        MOVLW                B'00000111' ; che do chia 256 , tuc la 256 ckm thi timer0 dem len 1
        MOVWF                OPTION_REG        ; nap vao OPTION, timer0 bat dau chay
        BANKSEL                PORTB
        CLRF                PORTB
        MOVLW                .20    ; viec tang giam thoi gian la do gia tri nap trong COUNT
        MOVWF                COUNT
        GOTO                $                ; cho ngat o day
NGAT
        BTFSS                INTCON,T0IF ; Kiem tra xem co phai ngat xay ra la ngat timer_0 hay khong
        GOTO                THOAT_NGAT        ; khong phai ngat timer_0 thi thoat
        BCF                        INTCON,7        ; ko cho phep ngat nao xay ra nua
                                                        ; ko can thiet vi khi ngat xay ra, c.trinh tu dong
                                                        ; xoa bit GIE ( ngat toan cuc).
        DECFSZ                COUNT,1                ; giam COUNT de duoc 20 lan ngat
        GOTO                THOAT_NGAT        ; chua du thi thoat
        MOVLW                .20
        MOVWF                COUNT
;########## doan c.trinh set / clear RB0.############
        BTFSS                PORTB,0       
        GOTO                SET_RB0
CLR_RB0
        BCF                        PORTB,0
        GOTO                THOAT_NGAT       
SET_RB0
        BSF                        PORTB,0
;######### ket thuc doan c.trinh set / clear RB0 ###########
THOAT_NGAT               
       
        MOVLW                .56                        ; nap lai gia tri ban dau cho timer 0
        MOVWF                TMR0
        BCF                        INTCON,2        ; xoa co tran timer 0 (cung la co bao ngat)
                                                        ; phai xoa co nay de co ngat tiep theo xay ra
                                               
        RETFIE                                        ; lenh nay cung set bit GIE ( ngat toan cuc).                                       
END


_CHỗ kiểm tra ngắt xem có phải là ngắt timer 0 hay ko?? Tại sao phải kiểm tra và bit T0IF là bit gì (trong datasheet em thấy trong thanh ghi INTCON, chỉ có bit INT0IF (bit 1) là cờ của ngắt ngoài RB0, ko bik INT0IF có phải là nó T0IF hay ko? Và nếu là nó thì liên quan gì tới ngắt timer 0, vì em nghĩ là cờ ngắt timer phải là TMR0IF (bit 2). Anh chị giải thích dùm em chỗ đếm và ngắt nha. Còn biến count , theo như code là để nạp số lần ngắt, ngắt đủ 20 lần rồi mới đổi trạng thái PB.0. Cho em hỏi là tại sao cần phải có count? Có phải là để tăng thời gian giữa 2 lần Pb.0 sáng/tắt

nghia_tdh21 12-02-2010 08:58 PM

Hi hi! lâu ngày ko lên diễn đàn tết nhất anh em về quê hết thấy vắng vẻ ghê!
Vấn đề của tppdua mình chỉ khuyên bạn như sau:
Thứ nhất: Bạn muốn biết chính xác T0IF là bit gì thì bạn phải xem trong file P16F877A.inc. Theo mình nghĩ TMR0IF là cờ ngắt của timer0 chứ ko phải T0IF.
Thứ 2: Khi bạn phân tích một chương trình (kể cả ngôn ngữ cấp cao) bạn phải vẽ lại lưu đồ giải thuật, đây là kinh nghiệm của mình. Khi bạn đã quen và có kinh nghiệm rồi thì rất nhanh. Cách vẽ lưu đồ thì bạn lần lượt từ câu lệnh đầu tiên, nếu gặp lệnh nhảy thì bạn lại cho rẽ nhánh sang nhãn sau lệnh nhảy đó và cứ lần lượt đến câu lệnh cuối cùng.


Múi giờ GMT. Hiện tại là 04:43 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