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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 14-01-2008, 11:06 PM   #1
angel_eyes
Nhập môn đệ tử
 
Tham gia ngày: Oct 2006
Bài gửi: 2
:
Trích:
Nguyên văn bởi wicamb View Post
chào cả nhà.Là 1 người mới bắt đầu về Pic nên em cũng có 1 vài câu hỏi,mà tinh thần thì cũng như bạn "anhdk" vậy.Vi e thấy mục này thich hợp nên muốn hỏi 1 câu:
Nếu viết 1 đoạn chương trình delay đơn giản có nội dung

..... ;các lệnh ở trên


MOVLW 0x20 ;đưa giá trị 20h vào W
MOVWF delay_reg ;gán W cho delay_reg
loop
DECFSZ delay_reg ;giảm giá trị của delay_reg
;và so sánh với 0
GOTO loop

..... ;các lệnh khác

(thạnh anh 4MHz)
gọi t1 là thời gian của 1 chu kì lệnh thì
thời gian của đoạn delay la 3*t1*(N+1)(ở đây N=20)

tại sao lại là N+1 mà không phải N,e đếm thử mà
thấy chưa hợp lí? Nhờ mọi người giải thich tường minh cho
e đoạn này ,xin cảm ơn
Em cũng thắc mắc chỗ này trong cái tut02.pdf của diễn đàn về Delay. Em đã thử đếm thì rõ ràng nếu N = 20 thì sẽ có 19 vòng lặp chương trình thực hiện đủ 2 lệnh DECFSZ và GOTO (tốn 3 chu kỳ lệnh). Tới vòng cuối cùng, lúc đó giá trị thanh ghi W là 1 và lệnh DECFSZ sẽ giảm nó về 0, sau đó so sánh với 0. Vì lúc này giá trị = 0 nên nó sẽ không thực hiện lệnh GOTO nữa mà thay vào đó bằng lệnh NOP (1 chu kỳ).
Như vậy tổng số chu kỳ thực hiện sẽ là 3*19 + 2 chứ đâu phải là 3*(20+1) như bài viết. Như vậy công thức 3*(N+1)*t1 là không đúng. Ngay cả 3*N*t1 cũng không đúng vì ở vòng lặp cuối, lệnh sau DECFSZ sẽ được bỏ qua và thay bằng NOP.
Mọi người có thể giải thích rõ chỗ này không ạ ?
angel_eyes vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-01-2008, 12:00 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trả lời cho hai bạn wicamb và angel_eyes, cùng những bạn khác đã và sẽ có thắc mắc về cách tính thời gian trễ (trì hoãn) này. Với đoạn code dưới đây:
Code:
	movlw	D'20'
	movwf	cnt
wait
	decfsz	cnt
	goto	wait
lệnh goto sẽ được thực thi 19 lần, và khi cnt giảm từ 1 xuống 0, lệnh goto sẽ bị bỏ qua, thay bằng một lệnh nop. Thời gian thực thi của đoạn code này là (2 + 19*3 + 2) chu kỳ máy. 2 chu kỳ máy đầu tiên dành cho 2 lệnh movlw và movwf.

Tổng quát, nếu bạn thay 20 bằng N (0 < N <= 255), thời gian thực thi của đoạn code trên sẽ là (2 + (N-1)*3 + 2) chu kỳ máy. Viết gọn lại là (3*N + 1).

Tutorial của Chính tính không chính xác, và thời gian đó tôi đã không kiểm tra code trong tutorial.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ð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


Múi giờ GMT. Hiện tại là 02:41 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