![]() |
|
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 |
PIC Bang chủ
|
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 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 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.
__________________
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, 11-07-2005 lúc 10:59 PM. |
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Sep 2005
Bài gửi: 8
: |
tuyệt quá tuyệt quá .
em phải mua ngay 1 mạch nạp pic mới được . |
![]() |
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: Apr 2006
Bài gửi: 9
: |
bai viet của bac falleaf that la tuyệt voi. rất bài bản khoa học và có tính sư phạm cao, de hiểu lắm. đọc song là em máu làm luôn. tuong là có thể làm ngay, nhung khi bắt đầu thì lại khong biết là viết trên chuong trình biên dịch nào dịch, viet vào đâu... chi thấy nói là bấm alt-f10. Nên em vừa định bắt đầu lại tắc tịt luôn.
Mong bác bổ xung thêm chỗ này, em chưa biết một chuong trình biên dịch nào, bác cho em cai nào ngon ngon dễ sử dụng, hay bác co trình nào chuyen nghiệp thi làm một tutorial. em dang mau quá. Cam on bac ! |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 9 túi
|
Trích:
Qua bên này học pic cơ bản: http://www.picvietnam.com/forum//showthread.php?t=4
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#5 |
Nhập môn đệ tử
Tham gia ngày: Apr 2006
Bài gửi: 9
: |
thank you namqn và nhh. Minh biet la rat gian nan, hy vong các ban giup do.
Mnh da cai MPLAB roi, chi nhac bac falleaf bo xung mot it thieu sot nhu da noi o tren do thoi. |
![]() |
![]() |
![]() |
#6 | |
PIC Bang chủ
|
Trích:
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/..... 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? |
|
![]() |
![]() |
![]() |
#7 |
PIC Bang chủ
|
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. http://www.doanhiep.com/~ulsan/Taili....DH.100406.pdf 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-04-2006 lúc 03:58 PM. |
![]() |
![]() |
![]() |
#8 |
Trưởng lão PIC bang
|
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 = 2^10 = 1024 1 mega = 2^20 = 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,
__________________
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 thay đổi nội dung bởi: namqn, 06-07-2010 lúc 10:49 PM. Lý do: bỏ code latex |
![]() |
![]() |
![]() |
#9 |
Nhập môn đệ tử
Tham gia ngày: Oct 2005
Bài gửi: 6
: |
Các bác ơi, Tôi thấy có 1 số chỗ trong chương trình Led_1_1 phải sửa thì mới chạy ngon được: các bác tham khảo nhé - tui dùng PIC16F84A
1. Chỗ khai báo PROCESSOR không ghi tắt được mà phải đầy đủ là PROCESSOR PIC16F84A 2. Chỗ BSF PROTB,0 : TRƯỚC đó cần khởi tạo giá trị =0 chẳng hạn cho thanh ghi này đã, nếu không hình như nó có RÁC hay sao đó - hi hi. Tôi đã thêm lệnh CLRF PORTB vào trước dòng này, thì đèn LED mới hiển thị đúng - chỉ 1 đèn ở RB0. 3. Chỗ kết thúc : sau cái END không có dấu chấm . Ngoài ra, nếu bác nào dùng ICPROG theo hướng dẫn mà Verify .... cứ báo lỗi thì các bác cứ chuyển đại sang chế độ Direct I/O ( không dùng chế độ Windows API nữa), các bác sẽ thấy nạp ngon ngay, lại còn nhanh hơn vài lần . Hê Hê. Newbie xin đóng góp 1 tị. |
![]() |
![]() |
![]() |
#10 | |
PIC Bang chủ
|
Trích:
3) END lưu ý không có dấu . là chính xác, có một cái tut F có viết sai là có dấu . (chấm), vì theo thói quen kết thúc bài viết, qmk đã có sửa lại, các bạn chú ý.
__________________
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? |
|
![]() |
![]() |
![]() |
#11 |
Đệ tử 4 túi
Tham gia ngày: Feb 2006
Bài gửi: 66
: |
đúng thế đấy bạn, nếu bạn xuất led mà không có dòng CLRF PORTx là thấy chạy sai liền, Protues mô phỏng y chang...
|
![]() |
![]() |
![]() |
#12 |
PIC Bang chủ
|
Từ hôm nay, F cắt các bài trong phần Học PIC trong 1 ngày ra thành Thảo luận xung quanh Học PIC trong 1 ngày, lý do rằng một số bài đi lan man, và cứ nhấn tới các câu hỏi.
Trong luồng này, chỉ lưu các tutorial của picvietnam, nhưng câu hỏi và trả lời liên quan đến bài học, nhằm giúp đỡ những người mới học tham gia và đọc một cách dễ dàng nhất. Vì vậy, khi quyết định viết bài vào luồng này, các bạn phải thật cân nhắc, nếu không bài của các bạn sẽ bị di chuyển sang luồng khác. http://www.picvietnam.com/forum/showthread.php?t=446 Liên quan đến bài học là thế nào? Là bạn đọc bài học ở đây, làm theo và có thắc mắc, hoặc là bạn có viết thêm các tutorial để bổ sung vào luồng này cho người học có thêm tài liệu phong phú. Nếu không phải là một trong hai trường hợp này, đề nghị các bạn không viết bài vào luồng này, để tránh các thành viên mới rất khó kiếm bài và rất khó hệ thống tài liệu học. 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? |
![]() |
![]() |
![]() |
#13 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 2
: |
Sao Em Download File Tập Lệnh Về Lại Ko Thể Mở Xem Duoc Vậy Nhỉ.
Nó Cứ Bảo File Damaged And Could Not Repair.... |
![]() |
![]() |
![]() |
#14 |
PIC Bang chủ
|
Nhiều người download thành công, và F cũng kiểm tra lại rồi, mọi thứ ok. Có thể đường truyền ở Việt Nam có vấn đề, cho nên đôi khi download giữa chừng nó bị hỏng, và dẫn tới file down về bị hư.
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? |
![]() |
![]() |
![]() |
#15 |
Đệ tử 4 túi
Tham gia ngày: Feb 2006
Bài gửi: 66
: |
chắc chắn là cần lưu giữ giá trị các thanh ghi W, STATUS và PCLATH nếu bạn muốn chương trình chạy đúng sau khi trở về từ ngắt. Cách khai báo hình như không đúng...mình thường viết như thế này:
W_TEMP EQU 0X20 STATUS_TEMP EQU 0X21 PCLATH_TEMP EQU 0X22 riêng FSR có cần lưu trữ nó không nhỉ? thay đổi nội dung bởi: newuser, 04-08-2006 lúc 09:04 PM. |
![]() |
![]() |