PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 22-12-2007, 10:17 AM   #1
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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

thay đổi nội dung bởi: uydanh, 22-12-2007 lúc 10:20 AM. Lý do: Quên chú thích biến demtimer1
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-12-2007, 06:01 PM   #2
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-12-2007, 07:00 PM   #3
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-12-2007, 12:09 AM   #4
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Đ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

thay đổi nội dung bởi: uydanh, 23-12-2007 lúc 10:38 AM. Lý do: Sửa nhầm
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-12-2007, 10:23 AM   #5
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Đ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.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-12-2007, 10:01 PM   #6
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
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
Old 24-12-2007, 11:23 AM   #8
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2007, 12:07 PM   #9
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Trích:
Nguyên văn bởi Jerry View Post
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 View Post
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 View Post
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.

thay đổi nội dung bởi: uydanh, 24-12-2007 lúc 12:21 PM.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2007, 01:10 PM   #10
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2007, 01:21 PM   #11
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2007, 04:05 PM   #12
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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 View Post
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.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2007, 04:26 PM   #13
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2007, 05:14 PM   #14
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Trích:
Nguyên văn bởi Jerry View Post
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-12-2007, 03:01 AM   #15
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Đã 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.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam