View Single Post
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