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 30-08-2009, 08:37 PM   #1
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
lệnh MOVF và lệnh MOVLW

các bác cho em hỏi lệnh MOVF và lệnh MOVLW khác nhau ở chỗ nào vậy ạ????
trong đoạn code làm sáng led portb, nếu em viết:
MOVLW b'11111111'
MOVWF PORTB
thì led ở portb sáng, tuy nhiên nếu em viết:
MOVF b'11111111'
MOVWF PORTB
thì led ở portb lại chỉ sáng có một bóng

mong các bác chỉ giúp em về sự khác biệt này
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-08-2009, 09:37 PM   #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ích:
Nguyên văn bởi congtri91 View Post
các bác cho em hỏi lệnh MOVF và lệnh MOVLW khác nhau ở chỗ nào vậy ạ????
trong đoạn code làm sáng led portb, nếu em viết:
MOVLW b'11111111'
MOVWF PORTB
thì led ở portb sáng, tuy nhiên nếu em viết:
MOVF b'11111111'
MOVWF PORTB
thì led ở portb lại chỉ sáng có một bóng

mong các bác chỉ giúp em về sự khác biệt này
MOVLW k sẽ copy giá trị k vào thanh ghi W, còn MOVF f, d sẽ copy giá trị của thanh ghi f vào thanh ghi đích (W hoặc f, tùy theo d = 0 hay 1).

Ở đoạn code dùng MOVF của bạn, bạn không mô tả tham số thứ hai của lệnh MOVF. Do đó, nếu trình dịch mặc định nó là '0' thì giá trị của thanh ghi 0xFF sẽ được copy vào W, còn nếu trình dịch mặc định nó là '1' thì giá trị của thanh ghi 0xFF sẽ được copy vào chính nó, còn W không bị ảnh hưởng. Cả hai trường hợp đều không đảm bảo là W sẽ được đặt giá trị 0xFF như trong đoạn code đầu tiên của bạn. Do đó, kết quả chạy khác nhau là dễ hiểu.

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
Old 30-08-2009, 11:46 PM   #3
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
tiện đường cho em hỏi lệnh SET và lệnh EQU khác nhau chỗ nào với ạ???
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2009, 01:06 PM   #4
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
hình như đã bắt đầu hiểu lơ tơ mơ, thế cho hỏi cái đoạn code này

;---------------------------------------------------------------------------------------------------------------
;Khai báo hằng
;---------------------------------------------------------------------------------------------------------------
SW1 EQU 0
SW2 EQU 1
SW3 EQU 2
SW4 EQU 3
LED1 EQU 4
LED2 EQU 5
LED3 EQU 6
LED4 EQU 7
;----------------------------------------------------------------------------------------------------------------
;khai báo biến
;----------------------------------------------------------------------------------------------------------------
count EQU 0x20
count1 EQU 0x21
counta EQU 0x22
countb EQU 0x23

tại sao lại chỉ dùng một lệnh EQU, nếu đúng thì phần khai báo biến phải là SET chứ
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2009, 01:09 PM   #5
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
không lẽ nếu viết
SW1 EQU 0 thì SW1 là hằng nhưng nếu viết SW1 EQU 0x20 thì SW1 là biến à?????
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2009, 07:31 PM   #6
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
nghe đau đầu nhỉ, nội dung thí dụ như là SW có giá trị 0x20 còn địa chỉ thì SW có địa chỉ 0x20, sao mà na ná nhau quá trời. tuy nhieen cậu bảo "Khi đã dùng EQU thì SW1 không thể thay đổi được giá trị nữa, nó luôn là 0x20" vậy thì làm sao có thể đưa giá trị vào mấy biến count, count1, counta, countb
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2009, 07:59 PM   #7
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
Tôi thấy hai bạn trao đổi từ luồng "kỹ thuật bảng pic" sang luồng này mà cảm thấy buồn vì các bạn đọc đi đọc lại mà vẫn không hiểu tài liệu viết cái gì. Tôi lược dịch hai phần liên quan trong tài liệu "MPASM Assembler; MPLINK Object Linker; MPLIB Object Librarian User's Guide" (DS33014J) để hai bạn đọc thêm:

Trích:
equ - DEFINE AN ASSEMBLER CONSTANT

Cú pháp: label equ expr

Mô tả: giá trị của expr được gán cho label.

Cách dùng: Trong một tập tin chương trình hợp ngữ, equ thường được dùng để gán một địa chỉ trong RAM cho một tên biến. Đừng dùng phương pháp này để gán các biến khi xây dựng một project có liên kết; hãy dùng res trong một section dữ liệu (idata, udata).

set - DEFINE AN ASSEMBLER VARIABLE

Cú pháp: label set expr

Mô tả: label được gán giá trị của biểu thức MPASM hợp lệ biểu diễn bởi expr. Dẫn hướng set về chức năng tương đương với dẫn hướng equ, ngoại trừ rằng các giá trị được thiết lập có thể được thay đổi bởi các dẫn hướng set khác.

Cách dùng: Vì các giá trị thiết lập bởi set có thể được thay đổi bởi các dẫn hướng set sau đó, set đặc biệt hữu dụng khi định nghĩa một biến trong một vòng lặp (chẳng hạn, một vòng lặp while).
Các bạn chú ý rằng hằng hay biến được đề cập ở đây là đối với trình hợp dịch, chứ không phải đối với PIC. Do đó, label đã được gán giá trị bởi EQU sẽ không được trình hợp dịch chấp nhận bị thay đổi sau đó, còn label đã được gán giá trị bởi SET sẽ được trình hợp dịch cho phép bị thay đổi giá trị sau đó bởi một dẫn hướng SET khác. Hy vọng mọi việc đã rõ.

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
Old 31-08-2009, 08:36 PM   #8
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
hơ hơ, xin lỗi anh vì cứ chuyển luồng tùm lum, vấn đề kỹ thuật bảng cho pic thì em đã nắm được, tuy nhiên vấn đề về lệnh SET và EQU thì quả thực em rất rối, chắc tại em ngu lâu dốt bền khó đào tạo nên tự học khá khó khăn. anh có thể cho em một vài ví dụ để em nắm rõ hơn được không ạ???? cảm ơn anh nhiều lắm
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2009, 08:58 PM   #9
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ích:
Nguyên văn bởi ngocthanh07 View Post
Dear anh Nam,
-Thứ nhất, Em không có lập trình ASM cho PIC này, nhưng em thấy bạn quan tâm ASM nên thấy hay và cố gắng tìm giúp bạn vài thông tin thôi. Giữa lúc các bạn khác cứ hè nhau bảo người ta hãy bỏ ASM đi, viết bằng C thì sẽ có người chỉ(ngay bài thứ ba cái luồn về kĩ thuật bảng). Thì anh nghĩ một người không hiểu ASM có nên viết C không ?. Mà sao anh lại buồn, vấn đề với anh không có gì là khó vì anh là Tiến sĩ, anh học trước tụi em hàng chục năm(đúng ra em phải gọi anh là thầy) chứ với người khác chưa chắc đã dễ đâu, bạn congtri91 đang bị vướng ở cái chỗ rất căn bản, nhưng bạn ấy có lòng chịu học và chịu hỏi vậy có gì mà đáng buồn đâu? Các bạn khác vì muốn nhanh chống viết được mà dùng C ào ào, nhưng chưa chắc họ đã hiểu cặn kẽ vấn đề hơn bạn congtri đâu, vậy đó mới là điều đáng buồn chứ ?
-Thứ hai, em đâu có lập trình cho PIC này đâu mà đọc thêm làm gì, nếu cần chỗ nào thì lấy ra đọc thôi !
Chào anh, chúc anh vui.
Chào bạn,

Tôi không hề có ý chê bai bạn hay bất kỳ ai. Tôi buồn vì một thực tế là sinh viên VN vẫn còn một rào cản ngoại ngữ khá lớn, dẫn đến nhiều khó khăn cho việc học tập. Nếu tôi không muốn giúp các bạn hiểu cặn kẽ thì tôi tốn thời gian và công sức giải thích để làm gì.

Riêng bạn, tôi tôn trọng ý tốt của bạn, nhưng mong bạn nếu có giúp các thành viên khác thì hãy dành chút thời gian tìm hiểu kỹ những gì mình sẽ phát biểu, để việc giúp đỡ có hiệu quả hơn.

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
Old 31-08-2009, 09:10 PM   #10
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ích:
Nguyên văn bởi congtri91 View Post
hơ hơ, xin lỗi anh vì cứ chuyển luồng tùm lum, vấn đề kỹ thuật bảng cho pic thì em đã nắm được, tuy nhiên vấn đề về lệnh SET và EQU thì quả thực em rất rối, chắc tại em ngu lâu dốt bền khó đào tạo nên tự học khá khó khăn. anh có thể cho em một vài ví dụ để em nắm rõ hơn được không ạ???? cảm ơn anh nhiều lắm
Cứ lấy ngay những ví dụ mà bạn đã post lên.

SW1 EQU 0 dùng để gán giá trị 0 cho nhãn SW1, chẳng hạn như bạn đã nối công tắc có tên SW1 vào vị trí bit 0 của một port nào đó (PORTA chẳng hạn). Sau đó bạn sẽ có thể dùng SW1 như vị trí của bit trong các lệnh thao tác bit, để cho gợi nhớ hơn.

Còn count EQU 0x20 dùng để gán giá trị 0x20 cho nhãn count, nhưng bạn có thể dùng count trong các lệnh thao tác byte, ở đó bạn dùng count như một địa chỉ của byte được thao tác.

Chính xác thì cả SW1 lẫn count đều là các hằng số đối với trình hợp dịch, nhưng chúng được dùng hơi khác nhau nên người ta có thể chú thích chúng khác nhau. Nếu SW1 chỉ đến một vị trí bit thì vẫn có thể coi nó đại diện cho một biến 1-bit. Chẳng hạn như với LED1 EQU 4, bạn hoàn toàn có thể bật/tắt biến 1-bit LED1 trong chương trình của bạn. Khi nói LED1 hay count là biến, chúng ta đang nói đến các vị trí nhớ trong RAM của PIC, cho phép đọc/ghi một cách ngẫu nhiên.

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
Old 03-09-2009, 02:15 PM   #11
congtri91
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 59
:
cuối cùng cũng hiểu được chút chút
congtri91 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-06-2010, 11:50 PM   #12
kaszuky
Đệ tử 2 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 36
:
Luồng này đã lâu rồi nhưng mình xin góp chút ý kiến để các bạn sau này có tìm thì hy vọng sẽ có thêm thông tin hữu ích!

Sự khác nhau giữa 2 lệnh thì ko bàn cải nữa vì trên đó anh namqn đã dịch từ tài liệu tiếng anh sang tiếng việt rồi. Lý thuyết mình đọc thì cũng y như thế.

Thực ra ở đây nó phụ thuộc vào cái lệnh mà bạn dùng:
Giả sử bạn đặt thế này
count EQU 0x20
hoặc count SET 0x20

nếu như bạn dùng lệnh MOVLW count thì ở đây nó sẽ làm công việc là đưa giá trị 0x20 vào trong thanh ghi WREG
Còn nếu bạn dùng lệnh MOVF count,W thì nó sẽ nạp giá trị có được trong thanh ghi ở ô có địa chỉ là 0x20 trong RAM vào thanh ghi W (ở đây ô đó được đặt tên là count).

theo ý hiểu của mình thì nó được dùng như hằng số hay được dùng như tên gợi nhớ cho 1 địa chỉ thanh ghi thì phụ thuộc vào câu lệnh và cách sử dụng của bạn.

Thân.
kaszuky 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à 12:29 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