PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 05-02-2006, 10:01 AM   #16
nily
Nhập môn đệ tử
 
nily's Avatar
 
Tham gia ngày: Oct 2005
Bài gửi: 3
:
cảm ơn nhiều ,chúc mau bình phục và chúc mừng năm mới luôn .
__________________
nilyforever
nily vẫn chưa có mặt trong diễn đàn  
Old 05-02-2006, 10:55 PM   #17
hungkhanh
Nhập môn đệ tử
 
Tham gia ngày: Feb 2006
Bài gửi: 1
:
Trong bài 2, có một đoạn code mình không hiểu cho lắm?

Code:
Đoạn chương trình 2:
MOVLW d’255’
MOVWF delay‐reg1 ; đưa giá trị 255 vào thanh ghi “delay‐reg1”
loop
DECFSZ delay‐reg1,0 ; giảm giá trị thanh ghi “delay‐reg1”và so sánh với 0
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ; đưa vào thanh ghi “delay‐reg2” giá trị 255
DECFSZ delay‐reg2,0 ; giảm giá trị thanh ghi “delay‐reg2” và so sánh với 0
MOVWF loop1 ; nếu chưa bằng 0 thì nhảy đến label “loop1”
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next
Thử phân tích một chút. Bây giờ ta sẽ xem xét đoạn code sau chạy từ đầu như thế nào

Code:
MOVLW d’255’
MOVWF delay‐reg1 ; đưa giá trị 255 vào thanh ghi “delay‐reg1”
loop
DECFSZ delay‐reg1,0 ; giảm giá trị thanh ghi “delay‐reg1”và so sánh với 0; GIÁ TRỊ ĐƯỢC GHI TRONG DELAY-REG1 GIẢM 1 THÀNH 244, SAU ĐÓ GIÁ TRỊ 244 ĐƯỢC GHI VÀO W-REGISTER, CÒN GIÁ TRỊ ĐƯỢC GHI TRONG DELAY-RED1 VẪN GIỮ NGUYÊN LÀ 255
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ; đưa vào thanh ghi “delay‐reg2” giá trị 255
DECFSZ delay‐reg2,0 ; giảm giá trị thanh ghi “delay‐reg2” và so sánh với 0. TƯƠNG TỰ NHƯ TRÊN, GIÁ TRỊ ĐƯỢC DÁN CHO DELAY-REG2 SAU KHI THỰC HIỆN LỆNH NÀY VẪN LÀ 255
MOVWF loop1 ; nếu chưa bằng 0 thì nhảy đến label “loop1”
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next
Dó đó, đoạn code sau sẽ delay với khoảng thời gian là infinity.

Đoạn code sau sẽ đúng ghi ta thay đổi 0 thành 1 để sau khi thực hiện kệnh, giá trị sẽ được ghi vào file register. Ngoài ra, còn một chỗ không ổn ở chỗ loop1. Thử phân tích:

- Đầu tiên gán giá trị 255 vào dalay-reg2.
- giảm giá trị của delay-reg2 và so sánh với 0, nếu khác 0 thì thực hiện lệnh tiếp theo. (do ban đầu giá trị là 255 nên giảm 1 còn 254, khác 0 nên sẽ thực hiệ lênh tiếp theo, tức goto loop1)
- lại set giá trị của delay-reg2 là 255.
- giảm gias trị đi 1 và so sánh với 0.
....
như vậy, riêng loop1 cũng thực với với thời gian là infinity dù ở lệnh DECFSZ có để giá trị tham số là 1 hay 0.

vì vậy, ngoài sửa lại giá trị tham số của lệnh DECFSZ từ 0 thành 1, cần đưa phần gán giá trị 255 cho delay-reg2 ra ngoài vòng lặp, đặt nó ở cùng vị trí với chỗ gán giá trị 255 cho delay-reg1.

chắc là NTC đau chân quas nên không chú ý chỗ này ;D


Btw, cho mình hỏi một câu rất dở hơi, thạch anh tên tiếng Anh là gì vậy? có bạn nào giải thích cho mình biết thạch anh là gì không, mình hiểu nó là dùng để tạo xung, nhưng cụ thể hơn thì không biết. Mong được giúp đỡ.
hungkhanh vẫn chưa có mặt trong diễn đàn  
Old 06-02-2006, 09:40 AM   #18
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Xin lỗi các bạn, đoạn chương trình trên đã có sự nhầm lẫn, F đã được báo về vẫn đề lỗi chương trình ngay từ hôm đầu NTC post lên, nhưng vẫn không có thời gian sửa chữa chương trình. Có lẽ các bạn vào đây thường xuyên thì cũng biết F đang làm việc gì. Vì vậy, thành thật xin lỗi các bạn vì sự lầm lẫn trên.

Nếu bạn nào có thời gian, xin sửa chữa giúp đoạn code trên để bạn đọc không bị vướng vào lỗi sai này nữa.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 06-02-2006, 10:07 AM   #19
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Code:
MOVLW d’255’
MOVWF delay‐reg1 ; đưa giá trị 255 vào thanh ghi “delay‐reg1”
loop
DECFSZ delay‐reg1,0 ; giảm giá trị thanh ghi “delay‐reg1”và so sánh với 0
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ; đưa vào thanh ghi “delay‐reg2” giá trị 255
DECFSZ delay‐reg2,0 ; giảm giá trị thanh ghi “delay‐reg2” và so sánh với 0
MOVWF loop1 ; nếu chưa bằng 0 thì nhảy đến label “loop1”
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next
Xin lỗi các bạn vì hiện nay diễn đàn đang được sửa chữa, vì vậy không thể trình bày tốt được.

F sửa luôn đoạn code trên để tránh các bạn mắc lỗi sai. Bản sửa sẽ được NTC cập nhật lại sau:

Code:
MOVLW d’255’
MOVWF delay_reg1 ; đưa giá trị 255 vào thanh ghi “delay_reg1”
loop
DECFSZ delay_reg1, F ; giảm giá trị thanh ghi “delay_reg1”và so sánh với 0 và ghi lại vào delay-reg1
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
MOVLW d’255’
MOVWF delay_reg2 ; đưa vào thanh ghi “delay_reg2” giá trị 255

DECFSZ delay_reg2, F ; giảm giá trị thanh ghi “delay_reg2” và so sánh với 0 và ghi lại vào delay_reg2
GOTO $-1 ; nếu chưa bằng 0 thì nhảy lên trên để tiếp tục giảm delay_reg2
; vòng lặp này nhằm giảm delay_reg2 về đến 0
; thời gian giảm delay_reg2 chính là thời gian delay_trong vòng lặp con.
GOTO loop ; nếu bằng 0 thì nhảy đến label “loop”
next
Cách viết hai:

À thôi, H hiểu vì sao NTC viết sai rồi... oki,

để F nói NTC sửa lại sau ... sorry cả nhà...

Chúc vui...

thay đổi nội dung bởi: falleaf, 12-02-2006 lúc 01:38 PM.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 06-02-2006, 10:18 AM   #20
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Trong cách viết trên, F cũng đồng thời chỉ ra hai cách viết cho lệnh GOTO.

Code:
LOOP   GOTO    LOOP


Code:
GOTO  $
Hai cách viết này tương đương nhau. Trong đó, $ thay cho vị trí con trỏ tại vị trí lệnh đang thực hiện.

Chính vì vậy, trong đoạn code trên, thay vì viết

Code:
loop
DECFSZ delay_reg1, F ; giảm giá trị thanh ghi “delay_reg1”và so sánh với 0 và ghi lại vào delay-reg1
GOTO loop1 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
loop1
...
Chúng ta co thể thay thành:

Code:
loop
DECFSZ delay_reg1, F ; giảm giá trị thanh ghi “delay_reg1”và so sánh với 0 và ghi lại vào delay-reg1
GOTO $+2 ; nếu chưa bằng 0 nhảy tới label “loop1”
GOTO next ; nếu đã băng 0 chương trình delay hoàn tất
...
Và đoạn code phía dưới:

Code:
loop1
MOVLW d’255’
MOVWF delay_reg2 ; đưa vào thanh ghi “delay_reg2” giá trị 255

DECFSZ delay_reg2, F ; giảm giá trị thanh ghi “delay_reg2” và so sánh với 0 và ghi lại vào delay_reg2
GOTO $-1 ; 
...
chúng ta co thể thay lại thành:

Code:
loop1
MOVLW d’255’
MOVWF delay_reg2 ; đưa vào thanh ghi “delay_reg2” giá trị 255
loop2
DECFSZ delay_reg2, F ; giảm giá trị thanh ghi “delay_reg2” và so sánh với 0 và ghi lại vào delay_reg2
GOTO loop2;
...
Chúc vui.

thay đổi nội dung bởi: falleaf, 12-02-2006 lúc 01:40 PM.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 06-02-2006, 01:53 PM   #21
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Cảm ơn bạn hungkhanh đã phát hiện ra các lỗi sai của bài 2. Xin lỗi cả làng nghe, mình sẽ chỉnh sửa lại gấp.
__________________

ntc vẫn chưa có mặt trong diễn đàn  
Old 10-02-2006, 10:37 AM   #22
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Đây là bản đã được chỉnh sửa. Phần chỉnh sửa là phần tô màu đỏ trong tài liệu. Mọi người dowwnload lại rồi xem luôn nhé.
File Kèm Theo
File Type: pdf TUT02.03.PVN.NTCR.210106.pdf (413.2 KB, 16908 lần tải)
__________________

ntc vẫn chưa có mặt trong diễn đàn  
Old 12-02-2006, 01:19 PM   #23
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Bác ntc post tiếp các phần tiếp theo cho anh em tham khảo!Đợi bác mãi sốt ruột quá!
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 14-02-2006, 08:08 AM   #24
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
BẬT TẮT LED 1s

Code:
;========================================
;Auhor:		NHH
;Date:		10/02/06
;Hardware:	PIC16F877A 
		;XTAL 10MHz, PORTB noi voi 8 LED qua 8 dien tro 220Ohm 
;========================================
	TITLE 		"ON-OFF LED 1 SECOND"
	PROCESSOR	PIC16f877A 
	INCLUDE<P16f877A.inc> 
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;=============================================================================	
	COUNT1 EQU 0x20
	COUNT2 EQU 0x21
	COUNT3 EQU 0x22
;=========================CHUONG TRINH CHINH=========================
	ORG 0x000
	GOTO 	MAIN

MAIN
	BCF STATUS,RP1
	BSF STATUS,RP0 		; select BANK 1
	CLRF TRISB 		; PORTB output
	BCF STATUS,RP0 		;  select BANK 0

	MOVLW	d'255'
	MOVWF	COUNT1		;<-COUNT1=255	
	MOVWF	COUNT2		;<-COUNT2=255
NEXT	
	MOVLW	d'14'
	MOVWF	COUNT3		;<-COUNT3=13
	MOVLW	b'11111111'	;LED ON
	MOVWF	PORTB
	CALL	LOOP

	MOVLW	d'14'
	MOVWF	COUNT3		;<-COUNT3=13
	MOVLW	b'00000000'	;LED OFF
	MOVWF	PORTB	
	CALL	LOOP
	
	GOTO	NEXT		
;========================CHUONG TRINH CON====================
LOOP
	DECFSZ	COUNT1,1
	GOTO	LOOP
	DECFSZ	COUNT2,1
	GOTO	LOOP
	DECFSZ	COUNT3,1
	GOTO	LOOP		
	RETURN
		
	END
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263

thay đổi nội dung bởi: nhh, 17-02-2006 lúc 10:12 AM.
nhh vẫn chưa có mặt trong diễn đàn  
Old 14-02-2006, 08:10 AM   #25
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
;hex File
;====================
:020000040000fa
:1000000001280313831686018312ff30a000a1008c
:100010000d30a200ff30860013200d30a20000300a
:10002000860013200828a00b1328a10b1328a20b6d
:040030001328080089
:02400e00323f3f
:00000001ff
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 14-02-2006, 10:01 AM   #26
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Ai phân tích đoạn chương trình này nào?

Lưu ý là có đoạn goto LOOP về chung, và lưu ý rằng khi 0 - 1 = 255 <> 0, nên sẽ không bị nhảy về LOOP trở lại nhé

Công thức tính thời gian delay ở đây được tính như thế nào? Mời các bạn tham gia tính toán con số chính xác.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 15-02-2006, 01:19 PM   #27
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Ặc ăc !! Viết chương trình delay như vậy thì tính thời gian delay cũng chua lắm đó. Bà con thử phân tích coi. Đây cũng là một đề bài thú vị. Chú ý là mhh sử dụng thạch anh 10 MHz.
nhh đã nạp vào PIC và chạy thử chưa. Nhìn sơ qua có cái gì đó không ổn.
__________________

ntc vẫn chưa có mặt trong diễn đàn  
Old 15-02-2006, 02:49 PM   #28
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Cách tính khá đơn giản, không phải quá khó đâu em, anh đã viết gợi ý rồi, nhưng xoá đi để mọi người cùng thảo luận.

Anh cũng chưa tính ra con số cụ thể, nhưng nếu biết cách tính khéo léo thì rất là hay. Đoạn code này là một thủ thuật viết hàm delay khá thú vị.

Bây giờ giả sử loop 3 vòng như thế này, các giá trị count1, count2, count3 là a, b, và c. Vậy công thức tổng quát của còng lặp này là bao nhiêu chu kỳ máy?

Đây là câu hỏi!

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 15-02-2006, 02:52 PM   #29
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Tất nhiên, phải chỉ ra điều kiện ràng buộc của a, b và c. Nếu như mình làm 1 vòng, 2 vòng, 3 vòng lặp thì giá trị a, b, c phải là bao nhiêu?

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 17-02-2006, 09:06 AM   #30
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi ntc
Ặc ăc !! Viết chương trình delay như vậy thì tính thời gian delay cũng chua lắm đó. Bà con thử phân tích coi. Đây cũng là một đề bài thú vị. Chú ý là mhh sử dụng thạch anh 10 MHz.
nhh đã nạp vào PIC và chạy thử chưa. Nhìn sơ qua có cái gì đó không ổn.
nhh đã chạy thử rồi mới dám post lên chứ!Bác ntc thử chạy xem sao?
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá

Ðiều Chỉnh
Xếp Bà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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT về USART trong PIC16F877A mafd_47a MPASM 16 19-02-2025 05:32 AM
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 28 28-01-2025 10:45 PM
Lập nhóm PIC16F877A nhh Cơ bản về vi điều khiển và PIC 285 08-03-2017 11:08 PM
Bộ so sánh và PWM cho PIC16F877A anhquangngai Cơ bản về vi điều khiển và PIC 24 08-09-2012 09:00 AM
CCS C for PIC16F877A nhh Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) 405 24-04-2008 12:00 PM


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


Đượ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