PDA

View Full Version : lệnh MOVF và lệnh MOVLW


congtri91
30-08-2009, 08:37 PM
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

namqn
30-08-2009, 09:37 PM
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,

congtri91
30-08-2009, 11:46 PM
tiện đường cho em hỏi lệnh SET và lệnh EQU khác nhau chỗ nào với ạ???

congtri91
31-08-2009, 01:06 PM
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
31-08-2009, 01:09 PM
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
31-08-2009, 07:31 PM
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

namqn
31-08-2009, 07:59 PM
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:

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,

congtri91
31-08-2009, 08:36 PM
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

namqn
31-08-2009, 08:58 PM
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,

namqn
31-08-2009, 09:10 PM
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,

congtri91
03-09-2009, 02:15 PM
cuối cùng cũng hiểu được chút chút

kaszuky
10-06-2010, 11:50 PM
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.