View Single Post
Old 24-12-2007, 12:56 AM   #7
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn