PDA

View Full Version : Chương trình ngắt cho timer1 thế này mà chạy không được !


uydanh
22-12-2007, 10:17 AM
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:

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 :

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
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.

;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:

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 :

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

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:

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
1. Thiếu phần định nghĩa các chân cổng là digital I/O

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)

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.
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:

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

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.
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ứ:

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’

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à đủ:

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à:

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:

;================================================= =================================================
;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)

2.


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ứ:


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’


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
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 .

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

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

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

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

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

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.

namqn
30-12-2007, 06:04 AM
Khi sao lưu các thanh ghi đặc biệt như FSR, STATUS, PCLATH, và W trong chương trình xử lý ngắt, nhất thiết phải dùng các thanh ghi có thể truy xuất từ một bank bất kỳ, vì ngắt có thể xảy ra ở bất kỳ thời điểm nào, nên bank hiện thời dùng để truy xuất các thanh ghi dữ liệu có thể là bất kỳ giá trị nào từ 0 đến 3. Vì lý do đó, các thanh ghi 0xF0 - 0xFF, 0x170 - 0x17F, và 0x1F0 - 0x1FF được ánh xạ vào các thanh ghi 0x70 - 0x7F trong PIC16F877A. Trong trường hợp PIC không có tính năng này, các thanh ghi dùng để sao lưu cần phải được khai báo ở mọi bank, tại địa chỉ tương ứng.

Bạn chỉ cần sửa địa chỉ cho các thanh ghi FSR_save, STATUS_save, PCLATH_save, và W_save như sau, thì sẽ có thể dùng khung chương trình xử lý ngắt chuẩn mà bạn đã tham khảo:

W_save EQU 0x70
PCLATH_save EQU 0x71
STATUS_save EQU 0x72
FSR_save EQU 0x73

Những điều trên đã được đề cập đến trong mục 14.12 - Context Saving During Interrupts, trong datasheet của PIC16F877A.

Thân,