Tải bản đầy đủ (.pdf) (12 trang)

Học PIC trong 1 ngày - Phần 6 pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (156.94 KB, 12 trang )

Hướng dẫn về thanh ghi W

Thanh ghi W



Trong bài này, chúng ta nói đôi nét về thanh ghi W để các bạn nắm rõ hơn phương
thức hoạt động của PIC.

Khái niệm thanh ghi W:

Thanh ghi W là thanh ghi làm việc (Working register), và hầu hết mọi lệnh của PIC
đều liên quan đến thanh ghi W này, lấy thí dụ như ADDLW (cộng một số vào giá trị
đã có trong thanh ghi W), SUBWF (trừ giá trị của thanh ghi W cho một thanh ghi
khác), XORLW (lấy XOR của một số và thanh ghi W) Và các bạn để ý rằng, tổng
số lệnh có thể tương tác với thanh ghi W là 23/35 lệnh, gần như chiếm toàn bộ tập
lệnh của PIC. Vậy chúng ta ghi nhận điều thứ nhất, khi PIC làm việc, gần như luôn
luôn tương tác với thanh ghi W.

Điều thứ hai, các bạn nhìn trong bản đồ bộ nhớ dữ liệu của PIC, các bạn sẽ thấy là
thanh ghi W là thanh ghi không có mặt ở bất kỳ băng nào của bộ nhớ dữ liệu, trong
khi đó thanh ghi STATUS có mặt ở cả 4 băng. Các bạn lại thấy một điều rằng, thanh
ghi W và thanh ghi STATUS có thể được truy nhật từ tất cả các băng, và từ bất kỳ đâu
trong chương trình, và vì vậy chúng trở thành những thanh ghi toàn cục nhất. Điểm
khác biệt giữa chúng ra sao? Đâu là sự khác biệt giữa thanh ghi W và các thanh ghi
khác?

Điểm thứ ba, trong tập lệnh của PIC, không có lệnh nào cho phép tương tác trực tiếp
giữa một thanh ghi trong bộ nhớ dữ liệu dùng chung với một giá trị thêm vào, mà đều
phải thông qua thanh ghi W. Như vậy, thanh ghi W là cầu nối của hầu hết các phép
toán được thực hiện trên các thanh ghi nằm trong bộ nhớ dữ liệu.



Như vậy, thanh ghi W vô cùng quan trọng trong hoạt động của PIC.

Nhắc lại kiến trúc Harvard và Von Newmann:

Hình sau sẽ gợi lại cho các bạn nhớ về kiến trúc Harvard và Von Newmann, trong đó
các bạn luôn nhớ rằng có sự phân biệt giữa bộ nhớ dữ liệu và bộ nhớ chương trình.
Các bạn thấy rằng bus bộ nhớ chương trình của PIC midrange chỉ có 14 bit.


Với đặc điểm này, chúng ta sẽ phân tích vì sao cần phải có thanh ghi W, và sau đó
chúng ta sẽ phân tích tất cả các hoạt động của thanh ghi W trong một chương trình
viết bằng PIC, nếu có thể. Những gì còn lại, chúng ta sẽ xem trong bài tập lệnh của
PIC midrange.

Vì sao cần phải có thanh ghi W?

Bạn sẽ làm thế nào để tính phép toán sau: lấy giá trị a của thanh ghi A cộng với giá trị
b của thanh ghi B và đặt vào thanh ghi A? Một giới hạn của tập lệnh PIC là không cho
phép cộng hai thanh ghi và đặt vào một thanh ghi khác. Do đó, các bạn sẽ phải thực
hiện thao tác sau:

Chuyển giá trị b từ thanh ghi B vào thanh ghi W, sau đó lấy giá trị của thanh ghi W
(lúc này là b) cộng với giá trị a ở thanh ghi A, sau đó gán lại vào thanh ghi A. Đoạn
code được thực hiện như sau:
Code:
MOVF B, W ; chuyển giá trị của thanh ghi B vào thanh ghi
W
ADDWF A, F ; cộng giá trị của thanh ghi A với giá trị b của
thanh ghi W và gán lại vào A


Khi các thanh ghi A và B không nằm trong cùng một băng, khi thao tác với từng
thanh ghi, các bạn chỉ việc đổi về băng chứa các thanh ghi đó là xong. Một đoạn lệnh
hoàn chỉnh có thể thực hiện cho bất kỳ 2 thanh ghi nào được viết như sau:
Code:
BANKSEL B
MOVF B, W
BANKSEL A
ADDWF A, F


Đoạn chương trình này cũng minh hoạ luôn cho việc thanh ghi W là một thanh ghi
toàn cục, khi chúng ta thao tác với thanh ghi B ở một băng bấ kỳ, nhưng khi chuyển
giá trị b từ thanh ghi B vào thanh ghi W rồi, thì chúng ta không cần quan tâm rằng giá
trị đó nằm ở đâu, chỉ cần chuyển về băng chứa thanh ghi A thì lệnh cộng sẽ được thực
hiện một cách dễ dàng.

Một thí dụ khác về lệnh cộng, nhưng không phải là cộng giá trị nằm trong 2 thanh ghi,
mà là cộng giá trị a của thanh ghi A với một số k cho trước nào đó, giả sử k = 5 và lưu
vào thanh ghi A.

Chúng ta thấy rằng, hoàn toàn trong tập lệnh không có lệnh cộng trực tiếp một thanh
ghi với một số, mà chỉ có lệnh cộng một số với thanh ghi W. Như vậy chúng ta phải
thực hiện thao tác sau: chuyển giá trị a từ thanh ghi A vào thanh ghi W, cộng thanh
ghi W với hằng số k = 5, sau đó chuyển giá trị mới của thanh ghi W trở lại thanh ghi
A. Điều này được thực hiện như sau:
Code:
MOVF A, W
ADDLW d'5'
MOVWF A


Trong thí dụ này, chúng ta sẽ không thấy W là một biến tạm nữa, mà trở thành một
thanh ghi dùng để lưu kết quả cộng với một con số. Đến bây giờ, thì chúng ta sẽ giả
thích rõ hơn vì sao chúng ta phải làm như vậy.

Chúng ta thấy rõ ràng rằng, một dòng lệnh của PIC midrange, được mô tả bằng 14 bit.
Điều này có nghĩa là, khi thực hiện một lệnh cộng, không thể nào dòng lệnh đó vừa
lưu địa chỉ của thanh ghi A, vừa lưu giá trị 8 bit của hằng số k được, vì một thanh ghi
trong dòng PIC midrange cần tối thiếu 7 bit để biểu diễn địa chỉ thanh ghi, và một
hằng số chiếm 8 bit. Nó vượt quá con số 14 bit cho phép để mã hoá lệnh. Chính vì
vậy, không thể thực hiện lệnh cộng trực tiếp từ một thanh ghi với một số được. Quay
lại thí dụ ở trên, chúng ta cũng thấy rằng không thể thực hiện việc cộng hai thanh ghi
với nhau, nếu như cần lưu 2 địa chỉ thanh ghi, chúng ta sẽ mất 14 bit, và như vậy
không có các bit mã hoá mô tả lệnh cần thực hiện là gì.

Đây chính là điểm khác biệt giữa tập lệnh RISC và tập lệnh CISC. Tập lệnh CISC có
thể thực hiện lệnh phức, vì nó có thể tạo ra một lệnh dài 8 bit, 16 bit, 24 bit và là bộ
số của 8 bit. Do đó, nếu cần cộng 2 thanh ghi 8 bit, nó hoàn toàn có thể tạo ra một
lệnh dài 24 bit, trong đó 8 bit dùng để mã hoá, 8 bit dành cho địa chỉ của thanh ghi thứ
nhất, 8 bit dành cho địa chỉ cua thanh ghi thứ 2. Trong khi đó, tập lệnh CISC là tập
lệnh rút gọn, cho dù nó là lệnh gì, nó cũng luôn luôn chỉ có 14 bit (đối với PIC
midrange).

Thanh ghi W giống như một thanh ghi mặc định duy nhất, vì vậy, khi thực hiện, bộ xử
lý trung tâm có thể giải mã được nếu lệnh đó có cần thao tác với thanh ghi W hay
không, mà không cần lưu địa chỉ của thanh ghi W bên trong đoạn mã lệnh.

Chúng ta xem hình dưới đây để biết được bộ xử lý logic hoạt động như thế nào với
thanh ghi W.



Vậy chúng ta đã thấy rõ sự cần thiết của thanh ghi W, bởi vì chúng ta cần có một
thanh ghi tạm cho các công việc tính toán, và chúng ta cần mã hoá thanh ghi mà
không cần tốn quá nhiều bit, vậy thì thanh ghi W vừa là thanh ghi có tính toàn cục,
vừa là thanh ghi tạm, vừa là thanh ghi không cần thiết nhiều bit để biểu diễn địa chỉ.

Các bạn đã biết vì sao chúng ta phải cần thanh ghi W, bây giờ chúng ta cần biết thanh
ghi W hoạt động như thế nào trong các chương trình của PIC.
Kỹ thuật bảng

Các bạn có thể download bài viết Kỹ Thuật Bảng tại đây để tham khảo và hiểu kỹ
thuật thiết lập một bảng dữ liệu với PIC.

Kỹ thuật bảng này dùng trong một số trường hợp như: Xuất dữ liệu ra LCD, ra màn
hình, sử dụng làm các vector điều khiển vận tốc gia tốc động cơ, dùng để điều khiển
động cơ bước
Thí dụ về nút bấm

Đây là một thí dụ về nút bấm:

Nối nút bấm với RA0, RA1, RA2, RA3 với điện trở kéo lên. Nối đèn LED vào RB0,
RB1, RB2, RB3 với điện trở nối tiếp và đèn LED được nối xuống mass.

(hình vẽ sẽ post lên sau vì chưa có thời gian)

Thuật toán quét sẽ như sau:

Nếu SW0 là cao thì bật LED0
Nếu SW0 là thấp thì tắt LED0
Nếu SW1 là cao thì bật LED1 cứ như thế cho các nút bấm khác.


Chương trình như sau:
Code:
;
; Khoi tao
;
; Đặt PORTA có RA0 - RA3 là input
; Đặt PORTB có RB0 - RB3 là output
; Xóa PORTA, xóa PORTB

SW0 BTFSC PORTA, 0
GOTO TURNON0
BCF PORTB, 0

SW1 BTFSC PORTA, 1
GOTO TURNON1
BCF PORTB, 1

SW2 BTFSC PORTA, 2
GOTO TURNON2
BCF PORTB, 2

SW3 BTFSC PORTA, 3
GOTO TURNON3
BCF PORTB, 3

GOTO SW0 ; quay lại quét từ đầu

TURNON0 BSF PORTB, 0
GOTO SW1


TURNON1 BSF PORTB, 1
GOTO SW2

TURNON2 BSF PORTB, 2
GOTO SW3

TURNON3 BSF PORTB, 3
GOTO SW0

END.


Xong!
Tập lệnh PIC Midrange

Các bạn download tài liệu Tập Lệnh PIC Midrange bằng link này:

www.picvietnam.com/download/taplenh.pdf

Lưu ý với các bạn rằng, vì lý do đay là tài liệu chúng tôi biên soạn cho cuốn sách sắp
hoàn thành, do đó, chúng tôi không cho phép in ấn hoặc copy.

Các bạn có thể download về để tham khảo.

Một chú ý nữa, đó là tài liệu này chưa được viết xong, còn các lệnh tôi chỉ mới sửa
chữa sơ sơ, chủ yếu là phần chú thích, tôi nghĩ sau khi viết xong phần này, có thể đã
giúp ích cho rất nhiều kỹ sư từng làm việc quen với vi điều khiển khác chuyển sang
học PIC. Họ có thể tra cứu nhanh và nắm bắt các nguyên tắc lập trình PIC.


Cuối cùng, nếu các bạn sử dụng tài liệu này để soạn lại, hoặc đưa vào luận văn, hoặc
các tài liệu của các bạn, xin các bạn ghi rõ nhóm tác giả picvietnam.com

Kể từ nay cho đến khi chúng tôi viết xong cuốn sách, các bạn được phép sử dụng các
tài liệu như thế này một cách hoàn toàn miễn phí, cho mục đích cá nhân, không được
phép công bố, sao chép.

Lý do tôi thông báo điều này, vì có bạn đã hỏi tôi về việc sử dụng tài liệu của tôi cho
lớp dạy học sắp mở của các bạn đó, tôi rất hoan nghênh việc mở lớp của tất cả những
người có nguyện vọng truyền thụ kiến thức cho sinh viên. Song vì có quá nhiều lớp sẽ
mở ra, và có nhiều người sử dụng tài liệu do tôi biên soạn, để đảm bảo uy tín cho
picvietnam, tôi mới đề nghị như trên, bởi vì tôi không tham gia chính thức vào bất kỳ
lớp dạy học nào, ngoại trừ lớp của Bình Anh ở Hà Nội và lớp của Doãn Minh Đăng
tại HCMC với vai trò cố vấn.
Chương trình tính toán Timer

imerCalcV4.zip

Một điều không có gì cần thiết lắm, nhưng đôi khi nó lại làm cho chúng ta bối rối, đó
là tính toán các con số delay, timer với thời gian thực.

Chương trình trên đây giúp chúng ta đỡ mất công suy nghĩ và tính toán hơn khi thao
tác với timer. Đây chỉ là một chương trình bổ trợ nhỏ, nhưng cũng có lẽ sẽ giúp ích
khi chúng ta đã làm việc quá lâu với máy tính, và có thể vài con số sẽ làm chúng ta
bối rối.

Mong rằng nó giúp được cho các bạn.

Lưu ý, các bạn mới học PIC, khi tính toán với Timer, các bạn cố gắng tự tính bằng
tay, sau đó sử dụng chương trình này để kiểm tra lại kết quả, để xem mình đã hiểu

đúng về hoạt động của timer chưa.

Chúc vui.

Thành thật xin lỗi bạn, thời gian này mình đang rất bận, vừa phải lên lớp, vừa phải
làm dự án, chuẩn bị thư viện điện tử cho picvietnam và dientuvietnam, xem xét
sản xuất bộ sản phẩm thứ hai phát triển pic và picvietnam, và đang làm việc với
anh Nam để chuẩn hóa MPASM, rồi viết cuốn sách MPASM

Với khối lượng việc như vậy, mình không thể đảm bảo trả lời hết các bài viết của
các bạn, mong các bạn thông cảm, và rất nhiều thành viên có thể giúp đỡ các bạn
thêm trong thời gian này.

Đây là một bản dịch tài liệu hướng dẫn mà mình đã cho sinh viên mình soạn từ 2
năm trước, nó đã được đăng trên diendandientu.com. Tuy nhiên, vì mình thấy tài
liệu chưa tốt, nên không phổ biến trên picvietnam. Một khi đã phổ biến trên
picvietnam, mình muốn nó luôn luôn là tài liệu chuẩn hóa và có giá trị cao đối với
thành viên.

Khi các bạn gặp khó khăn nhất thời, có thể tạm sử dụng tài liệu này. Tuy nhiên,
mình tuyên bố, đây không phải là tài liệu chính thức của picvietnam. Tất cả các tài
liệu chính thức của picvietnam, đều được post theo form chuẩn, và lưu trữ trong
host của picvietnam với đường link www.picvietnam.com/download/
Post xong thấy bực mình quá, vì F vốn không thích kiểu làm việc như vậy. Nên
đây, các bạn có thể download tạm tài liệu này để sử dụng có vẻ tốt hơn.

Một là tài liệu này cũng không phải là tài liệu chính thức. F chỉ viết chơi và chỉnh
sửa lại một chút cho nó đúng form nhìn cho nó tốt hơn. Nhưng mà mặt khác F
nghĩ nó cũng đã khá tốt rồi. Tài liệu này được viết từ cách đây gần 2 năm rồi, nên
một số chỗ F còn để là diendandientu.com (vì lúc đó chưa có

www.picvietnam.com), hoặc là mã số bài viết bên trong sai với tên tập tin bên
ngoài, hoặc còn một số sai sót hoặc lời viết lung tung, bởi vì F copy qua lại, mong
các bạn thông cảm.

Trong bài hướng dẫn này, F sử dụng mạch nạp PIC1 để hướng dẫn.

DH.100406.pdf
Tutorial ngắn về tập tin .hex

Theo đề nghị của chú F, tôi viết tutorial ngắn này để các bạn mới bắt đầu học PIC
không thắc mắc về kích thước của tập tin .hex, cùng với cách tính số word, kword
trong chương trình của PIC.
Trong thế giới số:
1 k = = 1024
1 mega = = 1048576

1 kword = 1024 word
và, 8 kword = 8x1024 = 8192 word

Các chip PIC16 với bộ nhớ 8 kword, chẳng hạn như 16F877A, có 4 trang bộ nhớ
Flash, mỗi trang là 2 kword. Nếu chương trình tràn khỏi biên của một trang thì người
viết chương trình phải tự đảm bảo là các lệnh nhảy có thể thực hiện thành công, do đó
trình biên dịch thường có thông báo nhắc nhở.

Đối với tập tin .hex, các byte được ghi bằng ký tự ASCII thể hiện mã hexadecimal của
byte. Mỗi lệnh của PIC16 dài 14-bit, được ghi vào tập tin .hex bằng 2 byte, và mỗi
byte được ghi bằng 2 ký tự ASCII, như vậy mỗi lệnh cần dùng tới 4 ký tự ASCII để
ghi vào tập tin .hex. Ngoài ra còn có các thông tin định dạng và kiểm tra lỗi cho mỗi
dòng trong tập tin .hex và các thông tin khác cho cấu hình của chip, nếu có dùng, và
một số thông tin khác, chẳng hạn như địa chỉ bắt đầu của vùng nhớ được điền vào.

Mỗi dòng cần có thêm 11 ký tự ASCII cho mục đích định dạng và kiểm tra lỗi, và mỗi
dòng chỉ mã hóa cho tối đa 32 byte, tức là 16 lệnh. Các trình dịch PIC thường chỉ
dùng 16 byte cho mỗi dòng trong tập tin .hex, do đó thường cần 1 dòng cho mỗi 8
lệnh.

Lấy ví dụ một chương trình dài 2048 lệnh, với cách ghi thành tập tin .hex thông
thường, sẽ cần 256 dòng, mỗi dòng dùng hết 4x8 + 11 = 43 ký tự, và 256 dòng sẽ cần
11008 ký tự cho riêng phần mã lệnh, các thông tin khác cũng sẽ dùng thêm khoảng
200 ký tự. Do đó, chương trình này khi được ghi thành tập tin .hex sẽ có kích thước
lớn hơn 11 kbyte (hơn 11 ngàn ký tự).

Thân,


Theo picvietnam.com

×