katty2012000

New Member

Download miễn phí Vi điều khiển PIC - Học nhanh đi vào ứng dụng





Điểm thứnhất các bạn nên chú ý, đó là việc tôi thêm phần các chương trình con vào trong
phần chương trình chính. Phần cuối chương trình tôi vẫn luôn đểlà GOTO $ và kết thúc với lệnh
END. Tạm thời các bạn cứviết nhưvậy đểkhoá chương trình ởdòng GOTO $, khi chương trình
nhảy đến đó, nó sẽthực hiện vòng lặp vô cùng tại chỗ, còn lệnh END là lệnh bắt buộc.
Việc này giúp chúng ta phần tách rạch ròi phần chương trình con và chương trình chính để
tránh nhầm lẫn. Bởi vì ở đây chúng ta mới bắt đầu các bài học cơbản, cho nên tôi cho rằng các
chương trình của các bạn viết là ngắn, nên chúng ta chưa đi xa hơn vềviệc phân bổvịtrí này. Các
bạn chỉ đơn giản hiểu là chúng ta cần bỏ đoạn chương trình con ở đâu đó, và chúng ta nên
tách thêm một phần nữa đểdành riêng cho việc viết chương trình con. Việc làm này vềsau sẽrất
có lợi, nhưng tạm thời chúng ta khoan bàn tới, và chúng ta cứviết nhưvậy đã.



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

m ở băng 1, vì thế cần chuyển
sang băng 1 để làm việc. Thực ra chúng ta cũng có cách để yêu cầu PIC chuyển sang băng 1 một
cách đích danh, chứ không phải là chuyển sang băng có thanh ghi trisb như chúng ta vừa làm.
Nhưng việc này là không cần thiết, cả hai việc làm đều giống nhau. Chính vì vậy, chúng ta chọn
cách viết nào cho dễ nhớ là được. Sau khi chuyển sang băng 1. Chúng ta dùng lệnh CLRF để xoá
thanh ghi TRISB.
Tức là TRISB = 00000000
Chúng ta lưu ý một điều rằng, thanh ghi TRISB có công dụng quy định PORTB sẽ có những
chân nào là chân xuất, chân nào là chân nhập. Chúng ta nhớ thêm một điều nữa, số 0 giống chứ
O, và số 1 giống chữ I. Như vậy, khi TRISB = 00000000 tức là PORTB sẽ là OOOOOOOO, tức có
nghĩa là tất cả các chân của portB đều là Output. Nếu TRISB = 01010101 thì PORTB sẽ là
OIOIOIOI. Có nghĩa là RB0 sẽ là Input, RB1 là Output, RB2 là Input, RB3 là Output.. cứ như thế
cho đến RB7 là Output. Lưu ý rằng RB0 đến RB7 được tính từ phải sang trái.
Sau đó, chúng ta lại thực hiện lệnh Banksel portb, tức là chúng ta lại nhảy về băng 0 (băng chứa
thanh ghi portb). Tất cả các lệnh làm thay đổi giá trị của thanh ghi portb, sẽ làm thay đổi tín hiệu
điện ở bên ngoài chân của PORT B. Sau khi chuyển sang băng 0, chúng ta thực hiện lệnh BSF
PORTB,0. Có nghĩa là chúng ta set bit ở vị trí 0 của portb, tức là chúng ta cho RB0 = 1.
Có nghĩa là ở ngoài chân RB0 sẽ mang giá trị điện áp 5V. Khi đó, đèn LED nối với RB0 sẽ sáng.
các bạn sẽ thấy mach ngoài hoạt động như thế này:
Khi bật điện lên, PIC được reset. Nó lập tức bật sáng đèn LED ở RB0, rồi sau đó giữ nguyên như
vậy, không làm gì cả.
Bây giờ các bạn lưu chương trình vừa viết thành LED_1.asm vào một thư mục nào đó.
Nhấn Alt - F10, chương trình sẽ dịch LED_1.asm thành LED_1.hex
các bạn dùng mạch nạp PG2C và chương trình nạp IC-PROG để nạp vào PIC (tham khảo Hướng
dẫn mạch nạp Falleaf PG2C - PIC Tutorial).
Công việc của các bạn như sau:
0) Chạy thử chương trình ban đầu
1) Thay đổi lệnh BSF PORTB, 0 bằng lệnh BSF PORTB, 1. Nạp lại chương trình mới vào PIC. Bạn
sẽ thấy bây giờ đèn LED không sáng ở vị trí RB0 nữa mà sáng ở vị trí RB1.
2) Thay lệnh BSF PORTB,0 bằng đoạn lệnh
MOVLW b'11110000'
MOVWF PORTB
Bạn sẽ thấy các các chân từ RB0 đến RB3 sẽ tắt đèn, và các chân từ RB4 đến RB7 đèn sẽ sáng.
3) Bạn thay lệnh CLRF TRISB bằng đoạn lệnh
CLRF TRISB
BSF TRISB, 0
và giữ nguyên lệnh
BSF PORTB, 0
các bạn sẽ thấy rằng đèn LED trong trường hợp này sẽ không sáng nữa.
Bởi vì các bạn đã làm cho TRISB = 00000001. Như vậy, RB0 trở thành chân Input. Khi RB0 trở
thành chân Input, thì lệnh BSF PORTB, 0 sẽ không còn tác dụng nữa. RB0 lúc này không thể thay
đổi giá trị bằng chương trình, nó chỉ có thể nhận giá trị điện áp từ bên ngoài vào.
4) Trong trường hợp mạch này, các bạn sẽ làm thế nào?
Kết luận: Qua bài học này, các bạn đã học được các nội dung sau:
- Làm một mạch chạy PIC
- Cấu trúc một chương trình PIC
- Lập trình từ máy tính, nạp vào PIC, và cho PIC hoạt động
- Hiểu được hoạt động xuất nhập của PIC, chức năng của thanh ghi TRISA, TRISB, PORTA, PORTB,
hiểu được các lệnh CLRF (xoá thanh ghi bất kỳ), MOVLW (ghi một giá trị bất kỳ vào thanh ghi W),
MOVWF (ghi giá trị của thanh ghi W vào một thanh ghi khác), BSF (bật một bit trong một thanh
ghi bất kỳ), GOTO (nhảy đến một nhãn bất kỳ), GOTO $ (nhảy tại chỗ), BANKSEL (chon băng
trong bộ nhớ chương trình, chứa một thanh ghi bất kỳ), ORG định địa chỉ trong bộ nhớ chương
trình. Hiện nay các bạn chưa học đến làm thế nào để Input, nhưng có thể các bạn sẽ thực hiện dễ
dàng bằng việc thay LED bằng một nút bấm. hay giả, các bạn muốn đèn LED nhấp nháy, về
nguyên tắc các bạn có thể thực hiện bật tắt liên tục đèn LED bằng lệnh BSF và BCF. Nhưng làm
như thế nó nháy quá nhanh, không thể thấy được.
Bài học sau, chúng ta sẽ học cách viết hàm Delay, và các bạn có thể thực hiện việc làm cho đèn
LED nhấp nháy, làm cho dãy đèn từ RB0 đến RB7 chạy qua chạy lại...
Chúc các bạn may mắn trong bài học đầu tiên, và chúc các bạn thành công với PIC!
******* &&& *******
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 cách 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 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 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
 

Các chủ đề có liên quan khác

Top