![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| 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 |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
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 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 Đ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 đỡ. |
|
|
|
|
#2 |
|
PIC Bang chủ
|
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.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
#3 |
|
PIC Bang chủ
|
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 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 À 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...
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? thay đổi nội dung bởi: falleaf, 12-02-2006 lúc 01:38 PM. |
|
|
|
|
#4 |
|
PIC Bang chủ
|
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 $ 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 ... 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 ... 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 ; ... 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; ...
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? thay đổi nội dung bởi: falleaf, 12-02-2006 lúc 01:40 PM. |
|
|
|
|
#5 |
|
Đệ tử 8 túi
|
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.
|
|
|
|
|
#6 |
|
Đệ tử 8 túi
|
Đâ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é.
|
|
|
|
|
#7 |
|
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 1
: |
Tôi đã down cái tutorial của NTC và thấy khó hiểu ở đoạn delay sau:
movlw 20 movwf delay-reg loop decfsz delay-reg,1 goto loop ... Tại sao tổng số chu kỳ lệnh để thực hiện đoạn delay trên là: (20+1)3ti? theo tôi tính thì chỉ có [(20-1)3+2+2 ]ti. Tác giả còn nói là nếu nạp vào reg_delay già trị là N thì Tdelay=(N+1)3ti? Tôi mới học pic nên còn non lắm.Mong các bác giúp thêm thanks! |
|
|
![]() |
|
|
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 |