PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   Chương trình ngắt cho timer1 thế này mà chạy không được ! (http://www.picvietnam.com/forum/showthread.php?t=1839)

uydanh 22-12-2007 10:17 AM

Chương trình ngắt cho timer1 thế này mà chạy không được !
 
Chào mọi người!
Em có đoạn khai báo ngắt timer1 như sau trong chương trình đồ án của mình:
Code:

        CLRF        T1CON
        CLRF        INTCON
        CLRF        TMR1H
        CLRF        TMR1L
        BSF                STATUS,RP0
        CLRF        PIE1
        BSF                PIE1,TMR1IE
        BCF                STATUS,RP0
        CLRF        PIR1
        MOVLW        0X00
        MOVWF        T1CON
        MOVLW        0XC3
        MOVWF        TMR1H
        MOVLW        0X50
        MOVWF        TMR1L

        BSF                T1CON,TMR1ON
        BSF                INTCON,TMR1IE
        BSF                INTCON,PEIE
        BSF                INTCON,GIE

Trong chương trình phục vụ ngắt ở 0004h. Em có viết đoạn chương trình sau :
Code:

        BTFSS        PIR1,TMR1IF
        GOTO        exit_int
        BCF        T1CON,TMR1ON

        CLRF          TMR1L
        CLRF          TMR1H
        MOVLW        0XC3
        MOVWF        TMR1H
        MOVLW        0X50
        MOVWF        TMR1L

        BSF                T1CON,TMR1ON
        BCF                PIR1,TMR1IF

        DECFSZ            demtimer1,1
        GOTO              tiep1
        GOTO              tiep2
tiep1:
        MOVLW        B'10100110'
        MOVWF        PORTB
        MOVLW        D'20'
        MOVWF        demtimer1
        GOTO        exit_int
tiep2:
        MOVLW        B'11000110'
        MOVWF        PORTB
exit_int
        MOVF                FSR_save,W
        MOVWF                FSR
        MOVF                PCLATH_save
        MOVWF                PCLATH
        SWAPF                STATUS_save,W
        MOVWF                STATUS
        SWAPF                W_save,1
        SWAPF                W_save,0
        RETFIE

Đoạn chương trình trên em viết hơi "loằng ngoằng", chỉ để chứng tỏ một điều rằng : ngắt timer1 ở trên chỉ xảy ra có một lần, nghĩa là đoạn kích timer1 chạy lại trong chương trình phục vụ ngắt không hoạt động.
Cũng chương trình trên, em copy ra thành một chương trình riêng biệt thì chạy tốt.
Em không biết có những yếu tố nào làm cho việc kích khởi timer1 hoạt động lại trong chương trình phục vụ ngắt "không bao giờ" hoạt động được.
Rất mong được sự hướng dẫn as soon as possible của mọi người.
Chân thành cảm ơn.
D.
À quên, biến demtimer1 em đã khai báo trước bằng 20

Jerry 22-12-2007 06:01 PM

1. Chương trình của bạn khi copy thành một chương trình riêng biệt đã chạy tốt thì chắc là bị sai ở chỗ khác, không do ngắt không thực hiện được.

2. Đoạn chương trình của bạn đưa ra rất chung chung, vì vậy đã có 17 người đọc rồi mà không ai trả lời.

3. Nếu có thể, bạn nên post toàn bộ chương trình và nói ý tưởng thực hiện lên đây thì sẽ hiệu quả hơn và chắc chắn sẽ tìm được hướng giải quyết.

4. Nếu bạn ko muốn public chương trình của mình thì có thể gửi mail cho tôi: hiendl2k42@yahoo.com

uydanh 22-12-2007 07:00 PM

Mình mới phát hiện một chuyện "kỳ lạ". Cái mạch nạp của mình có kèm theo cả mạch test, nạp xong là test trên đó luôn. Khi viết chương trình cho ngắt timer1 trên, nạp vào là chạy được luôn. Tuy nhiên nếu gỡ con PIC ra, để hơi lâu chút xíu cho "nguội", sau đó gắn vào lại thì lại chưa chắc chạy được. Nhấn reset không ăn thua, phải "nhấp" cái phích cấm nguồn cho mạch liên tục vài lần thì nó mới bắt đầu chạy được ( giống như làm cho "nóng" con PIC vậy). Còn trên mạch đồ án của mình thì tệ hơn chút xíu nhưng lâu lâu vẫn chạy đúng (phải rút ra rút vào dây nguồn liên tục cả chục lần).
Như vậy là sao các bạn, có phải con PIC của mình có vấn đề không? Mình mua nó ở chợ Nhật Tảo, có 50000 ngàn/1 con à.
Cảm ơn mọi người.

uydanh 23-12-2007 12:09 AM

Đuối lắm rồi!!!!
 
Mới thử con PIC khác của thằng bạn, vần không được. Đoạn chương trình của mình như sau :
1. Quét phím (không dùng ngắt), 12 phím 4 chân (10 phím số 0 đến 9, 1 phím cho động cơ chạy xuôi, 1 phím cho động cơ chạy ngượac) được nối trực tiếp với với PORTD. Phải nhập đủ 4 chữ số tương ứng tốc độ đặt của động cơ thì mới làm việc khác tiếp được, nếu chưa nhập đủ 4 số mà nhấn nhầm sang 2 phím chiều quay của động cơ thì vẫn ko sao, nhập lại tốc độ bình thường.
2. Sau khi nhập đủ 4 chứ số tốc độ đặt, bạn phải bắt buộc nhấn phím QUAY NGƯỢC hoặc QUAY XUÔI. Nhấn một trong 2 phím đó, chương trình sẽ chuyển tới đoạn phục vụ cho việc quay ngược, quay xuôi.
2 bước trên mình đã thực hiện xong, chạy rất tốt. Tuy nhiên bước tiếp theo thì đang "rất kẹt" cái vụ ngắt Timer1. Mình muốn dùng timer1 định thời gian 1ms rồi nhảy vào trình phục vụ ngắt rồi đọc xung encorder từ timer0 để tìm tốc độ đo. Làm riêng chương trình đọc xung vào timer0 thì OK. Nhưng khi dùng ngắt timer1 định thời 1ms thì ko được. Nó chỉ chạy vào trình phục vụ ngắt có 1 lần, sau đó không vào nữa cho dù trong chương trình ngắt timer1 đã bật timer1 chạy lại. Mình đã thử mọi cách vẫn ko xong.
Không biết làm sao nữa. Nhờ mọi người giúp.
Lẽ ra mình ko muốn post đoạn code lên lúc này vì còn rất....lung tung. Mình chú thích, chỉnh sửa lung tung trên đó, để khi nào xong, làm cho nó đàng hoàng rồi post lên luôn để người học sau có cái tham khảo. Nhưng bây giờ đành thua rồi. Post lên luôn, các đoạn code sau dấu ; là những gì mình viết thêm để thử trong quá trình tìm chổ sai, chứ ko có ý nghĩa gì. (đoạn chương trình trong ngắt chỉ để tìm chổ sai).
Mình sử dụng L293 làm driver cho động cơ ( dùng PortC tác động các chân của L293). IC7447 để chuyển từ mã BCD sang mã led 7 đoạn.
Code:

;CHUONG TRINH DIEU KHIEN ON_OFF DONG CO DC
;SINH VIEN THUC HIEN : NGUYEN UY DANH
;===================================================================================================
;KHAI BAO VI DIEU KHIEN;
;===================================================================================================
        processor        16f877a                                                ;vi dieu khien duoc su dung la PIC16F877A cua Microchip
        include                <p16f877a.inc>                                ;header file kem theo
        __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;===================================================================================================
;KHOI TAO CAC BIEN
;===================================================================================================
;NHOM CAC BIEN SU DUNG TRONG CHUONG TRINH DELAY
        count1                EQU 0x20               
        counta                EQU 0x21               
        countb                EQU 0x22
;===================================================================================================
;NHOM CAC BIEN SU DUNG TRONG CHUONG TRINH QUET PHIM VA NHAN BIET PHIM
        cols                EQU 0x23
        key                        EQU 0x24                        ;bien key chua ma ASCII cua phim duoc nhan
;===================================================================================================
;NHOM CAC THANH GHI HIEN THI LEN 4 LED 7 DOAN TOC DO DAT
        dem                EQU 0x25                       
        hangngan        EQU 0x26
        hangtram        EQU 0x27
        hangchuc        EQU 0x28
        hangdonvi        EQU 0x29
;===================================================================================================
;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT
        W_save                EQU        0x2A
        PCLATH_save        EQU        0x2B
        STATUS_save        EQU        0x2C
        FSR_save        EQU        0x2D
        demtimer1        EQU        0x2E
        TMR0_save        EQU        0x2F
        highbyte        EQU        0x30
        lowbyte                EQU        0x31
        h_byte_save        EQU        0X32
        l_byte_save        EQU        0x33
;===================================================================================================
;NHOM CAC THANH GHI DUNG TRONG CHUONG TRINH DOI TU HEX SANG BCD
        aar0                EQU        0x34                        ;binary number low byte
        aar1                EQU        0x35                        ;binary number high byte
        aac0                EQU        0x36                        ;bcd number ones
        aac1                EQU        0x37                        ;bcd number tens
        aac2                EQU        0x38                        ;bcd number hundreds
        aac3                EQU        0x39                        ;bcd number thousands
        aac4                EQU        0x3A                        ;bcd number ten-thousands
;===================================================================================================
       
;===================================================================================================
;CHUONG TRINH NGAT
;===================================================================================================
        ORG                        0x004
        GOTO                ISR
ISR
;---------------------------------------------------------------------------------------------------
;CHUONG TRINH BAT BUOC DAU CHUONG TRINH NGAT
;---------------------------------------------------------------------------------------------------
        MOVWF                W_save
        SWAPF                STATUS_save,W
        CLRF                STATUS
        MOVWF                STATUS_save
        MOVF                PCLATH,W
        MOVWF                PCLATH_save
        CLRF                PCLATH
        MOVF                FSR,W
        MOVWF                FSR_save
;---------------------------------------------------------------------------------------------------
;NOI DUNG CHUONG TRINH NGAT
;---------------------------------------------------------------------------------------------------
        BTFSS        PIR1,TMR1IF
        GOTO        exit_int
        BCF                T1CON,TMR1ON

        CLRF        TMR1L
        CLRF        TMR1H
        MOVLW        0X27
        MOVWF        TMR1H
        MOVLW        0X10
        MOVWF        TMR1L

        BSF                T1CON,TMR1ON
        BCF                PIR1,TMR1IF

;        MOVF        TMR0,W
;        MOVWF        lowbyte
;        CLRF        highbyte

        DECFSZ        demtimer1,1
        GOTO        tiep1
        GOTO        tiep2
;        MOVF        TMR0,W
;        MOVWF        lowbyte
;        CLRF        highbyte
tiep1:
        MOVLW        B'11000110'
        MOVWF        PORTB
;        MOVLW        D'20'
;        MOVWF        demtimer1
        GOTO        exit_int
tiep2:
        MOVLW        B'00000000'
        MOVWF        PORTB
exit_int
        MOVF                FSR_save,W
        MOVWF                FSR
        MOVF                PCLATH_save
        MOVWF                PCLATH
        SWAPF                STATUS_save,W
        MOVWF                STATUS
        SWAPF                W_save,1
        SWAPF                W_save,0

        BSF                T1CON,TMR1ON
        BCF                PIR1,TMR1IF
        RETFIE
;=================================================================================================       
        ORG                        0x0000
        GOTO                start
        ORG                        0x050
start
        BCF                STATUS,RP1                        ;chon Bank1 co chua thanh ghi TRISD
        BSF                STATUS,RP0                        ;thiet lap 4 bit cao cua PORTD la output tuong ung voi cols
        MOVLW                0x0F                                ;thiet lap 4 bit thap cua PORTD la input tuong ung voi rows
        MOVWF                TRISD                                ;TRISD=00001111B
       
        MOVLW                0x00
        MOVWF                TRISB                                ;thiet lap chan cua PORTB la port output

        MOVLW                b'00000000'                                ;thiet lap chan cua PORTC la port output
        MOVWF                TRISC

        MOVLW                0xFF                                ;thiet lap chan cua portA la port input
        MOVWF                TRISA

        BCF                STATUS,RP0                        ;chon Bank0

;===================================================================================================
;BAN DAU CHO TAT CA CAC LED HIEN THI 0 HET
;===================================================================================================
        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'00000000'
        MOVWF                PORTB
        MOVLW                b'00100000'
        MOVWF                PORTB
        MOVLW                b'01000000'
        MOVWF                PORTB
        MOVLW                b'01100000'
        MOVWF                PORTB
        MOVLW                b'10000000'
        MOVWF                PORTB       
        MOVLW                b'10100000'
        MOVWF                PORTB
        MOVLW                b'11000000'
        MOVWF                PORTB
        MOVLW                b'11100000'
        MOVWF                PORTB
;==================================================================================================
;KHOI TAO TIMER1
;==================================================================================================
        CLRF        T1CON
        CLRF        INTCON
        CLRF        TMR1H
        CLRF        TMR1L
        BSF                STATUS,RP0
        CLRF        PIE1
        BSF                PIE1,TMR1IE
        BCF                STATUS,RP0
        CLRF        PIR1
        MOVLW        0X00
        MOVWF        T1CON
        MOVLW        0X27
        MOVWF        TMR1H
        MOVLW        0X10
        MOVWF        TMR1L
;================================================================================================
;KHOI TAO CAC BIEN
;=================================================================================================
        CLRF                dem                                        ;xoa bien dem ve 0
        CLRF                highbyte
        CLRF                lowbyte
        CLRF                h_byte_save
        CLRF                l_byte_save
        CLRF                aar0
        CLRF                aar1
        CLRF                aac0
        CLRF                aac1
        CLRF                aac2
        CLRF                aac3
        CLRF                aac4
        MOVLW                D'20'
        MOVWF                demtimer1
;===================================================================================================
;BAT DAU CHUONG TRINH CHINH
;===================================================================================================
Mainpro                                               
        CALL                Chk_keys                        ;goi chuong trinh quet phim va nhan biet phim
        MOVF                key,W                                       
        GOTO            Xuatled
Chk_keys                                                        ;chuong trinh CON quet phim
;===================================================================================================
;DOAN CHUONG TRINH KIEM TRA CO BI KET PHIM TRUOC KHI NHAN PHIM HAY KHONG
;DOAN CHUONG TRINH NAY CHAY NGAY KHI KHOI DONG CHUONG TRINH
;===================================================================================================
        MOVLW                0x00                                ;trang thai ban dau cua cac port cols la 0
        MOVWF                PORTD                                ;trang thai ban dau cua cac port rows la muc 1
        CALL                delay20                                ;goi chuong trinh delay20ms
        MOVF                PORTD,W                                ;lay trang thai hien tai cua PORTD dua vao thanh ghi W                               
        ANDLW                0x0F                                ;thuc hien phep AND thanh ghi W voi 0FH
        SUBLW                0x0F                                ;thuc hien phep TRU voi gia tri thiet lap ban dau cho PORTD la OFH
        BTFSC                STATUS,Z                        ;neu gia tri hien tai cua PORTD van khong doi so voi thiet lap ban dau
        GOTO                Keys                                ;nghia la khong bi ket phim, co Z=1 thi nhay toi keys la chuong trinh con bat phim nhan
        CALL                delay20                                ;con neu Z=0 nghia la bi ket phim thi dalay20 de nguoi dung xu ly viec ket phim nay
        GOTO                Chk_keys
;====================================================================================================
;DOAN CHUONG TRINH CON BAT PHIM NHAN
;====================================================================================================
Keys
        CALL                Scan_keys                        ;goi chuong trinh Scan_keys xem thu co phim nao nhan khong
        MOVLW                d'12'                                ;nap vao W gia tri 12
        SUBWF                key,0                                ;lay gia tri trong key tra ve tru cho 12
        BTFSS                STATUS,Z                        ;truong hop khong co phim nhan thi key=12,delay 20ms va quay lai scan de phat hien
        GOTO                Key_found                        ;truong hop key<12 nghi la co nhan phim thi di vao chuong trinh con nhan dang phim
        CALL                delay20
        GOTO                Keys
Key_found
        MOVF                key,0                                ;lay lai gia tri key luu vao W
        ANDLW                0x0F                                ;chi nham loai bi 4 bit cao khong co y nghi gi trong key(mac dinh co the ton tai)
        CALL                Key_table                        ;goi chuong trinh tra bang gia tri
        MOVWF                key                                        ;luu lai gia tri bang vao bien key
        RETURN
Scan_keys
        CLRF                key                                        ;xoa gia tri trong key ve 0, chuan bi chua ma cua phim duoc nhan
        MOVLW                0x70                                ;thiet lap cho tat ca cac cols deu len 1
        MOVWF                PORTD                                ;cac rows thi luon luon la 1

        MOVLW                0x03                                       
        MOVWF                cols                                ;thiet lap gia tri bien cols
       
        BSF                STATUS,C                        ;set co C len 1 trong thanh ghi Status, chuan bi shift vao PORTD
Scan
        RRF                PORTD,1                                ;dich PORTD tung buoc kem theo co C
        BTFSS                PORTD,3                                ;neu bit thu 3 cua PORTD bang 0 nghi la phim noi giua hang 3 va cot 3 nhan
        GOTO                press                                ;ung voi phim REVERSE, tro lai chuong trinh Keys de nhan biet phim
        INCF                key,1                                ;neu sai thi tang key len 1
        BTFSS                PORTD,2                                ;neu bit thu 2 cua PORTD bang 0 nghi la phim noi giua hang 2 va cot 3 duoc nhan
        GOTO                press                                ;ung voi phim so 8, tro lai chuong trinh keys de nhan biet phim
        INCF                key,1
        BTFSS                PORTD,1
        GOTO                press
        INCF                key,1
        BTFSS                PORTD,0
        GOTO                press
        INCF                key,1
        DECFSZ                cols,1                                ;giam rows, neu bang khac 0 thi scan tiep, bang 0 thi tro ve
        GOTO                Scan
press
        RETURN                                                        ;tro ve chuong trinh scan phim
;=======================================================================================================
;BANG TRA Key_Table
;=======================================================================================================
Key_table
        ADDWF                PCL,1
        RETLW                d'11'                                ;key=0 ung voi phim REVERSE co ma la 11D
        RETLW                0x08                                ;key=1 ung voi phim so 8 co ma la 08H
        RETLW                0x05                                ;key=2 ung voi phim so 5
        RETLW                0x02                                ;key=3 ung voi phim so 2
        RETLW                d'10'                                ;key=4 ung voi phim FORWARD co ma la 10D
        RETLW                0x07                                ;key=5 ung voi phim so 7
        RETLW                0x04                                ;key=6 ung voi phim so 4
        RETLW                0x01                                ;key=7 ung voi phim so 1
        RETLW                0x09                                ;key=8 ung voi phim so 9
        RETLW                0x06                                ;key=9 ung voi phim so 6
        RETLW                0x03                                ;key=10 ung voi phim so 3
        RETLW                0x00                                ;key=11 ung voi phim so 0
;======================================================================================================
;CHUONG TRINH HIEN THI RA LED GIA TRI LUU TRONG BIEN key SAU KHI SCAN PHIM
;CO SU DUNG BIEN dem DE THEO DOI SO LAN NHAN PHIM
;======================================================================================================
Xuatled
        INCF                dem                                        ;cu moi lan bat duoc 1 phim thi tang bien dem len 1
       
        MOVLW                d'1'
        XORWF                dem,W                                ;so sanh gia tri luu trong bien dem va 1
        BTFSC                STATUS,Z                        ;neu dem=1 thi nhay den chuong trinh xu ly phim nhan thu 1
        GOTO                dem1                                ;neu dem#1 thi kiem tra tiep theo
       
        MOVLW                d'2'
        XORWF                dem,W                                ;so sanh gia tri luu trong bien dem va 2       
        BTFSC                STATUS,Z                        ;neu dem=2 thi nhay den chuong trinh xu ly phim nhan thu 2
        GOTO                dem2                                ;neu dem#2 thi kiem tra tiep theo

        MOVLW                d'3'
        XORWF                dem,W                                ;so sanh gia tri luu trong bien dem va 3       
        BTFSC                STATUS,Z                        ;neu dem=3 thi nhay den chuong trinh xu ly phim nhan thu 3
        GOTO                dem3                                ;neu dem#2 thi kiem tra tiep theo       

        MOVLW                d'4'
        XORWF                dem,W                                ;so sanh gia tri luu trong bien dem va 4       
        BTFSC                STATUS,Z                        ;neu dem=4 thi nhay den chuong trinh xu ly phim nhan thu 4
        GOTO                dem4                                ;neu dem#4 thi kiem tra tiep theo
       
;sau 4 lan nhan phim, da nhan du 4 so de cai dat toc do, nhan phim so 5 bat buoc la phim FORWARD or REVERSE
        MOVLW                d'10'
        XORWF                key,W                                ;so sanh ma phim trong key co phai la phim FORWARD khong?
        BTFSC                STATUS,Z                        ;neu dung la phim FORWARD thi Z=1
        GOTO                FORWARD                                ;se nhay den chuong trinh FORWARD
       
        MOVLW                d'11'                                ;neu khong la FORWARD
        XORWF                key,W                                ;thi so sanh ma phim trong key co phai la phim REVERSE khong?
        BTFSC                STATUS,Z                        ;neu dung la phim REVERSE THI Z=1
        GOTO                REVERSE                                ;se nhay den chuong trinh REVERSE
       
        DECF                dem,1                                ;neu khong la FORWARD or REVERSE thi giam xuong dem=4
        GOTO                Mainpro                                ;nguoi dung phai nhan dung phim moi tiep tuc duoc

;cac chuong trinh xu ly cac phim nhan dem1 dem2 dem3 va dem4

dem1                                                                ;dem1 la doan chuong trinh xuat led va save gia tri hang ngan cua toc do dat
        CALL                nhannhamphim?                ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
                                                                        ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?

        MOVF                key,W                                ;neu nhan dung phim thi bat dau xu ly
        MOVWF                hangngan                        ;luu gia tri do vao bien hangngan
       
        MOVLW                b'00000000'
        CALL                xuatraled7doan_toc_do_dat
        GOTO                Mainpro               
dem2
        CALL                nhannhamphim?                ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
                                                                        ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?
        MOVF                key,W                                ;neu nhan dung phim thi bat dau xu ly
        MOVWF                hangtram                        ;luu gia tri do vao bien hangtram

        MOVLW                b'00100000'
        CALL                xuatraled7doan_toc_do_dat
        GOTO                Mainpro
dem3
        CALL                nhannhamphim?                ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
                                                                        ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?
        MOVF                key,W                                ;neu nhan dung phim thi bat dau xu ly
        MOVWF                hangchuc                        ;luu gia tri do vao bien hangchuc

        MOVLW                b'01000000'
        CALL                xuatraled7doan_toc_do_dat
        GOTO                Mainpro
dem4
        CALL                nhannhamphim?                ;goi chuong trinh kiem tra co nhan nham phim REVERSE hay FORWARD truoc khi
                                                                        ;nhap day du so hangngan,hangtram,hangchuc,hangdoivi hay khong?
        MOVF                key,W                                ;neu nhan dung phim thi bat dau xu ly
        MOVWF                hangchuc                        ;luu gia tri do vao bien hangchuc

        MOVLW                b'01100000'
        CALL                xuatraled7doan_toc_do_dat
        GOTO                Mainpro       
;----------------------------------------------------------------------------------------------------------
;CAC CHUONG TRINH CON CUA CHUONG TRINH xuatled
xuatraled7doan_toc_do_dat

        BCF                        STATUS,C                        ;xoa co C cua thanh ghi STATUS
        ADDWF                key,W                                ;cong voi gia tri trong W, luu lai vao trong thanh ghi W
        MOVWF                PORTB                                ;chuyen ra PORTB,thuc hien duoc viec xuat hangngan ra led 7 doan
        RETURN
nhannhamphim?
        MOVLW                d'10'
        XORWF                key,W                                ;kiem tra thu co phai la nhan nham FORWARD khong?
        BTFSC                STATUS,Z                        ;neu nhan nham FORWARD thi phai NHANPHIMLAI               
        GOTO                nhanphimlai
       
        MOVLW                d'11'                                ;kiem tra thu co phai nhan nham REVERSE khong?
        XORWF                key,W
        BTFSC                STATUS,Z
        GOTO                nhanphimlai                        ;neu nhan nham REVERSE thi phai NHANPHIMLAI
       
        RETURN
;------------------------------------------------------------------------------------------------------------       
nhanphimlai
        DECF                dem,1
        GOTO                Mainpro

;============================================================================================================
;CHUONG TRINH REVERSE VA FORWARD       
;============================================================================================================
REVERSE
       
        BSF                T1CON,TMR1ON
        BSF                INTCON,TMR1IE
        BSF                INTCON,PEIE
        BSF                INTCON,GIE


;        CLRF                TMR0                                ;xoa thanh ghi TMR0
;        CLRF                INTCON                                ;xoa thanh ghi INTCON
;        BSF                        STATUS,RP0                        ;chon Bank1
;        MOVLW                b'11101000'                        ;tat chuc nang keo dien tro len cua PORTB
;        MOVWF                OPTION_REG                        ;timer0 o che do dem xung, tac dong boi canh len, prescaler 1:1

;        BCF                        STATUS,RP0                        ;chon Bank0
;        BSF                        INTCON,TMR0IE                ;cho phep ngat timer0
;        BSF                        INTCON,PEIE                        ;cho phep ngat ngoai vi
;        BSF                        INTCON,GIE                        ;cho phep toan bo cac ngat


        MOVLW                b'01100000'
        MOVWF                PORTC
       

;        BSF                T1CON,TMR1ON
       
        MOVLW                B'10101001'
        MOVWF                PORTB
loop2
        GOTO                loop2
;LOOP2
;        MOVLW                0x00
;        MOVWF                highbyte
;        MOVF                TMR0,W
;        MOVWF                lowbyte

;        MOVLW                0x11
;        MOVWF                highbyte
;        MOVLW                0x11
;        MOVWF                lowbyte
;        MOVF                highbyte,W
;        MOVWF                aar1
;        MOVF                lowbyte,W
;        MOVWF                aar0
;        CALL                b16_d5
;        MOVLW                b'10000000'
;        ADDWF                aac3,W
;        MOVWF                PORTB
;        MOVLW                b'10100000'
;        ADDWF                aac2,W
;        MOVWF                PORTB       
;        MOVLW                b'11000000'
;        ADDWF                aac1,W
;        MOVWF                PORTB
;        MOVLW                b'11100000'
;        ADDWF                aac0,W
;        MOVWF                PORTB       
;        GOTO                LOOP2
FORWARD
        MOVLW                b'01100000'
        MOVWF                PORTC
        GOTO                $
;CHUONG TRINH DELAY 20ms
;==============================================================
delay20
        MOVLW d'10'                                        ;nap 20 cho count1 de tao tre 20ms
        MOVWF count1
lap1
        MOVLW d'199'
        MOVWF counta
        MOVLW d'1'
        MOVWF countb
delay1
        DECFSZ counta,1
        GOTO $+2
        DECFSZ countb,1
        GOTO delay1
        DECFSZ count1,1
        GOTO lap1                                        ;het doan chuong trinh delay 100ms
        RETURN
b16_d5
    swapf  aar0,w                                ; partial ones sum in low byte
    addwf  aar0,w                                ;
    andlw  0x0f                                ;
    skpndc                                                ;
    addlw        0x16                                ;
    skpndc                                                ;
    addlw          0x06                                ;
    addlw  0x06                                ;
    skpdc                ;
        addlw          -0x06                                ; wmax=3:0
;
    btfsc  aar0,4                                ; complete ones sum in low byte
    addlw  0x15+0x06
    skpdc
    addlw          -0x06                                ; wmax=4:5
        movwf        aac0                                ; save sum in aac0
;
;    8+      4+    2+    1+    8+    4+    2+    1+
;    20
;  100      60    30    15+
;  ----------------------------------------------------
;  128      64    32    16      8      4    2    1
;
    swapf  aar1,w                                ; partial ones sum in high byte
    addwf  aar1,w                                ;
    andlw  0x0f                                ;
    skpndc                                                ;
    addlw        0x16                                ;
    skpndc                                                ;
    addlw          0x06                                ;
    addlw  0x06                                ;
    skpdc                                                ;
        addlw          -0x06                                ; wmax=3:0
;
        btfsc  aar1,0                                ; complete ones sum in high byte
    addlw  0x05+0x06
    skpdc
    addlw          -0x06                                ; wmax=3:5
;
    btfsc  aar1,4
    addlw  0x15+0x06
    skpdc
    addlw          -0x06                                ; wmax=5:0
;
        addlw        0x06                                ; include previous sum
        addwf        aac0,w
    skpdc
    addlw          -0x06                                ; wmax=9:5, ones sum ended
;
        movwf        aac0
        movwf        aac1
        swapf        aac1,f
        movlw        0x0f
        andwf        aac0,f                                ; save total ones sum in aac0
        andwf        aac1,f                                ; save partial tens sum in aac1
;
;    8+      4+    2+    1+    8+    4+    2+    1+
;                          5+
;    60      80    90    10+                        5+
;  700    300    100    80    40    20    10    50
; 32000  16000  8000  4000  2000  1000  500  200
; ------------------------------------------------------
; 32768  16384  8192  4096  2048  1024  512  256
;
; complete tens sum in low and high byte
        rrf        aar1,w                                        ; rotate right high byte once
        andlw        0x0f                                ; clear high nibble
        addlw        0x06                                ; adjust bcd
        skpdc
        addlw        -0x06                                ; wmax=1:5
;
        addlw        0x06                                ; include previous sum
        addwf        aac1,w
    skpdc
    addlw          -0x06                                ; wmax=2:4
;
    btfsc  aar0,5
    addlw  0x03+0x06
    skpdc
    addlw          -0x06                                ; wmax=2:7
;
    btfsc  aar0,6
    addlw  0x06+0x06
    skpdc
    addlw          -0x06                                ; wmax=3:3
;
    btfsc  aar0,7
    addlw  0x12+0x06
    skpdc
    addlw          -0x06                                ; wmax=4:5
;
    btfsc  aar1,0
    addlw  0x25+0x06
    skpdc
    addlw          -0x06                                ; wmax=7:0
;
    btfsc  aar1,5
    addlw  0x09+0x06
    skpdc
    addlw          -0x06                                ; wmax=7:9
;
    btfsc  aar1,6
    addlw  0x08+0x06
    skpdc
    addlw          -0x06                                ; wmax=8:7
;
    btfsc  aar1,7
    addlw  0x06+0x06
    skpdc
    addlw          -0x06                                ; wmax=9:3, tens sum ended
;
        movwf        aac1                                ; save total tens sum in aac1
        swapf        aac1,w
        andlw        0x0f                                ; load partial hundreds sum in w
;
;    8+      4+    2+    1+    8+    4+    2+    1+
;    20+                    5+
;  100+    60+    30+    10+
;  ----------------------------------------------------
;  128      64    32    16      8      4    2    1
;
;    8+      4+    2+    1+    8+    4+    2+    1+
;                          5+
;    60+    80+    90+    10+                        5+
;  700    300    100    80+    40+    20+  10+  50+
; 32000  16000  8000  4000  2000  1000  500  200+
; ------------------------------------------------------
; 32768  16384  8192  4096  2048  1024  512  256
;
; complete hundreds sum in high byte
    btfsc  aar1,1
    addlw  0x05+0x06
    skpdc
    addlw          -0x06                                ; wmax=1:4
;
    btfsc  aar1,5
    addlw  0x01+0x06
    skpdc
    addlw          -0x06                                ; wmax=1:5
;
    btfsc  aar1,6
    addlw  0x03+0x06
    skpdc
    addlw          -0x06                                ; wmax=1:8
;
    btfsc  aar1,7
    addlw  0x07+0x06
    skpdc
    addlw          -0x06                                ; wmax=2:5, hundreds sum ended
;
        movwf        aac2                                ; save total hundreds sum in aac2
        swapf        aac2,w
        movwf        aac3                                ; save partial thousands sum in aac3       
        movlw        0x0f                                ; clear high nibble
        andwf        aac1,f                                ;
        andwf        aac2,f                                ;
        andwf        aac3,f                                ;
;
;    8+      4+    2+    1+    8+    4+    2+    1+
;                          5+
;    60+    80+    90+    10+                        5+
;  700+    300+  100+    80+    40+    20+  10+  50+
; 32000  16000  8000  4000  2000  1000  500+  200+
; ------------------------------------------------------
; 32768  16384  8192  4096  2048  1024  512  256
;
; complete thousands sum in low and high byte
        rrf        aar1,w                                        ; rotate right high byte twice
        movwf        aac4                                ;
        rrf        aac4,w                                        ;
        andlw        0x0f                                ; clear high nibble
        addlw        0x06                                ; adjust bcd
        skpdc                                                ;
        addlw        -0x06                                ; wmax=1:5
;
        addlw        0x06                                ; include previous sum
        addwf        aac3,w
        skpdc
        addlw        -0x06                                ; wmax=1:7
;
    btfsc  aar1,6
    addlw  0x16+0x06
        skpdc
        addlw        -0x06                                ; wmax=3:3
;
    btfsc  aar1,7
    addlw  0x32+0x06
        skpdc
        addlw        -0x06                                ; wmax=6:5, thousands sum ended
;
        movwf        aac3                                ; save total thousands sum in aac3
        movwf        aac4                                ;
        swapf        aac4,f                                ; save ten-thousands sum in aac4
        movlw        0x0f                                ; clear high nibble
        andwf        aac3,f                                ;
        andwf        aac4,f                                ;
        return
END

Các bạn giúp đỡ mình nha. Cảm ơn

Jerry 23-12-2007 10:23 AM

Đoạn code phục vụ ngắt bạn thử làm như sau:
Code:

            BTFSS        PIR1,TMR1IF
            GOTO        exit_int
            BCF        PIR1,TMR1IF

        CLRF          TMR1L
        CLRF          TMR1H
        MOVLW        0XC3
        MOVWF        TMR1H
        MOVLW        0X50
        MOVWF        TMR1L
       
        DECFSZ            demtimer1,1
        GOTO              tiep1
        GOTO              tiep2
tiep1:
        MOVLW        B'10100110'
        MOVWF        PORTB
        MOVLW        D'20'
        MOVWF        demtimer1
        GOTO        exit_int
tiep2:
        MOVLW        B'11000110'
        MOVWF        PORTB
exit_int
        MOVF                FSR_save,W
        MOVWF                FSR
        MOVF                PCLATH_save
        MOVWF                PCLATH
        SWAPF                STATUS_save,W
        MOVWF                STATUS
        SWAPF                W_save,1
        SWAPF                W_save,0
        RETFIE

Cũng không chắc sửa như thế đã chạy được, nhưng cách viết này nó "chính thống" hơn cách viết của bạn. Việc bạn xoá rồi lại đặt bít TMR1ON trong ngắt không có ý nghĩa gì cả. Vào ngắt bạn phải xoá cờ TMR1IF ngay. Ngoài ra, bạn có thể sử dụng MPLAB Simulator để mô phỏng và tìm lỗi.

uydanh 23-12-2007 10:01 PM

Không thể nào chạy được. Buồn quá.
Mình không hiểu nổi tại sao đoạn chương trình kích cho timer1 chạy lại trong ngắt không bao giờ hoạt động được.

uydanh 24-12-2007 12:56 AM

Mình thử viết một chương trình chớp tắt led đơn giản, sử dụng ngắt timer1. Chương trình như sau :
Code:

        processor        16f877a                                                ;vi dieu khien duoc su dung la PIC16F877A cua Microchip
        include                <p16f877a.inc>                                ;header file kem theo
        __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;===================================================================================================
;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT
        W_save                EQU        0x20
        PCLATH_save        EQU        0x21
        STATUS_save        EQU        0x22
        FSR_save        EQU        0x23
        DEM                        EQU        0X24

        count1                EQU 0x25               
        counta                EQU 0x26               
        countb                EQU 0x27
;===================================================================================================
        ORG                0X004
        GOTO        ISR
ISR
;===================================================================================================
;DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT
        MOVWF                W_save
        SWAPF                STATUS_save,W
        CLRF                STATUS
        MOVWF                STATUS_save
        MOVF                PCLATH,W
        MOVWF                PCLATH_save
        CLRF                PCLATH
        MOVF                FSR,W
        MOVWF                FSR_save
;===================================================================================================
;CHUONG TRINH CHINH CUA NGAT
;===================================================================================================
        BTFSS        PIR1,TMR1IF
        GOTO        exit_int
        BCF                PIR1,TMR1IF

        BCF                T1CON,TMR1ON
        CLRF        T1CON
        CLRF        TMR1L
        CLRF        TMR1H
        MOVLW        0X00
        MOVWF        T1CON
        MOVLW        0XC3
        MOVWF        TMR1H
        MOVLW        0X50
        MOVWF        TMR1L
        BSF                T1CON,TMR1ON

        DECFSZ        DEM,1
        GOTO        exit_int
        COMF        PORTB,1
        MOVLW        D'100'
        MOVWF        DEM
        GOTO        exit_int
       
;===================================================================================================
;DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT
exit_int
        MOVF                FSR_save,W
        MOVWF                FSR
        MOVF                PCLATH_save
        MOVWF                PCLATH
        SWAPF                STATUS_save,W
        MOVWF                STATUS
        SWAPF                W_save,1
        SWAPF                W_save,0
        RETFIE


        ORG                0X0000
        GOTO        start
        ORG                0X050
;=================================================================================================
;CHUONG TRINH CHINH
;=================================================================================================
start
        BCF                STATUS,RP1
        BSF                STATUS,RP0
        MOVLW        0X00
        MOVWF        TRISB
        BCF                STATUS,RP0

        MOVLW        D'100'
        MOVWF        DEM
       

;------------------------------------------------------------------------------------------------
;KHOI TAO TIMER 1
;------------------------------------------------------------------------------------------------

        CLRF        T1CON
        CLRF        INTCON
        CLRF        TMR1H
        CLRF        TMR1L
        BSF                STATUS,RP0
        CLRF        PIE1
        BSF                PIE1,TMR1IE
        BCF                STATUS,RP0
        CLRF        PIR1
        MOVLW        0X00
        MOVWF        T1CON
        MOVLW        0XC3
        MOVWF        TMR1H
        MOVLW        0X50
        MOVWF        TMR1L

        BSF                T1CON,TMR1ON
        BSF                INTCON,TMR1IE
        BSF                INTCON,PEIE
        BSF                INTCON,GIE
        BSF                PIR1,TMR1IF

        MOVLW        B'00000011'
        MOVWF        PORTC
        MOVLW        B'11111111'
        MOVWF        PORTB
        GOTO        $
delay20
        MOVLW d'10'                                        ;nap 20 cho count1 de tao tre 20ms
        MOVWF count1
lap1
        MOVLW d'199'
        MOVWF counta
        MOVLW d'1'
        MOVWF countb
delay1
        DECFSZ counta,1
        GOTO $+2
        DECFSZ countb,1
        GOTO delay1
        DECFSZ count1,1
        GOTO lap1                                        ;het doan chuong trinh delay 100ms
        RETURN
END

Kết quả là nó chạy được. Thế nhưng, mình thử rút dây nguồn ra, rồi cấm vào lại thì lúc chạy được, lúc ko chạy được (không chạy được nhưng led vẫn sáng mà ko nhấp nháy theo ý muốn). Vậy là sao ta?
To Jerry : mình đã thử không dùng lệnh xóa và đặt bit TMR1ON nhưng chương trình ko chạy được.
Cho mình hỏi cách khai báo sử dụng cùng một lúc timer0 và timer1 và ngắt của chúng như thế nào? (mình khai báo như bình thường nhưng ko chạy được)
Xin cảm ơn.

Jerry 24-12-2007 11:23 AM

1. Thiếu phần định nghĩa các chân cổng là digital I/O
Code:

        BSF        STATUS, RP0        ; Select Bank 1
        MOVLW        0x06                ; Configure all pins
        MOVWF        ADCON1                ; as digital inputs
        BCF        STATUS, RP0        ; Select Bank 0

2. Sao lại dùng lệnh này khi khởi tạo chương trình? “BSF PIR1,TMR1IF”???? Đây là cờ báo tràn Timer1, được tự động đặt là 1 bằng phần cứng để báo tràn Timer1.
3. Trong chương trình chưa thấy phần định nghĩa hướng dữ liệu (vào/ra) cho PORTC và PORTB, vậy mà lại out dữ liệu ra:
Code:

        MOVLW        B'00000011'
        MOVWF        PORTC
        MOVLW        B'11111111'
        MOVWF        PORTB

Như vậy mà sáng được LED thì quá lạ. Bạn xem lại nhé. Xem xong tui sẽ phân tích tiếp cho bạn thấy một số vấn đề nữa.

uydanh 24-12-2007 12:07 PM

Trích:

Nguyên văn bởi Jerry (Post 13508)
1. Thiếu phần định nghĩa các chân cổng là digital I/O
Code:

        BSF        STATUS, RP0        ; Select Bank 1
        MOVLW        0x06                ; Configure all pins
        MOVWF        ADCON1                ; as digital inputs
        BCF        STATUS, RP0        ; Select Bank 0


Phần khai báo này mình chưa xài bao giờ, hôm nay mới biết, thế nhưng thử vào rồi vẫn ko chạy được (mình đã viết thành chương trình riêng cho ngắt timer1)

Trích:

Nguyên văn bởi Jerry (Post 13508)
2. Sao lại dùng lệnh này khi khởi tạo chương trình? “BSF PIR1,TMR1IF”???? Đây là cờ báo tràn Timer1, được tự động đặt là 1 bằng phần cứng để báo tràn Timer1.

Cái này gọi là ép ngắt, thay vì ở lần đầu tiên nó phải chạy đến giá trị đặt trong 2 thanh ghi timer1 thì ở đây nó được ép ngắt nhảy vào ngắt luôn ở vòng đầu tiên. Nhưng theo lời bạn, mình đã bỏ dòng lệnh này. Kết quả vẫn vậy.
Trích:

Nguyên văn bởi Jerry (Post 13508)
3. Trong chương trình chưa thấy phần định nghĩa hướng dữ liệu (vào/ra) cho PORTC và PORTB, vậy mà lại out dữ liệu ra:
Code:

        MOVLW        B'00000011'
        MOVWF        PORTC
        MOVLW        B'11111111'
        MOVWF        PORTB

Như vậy mà sáng được LED thì quá lạ. Bạn xem lại nhé. Xem xong tui sẽ phân tích tiếp cho bạn thấy một số vấn đề nữa.

Mình quên khai báo hướng dữ liệu cho PORTC, còn PORTB thì khai báo rồi. Chương trình này mình xuất led thử nghiệm ra portB nên kết quả không ảnh hưởng gì.
Bạn giúp mình những vấn đề khác đi. Thực sự mình đang rất rối, mọi chuyện đang như đám rừng. bó tay.
Do thời gian học về PIC của mình ngắn quá nên có nhiều chổ chưa hiểu đúng bản chất vấn đề. Rất mong các đọc qua đoạn code của mình, xem thử có lỗi sai nào trầm trọng về kiến thức thì cho mình biết để mình giải quyết vấn đề timer1 này.

Jerry 24-12-2007 01:10 PM

Bây giờ phân tích tiếp phần chương trình chính điều khiển động cơ của bạn nhé.
1. Phần khởi tạo các cổng vào ra, bạn cũng thiếu phần định nghĩa các chân cổng là digital I/O
Code:

        BSF        STATUS, RP0        ; Select Bank 1
        MOVLW        0x06                ; Configure all pins
        MOVWF        ADCON1                ; as digital inputs
        BCF        STATUS, RP0        ; Select Bank 0

Cái này là bắt buộc nên trong tất cả các chương trình viết bằng ngôn ngữ ASM, bạn đều phải dùng trước các lệnh định nghĩa cổng vào ra. Không có đoạn này chắc chắn chương trình của bạn sẽ chạy loạn lên ngay.

2.
Code:

        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'00000000'
        MOVWF                PORTB
        MOVLW                b'00100000'
        MOVWF                PORTB
        MOVLW                b'01000000'
        MOVWF                PORTB
        MOVLW                b'01100000'
        MOVWF                PORTB
        MOVLW                b'10000000'
        MOVWF                PORTB       
        MOVLW                b'10100000'
        MOVWF                PORTB
        MOVLW                b'11000000'
        MOVWF                PORTB
        MOVLW                b'11100000'
        MOVWF                PORTB

Đoạn này bạn có chú thích là ban đầu cho các LED đều hiển thị 0 hết. Thế thì chỉ cần viết thế này thôi chứ:
Code:

        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'00000000'
        MOVWF                PORTB

hoặc thế này nếu bạn muốn PORTB cuối cùng có giá trị b’1110 0000’
Code:

        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'11100000'
        MOVWF                PORTB


Không hiểu bạn thay đổi liên tục giá trị ghi vào cổng B như vậy để làm gì. Nhưng nên nhớ là 1 lệnh của PIC thường chiếm có 1 chu kỳ máy, nghĩa là nếu bạn dùng thạch anh dao động 4 MHz, mỗi lệnh chỉ xảy ra trong 1us, rất rất nhỏ. Vậy bạn thay đổi PORTB liên tục như thế chẳng có ý nghĩa gì cả.

Ở phần khởi tạo Timer1 chỉ viết thế này là đủ:
Code:

        CLRF        T1CON
        CLRF        INTCON
        BSF                STATUS,RP0
        CLRF        PIE1
        BSF                PIE1,TMR1IE
        BCF                STATUS,RP0
        CLRF        PIR1
        MOVLW        0X27
        MOVWF        TMR1H
        MOVLW        0X10
        MOVWF        TMR1L

Tuy nhiên, nếu bạn muốn tạo ngắt 1ms dùng Timer1 mà bạn lại nạp con số 0x2710, nghĩa là 10 000 dec vào TMR1H:TMR1L thì không đúng rồi. Vì timer sẽ đếm từ 0x2710 đến 0xFFFF là tràn, nghĩa là sẽ tạo 1 khoảng thời gian trễ là 0xFFFF – 0x2710 = 0xD8EF, nghĩa là 55535 microgiây hay 55.535 ms, không phải 1ms như bạn mong muốn. Vậy muốn tạo ngắt 1ms bạn phải nạp con số là:
Code:

TMR1H = 0xFC
TMR1H = 0x17

Lý do thì chắc bạn cũng tính được, theo như tôi phân tích ở trên.

Tạm thời như thế. Bạn sửa đi và nói lại cho tôi biết những lỗi xảy ra khi thiết bị hoạt động.

Thân.

Jerry 24-12-2007 01:21 PM

Thêm nữa, trong phần khởi tạo cho Timer1, bạn xoá thanh ghi INTCON, điều này làm cho bit GIE và PEIE trong thanh ghi này bị xóa. Hai bit này bị xoá thì không bao giờ có bất cứ ngắt nào xảy ra. Do vậy đoạn khởi tạo cho Timer1 bạn sửa như sau:
Code:

;==================================================================================================
;KHOI TAO TIMER1
;==================================================================================================
        CLRF        T1CON
        CLRF        INTCON

        CLRF        PIR1
        MOVLW        0XFC
        MOVWF        TMR1H
        MOVLW        0X17
        MOVWF        TMR1L

        BSF        STATUS,RP0
        CLRF        PIE1
        BSF        PIE1,TMR1IE
        BCF        STATUS,RP0

        BSF        INTCON,PEIE
        BSF        INTCON,GIE


uydanh 24-12-2007 04:05 PM

Làm như bạn hướng dẫn nó đã chạy được nhưng vẫn không ổn định, luc được lúc không (mình thử trên mạch test riêng chứ ko phải mạch đồ án)
Trích:

Nguyên văn bởi Jerry (Post 13511)
2.
Code:


        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'00000000'
        MOVWF                PORTB
        MOVLW                b'00100000'
        MOVWF                PORTB
        MOVLW                b'01000000'
        MOVWF                PORTB
        MOVLW                b'01100000'
        MOVWF                PORTB
        MOVLW                b'10000000'
        MOVWF                PORTB       
        MOVLW                b'10100000'
        MOVWF                PORTB
        MOVLW                b'11000000'
        MOVWF                PORTB
        MOVLW                b'11100000'
        MOVWF                PORTB

Đoạn này bạn có chú thích là ban đầu cho các LED đều hiển thị 0 hết. Thế thì chỉ cần viết thế này thôi chứ:
Code:


        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'00000000'
        MOVWF                PORTB

hoặc thế này nếu bạn muốn PORTB cuối cùng có giá trị b’1110 0000’
Code:


        MOVLW                b'00000000'
        MOVWF                PORTC
        MOVLW                b'11100000'
        MOVWF                PORTB

Không hiểu bạn thay đổi liên tục giá trị ghi vào cổng B như vậy để làm gì. Nhưng nên nhớ là 1 lệnh của PIC thường chiếm có 1 chu kỳ máy, nghĩa là nếu bạn dùng thạch anh dao động 4 MHz, mỗi lệnh chỉ xảy ra trong 1us, rất rất nhỏ. Vậy bạn thay đổi PORTB liên tục như thế chẳng có ý nghĩa gì cả.

À, cái này là do cái mạch của mình. Mình sử dụng 74138 để chọn led, nên 3 bit 7,6,5 của portB mình đưa vào 74138 để chọn led muốn hiển thị, bit4 bỏ, 4 bit cuối 3,2,1,0 mình đưa vào IC 7447 để giải mã từ BCD sang mã led 7 đoạn hiển thị. Lúc đầu giữa các lệnh trên mình có sử dụng delay10ms nhưng về sau thấy ko delay vẫn hiển thị tốt do đó bỏ luôn. Mình nghĩ có lẽ việc sử dụng giãi mã, chốt, IC chọn led ảnh hưởng lớn đến hoạt động của mạch.
Cái quan trọng với mình là : trong một chương trình chỉ sử dụng ngắt timer1 (vào đầu chương trình là ngắt chạy luôn) mà chạy còn thiếu ổn định ,lúc được lúc không nên khi đưa vào đồ án, chương trình chạy theo tuần tự, trong đó việc ngắt timer1 xảy ra sau các đoạn chương trình khác nên nó ko bao giờ chạy được cả, ngắt chỉ xảy ra một lần rồi thôi.

Jerry 24-12-2007 04:26 PM

Mạch test đó bạn làm những việc gì? Chương trình viết như thế nào? không ổn định như thế nào? Lúc chạy lúc không hay thế nào? Bây giờ bạn có thể làm như thế này để Test ngắt Timer1: Giả dụ bạn có 1 cái mạch nào đó có gắn LED trên chân cổng, bạn viết chương trình trễ để chớp tắt LED đi. Còn cái ngắt Timer1 thì chỉ có thế, không quá phức tạp. Không có chuyện nó chạy thiếu ổn định, chỉ là do mình quản lý hệ thống chương trình chưa tốt.

uydanh 24-12-2007 05:14 PM

Trích:

Nguyên văn bởi Jerry (Post 13518)
Mạch test đó bạn làm những việc gì? Chương trình viết như thế nào? không ổn định như thế nào? Lúc chạy lúc không hay thế nào? Bây giờ bạn có thể làm như thế này để Test ngắt Timer1: Giả dụ bạn có 1 cái mạch nào đó có gắn LED trên chân cổng, bạn viết chương trình trễ để chớp tắt LED đi. Còn cái ngắt Timer1 thì chỉ có thế, không quá phức tạp. Không có chuyện nó chạy thiếu ổn định, chỉ là do mình quản lý hệ thống chương trình chưa tốt.

Cái chương trình test của mình giống y như bạn nói, chỉ nhấp nhấp led ở portB chu kỳ 100ms. Khi nạp chương trình cho PIC, thử ngay trên mạch đó, chương trình chạy tốt. Sau đó mình tháo con PIC ra gắn qua mạch đồ án coi thử trên mạch đồ án nó chạy như thế nào, kết quả là không chạy được nhưng lắc cái dây nguồn vài lần thì lại OK (lần thử nào cũng vậy). Mình lại tháo con PIC từ mạch đồ án ra, gắn lại vào mạch test, cấm nguồn vào mạch test, nó không chạy(có nguồn đàng hoàng mà vẫn ko chạy). Lại phải cấm ra cấm vô cái dây nguồn vài lần, nó lại chạy được.
Những hiện tượng trên chỉ xảy ra khi mình viết ngắt timer1, những chương trình khác như quét phím, đọc xung từ timer0 chạy rất tốt, không việc gì cả. Mình không hiểu tại sao nữa.
Chương trình nhâp nháy led .
Code:

processor        16f877a                                                ;vi dieu khien duoc su dung la PIC16F877A cua Microchip
        include                <p16f877a.inc>                                ;header file kem theo
        __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;===================================================================================================
;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT
        W_save                EQU        0x20
        PCLATH_save        EQU        0x21
        STATUS_save        EQU        0x22
        FSR_save        EQU        0x23
        DEM                        EQU        0X24

        count1                EQU 0x25               
        counta                EQU 0x26               
        countb                EQU 0x27
;===================================================================================================

       
        ORG                0X004
        GOTO        ISR
ISR
;===================================================================================================
;DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT
        MOVWF                W_save
        SWAPF                STATUS_save,W
        CLRF                STATUS
        MOVWF                STATUS_save
        MOVF                PCLATH,W
        MOVWF                PCLATH_save
        CLRF                PCLATH
        MOVF                FSR,W
        MOVWF                FSR_save
;===================================================================================================
;CHUONG TRINH CHINH CUA NGAT
;===================================================================================================
        BTFSS        PIR1,TMR1IF
        GOTO        exit_int
        BCF                PIR1,TMR1IF

        BCF                T1CON,TMR1ON
        CLRF        T1CON
        CLRF        TMR1L
        CLRF        TMR1H
        MOVLW        0X00
        MOVWF        T1CON
        MOVLW        0XFC
        MOVWF        TMR1H
        MOVLW        0X17
        MOVWF        TMR1L
        BSF                T1CON,TMR1ON
       

        DECFSZ        DEM,1
        GOTO        exit_int
        COMF        PORTB,1
        MOVLW        D'100'
        MOVWF        DEM
        GOTO        exit_int
       
;===================================================================================================
;DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT
exit_int
        MOVF                FSR_save,W
        MOVWF                FSR
        MOVF                PCLATH_save
        MOVWF                PCLATH
        SWAPF                STATUS_save,W
        MOVWF                STATUS
        SWAPF                W_save,1
        SWAPF                W_save,0
        RETFIE


        ORG                0X0000
        GOTO        start
        ORG                0X050
;=================================================================================================
;CHUONG TRINH CHINH
;=================================================================================================
start
        BSF        STATUS, RP0        ; Select Bank 1
        MOVLW        0x06                ; Configure all pins
        MOVWF        ADCON1                ; as digital inputs
        BCF        STATUS, RP0        ; Select Bank 0


        BCF                STATUS,RP1
        BSF                STATUS,RP0
        MOVLW        0X00
        MOVWF        TRISB
        BCF                STATUS,RP0
       
        MOVLW        D'100'
        MOVWF        DEM
       

;------------------------------------------------------------------------------------------------
;KHOI TAO TIMER 1
;------------------------------------------------------------------------------------------------

        CLRF        T1CON
        CLRF        INTCON
        BSF                STATUS,RP0
        CLRF        PIE1
        BSF                PIE1,TMR1IE
        BCF                STATUS,RP0
        CLRF        PIR1
        MOVLW        0XFC
        MOVWF        TMR1H
        MOVLW        0X17
        MOVWF        TMR1L

        BSF                T1CON,TMR1ON
        BSF                INTCON,TMR1IE
        BSF                INTCON,PEIE
        BSF                INTCON,GIE


        MOVLW        B'10000110'
        MOVWF        PORTB
        GOTO        $
END

Cảm ơn bạn Jerry.

uydanh 30-12-2007 03:01 AM

Đã tìm được nguyên nhân, nhưng chưa biết giải thích tại sao.
Đoạn code chổ này
Code:

DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT
        MOVWF                W_save
        SWAPF                STATUS_save,W
        CLRF                STATUS
        MOVWF                STATUS_save
        MOVF                PCLATH,W
        MOVWF                PCLATH_save
        CLRF                PCLATH
        MOVF                FSR,W
        MOVWF                FSR_save

sửa lại "nhỏ gọn" hơn, chỉ nhiêu đây thôi
Code:

                MOVWF        W_save                                ;W_TEMP=W
                SWAPF        STATUS,0                        ;W=SWAP STATUS
                MOVWF  STATUS_save

và tất nhiên đoạn
Code:

DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT
exit_int
        MOVF                FSR_save,W
        MOVWF                FSR
        MOVF                PCLATH_save
        MOVWF                PCLATH
        SWAPF                STATUS_save,W
        MOVWF                STATUS
        SWAPF                W_save,1
        SWAPF                W_save,0

sửa thành
Code:

                SWAPF  STATUS_save,0
                MOVWF  STATUS
                SWAPF        W_save,1
                SWAPF        W_save,0

chương trình chạy rất ổn định, cũng ko biết tại sao nữa mà thời gian nộp đồ án cũng sắp đến rồi, không kịp để suy nghĩ nữa.


Múi giờ GMT. Hiện tại là 01:11 AM.

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