Chương 7: CÁC THANH GHI CÓ CHỨC NĂNG ĐẶC BIỆT Hầu hết các thanh ghi nội của các vi điều khiển đều có thể được truy xuất thông qua tên đã được đònh nghóa. Ví dụ INC A. Các thanh ghi nội của 8051 chiếm một phần của vùng nhớ nội, vì vậy mỗi thanh ghi đều có một đòa chỉ. Các thanh ghi chức năng (FSRs) nằm trong vùng nhớ cao từ 80H đến FFH. Lưu ý có một số bytes trong vùng này không được đònh nghóa. Chỉ có 21 đòa chỉ thanh ghi chức năng được đònh nghóa (26 đòa chỉ đối với 8052/8032). Mặc dù có thể truy xuất các thanh ghi chức năng thông qua tên của nó, hầu hết các thanh ghi này được truy xuất bằng đòa chỉ trực tiếp. Một số thanh ghi có thể truy xuất bằng byte hoặc bit. Trong lập trình phải cẩn thận khi truy xuất bit thông qua byte. Ví dụ lệnh sau: SETB 0E0H ; Set bit 0 trong thanh ghi ACC, các bit khác vẫn không thay đổi. Lưu ý đòa chỉ của một bit trong một thanh ghi chức năng luôn được xác đònh bởi 5 bit cao của đòa chỉ thanh ghi đó. Ví dụ một bit trong thanh ghi P1 (90H hay 10010000B) hay có đòa chỉ 9xH hay 10010xxxB. Thanh ghi trạng thái chương trình (PSW) sẽ được mô tả chi tiết trong phần sau, các thanh ghi chức năng còn lại được mô tả ngắn gọn và sẽ được mô tả chi tiết trong những chương sau. Thanh ghi trạng thái chương trình: Thanh ghi trạng thái chương trình có đòa chỉ 0Dh, chứa các bit trạng thái chương trình. Các bit trạng thái được mô tả như sau: * Cờ Carry: Cờ carry có hai chức năng: + Được dùng trong các phép toán số học thông thường. Nó là cờ nhớ của phép tính cộng và cờ mượn của phép tính trừ. Ví dụ các thanh ghi ACC có nội dugn FFH thì lệnh “ADD A, #1” làm cho ACC bằng 00H và cờ nhớ được set. + Cờ carry còn được dùng như “thanh ghi tích luỹ 1 bit” cho các phép toán luận lý trên bit. Ví dụ lệnh sau AND bit 25H với cờ carry và đặc kết quả vào cờ carry: “ANL C,25H ;”. * Cờ nhớ phụ (auxiliary carry – AC) : Khi cộng các giá trò BCD, cờ AC được set nếu bit thứ ba tràn hay 4 bit thấp có giá trò từ 0AH đến 0FH. Khi cộng số BCD, sau phép cộng phải dùng lệnh DA A (decimal adjust accumulator) để chỉnh kết quả cộng về dạng BCD. * Cờ 0: Cờ này dành cho người sử dụng trong các ứng dụng lập trình. * Bit chọn ngăn thanh ghi: Hai bit RS0 và RS1 dùng để cho ngăn thanh ghi, chúng được xóa khi reset hệ thống và có thể thay đổi bằng phần mềm. Ví dụ các lệnh sau sẽ chọn nhăn thanh ghi thứ ba và ghi nội dung R7 (đòa chỉ 1FH) vào ACC. SETB RS0 ; SETB RS1 ; MOV A, R7 ; * Cờ tràn (Overflow – OV): Cờ tràn được set kết quả bò tràn (số học) sau phép tính cộng hoặc trừ. Đối với phép toán cộng và trừ số có dấu, phần mềm có thể xét bit này để kiểm tra kết quả có vượt quá giới hạn hay không. Khi cộng số không dấu ta không quan tâm đến bit này. Như vậy kết quả của phép tính cộng hay trừ lớn hơn 127 hoặc nhỏ hơn –128 sẽ set cờ tràn. Ví dụ OV sẽ set sau phép tính cộng sau: Hex: 0F Decimal : 15 +7F +127 8E 142 8E tương đương với –116. Rõ ràng kết quả 142 không chính xác. Vì vậy bit OV được set. B it K ý hiệu Đ òa chỉ Chức năng P SW .7 P SW .6 P SW .5 P SW .4 P SW .3 P SW .2 P SW .1 P C Y A C F 0 R S1 R S0 O V P D 7h D 6h D 5h D 4h D 3h D 2h D 1h D Cờ nhớ Cờ nhớ phụ Cờ Zero Chọn thanh ghi dự trữ 1 Chọn thanh ghi dự trữ 2 00=bank0, đòa chỉ 00h-07h 01=bank1, đòa chỉ 08h-0Fh 10=bank2, đòa chỉ 10h-17h 11=bank3, đòa chỉ 18h-1Fh Cờ tràn Dự trữ Cờ chẵn lẽ SW .0 0h Bảng 4.3 Thanh ghi PSW * Bit parity: Bit Parity được tự động set hoặc xóa trong mỗi chu kỳ máy để tạo nên parity chẵn đối với thanh ghi tích luỹ. Số bit 1 trong thanh ghi ACC cộng với P luôn luôn là một chẵn. Ví dụ nếu ACC chứa 10101101B, P sẽ là 1. Bit Parity thường được liên kết với chương trình truyền nối tiếp có sử dụng parity. Thanh ghi B Thanh ghi B có đòa chỉ F0h, chủ yếu dùng với thanh ghi ACC trong các phép toán nhân và chia. Lệnh MUL AB nhân các số 8 bit không dấu trong thanh ghi A và B. Kết quả là một số 16 bit chứa trong thanh ghi ACC (byte thấp) và B (byte cao). Lệnh DIV B chia thanh ghi ACC cho B. Kết quả thương số được lưu trong thanh ghi ACC số dư được lưu trong thanh ghi B. Thanh ghi B cũng được dùng như những thanh ghi khác và có thể truy xuất bit (đòa chỉ F0h đến F7h) Con trỏ ngăn chồng (stack pointer – SP) Stack – pointer là một thanh ghi 8 bit có đòa chỉ 81H. Nó chứa đòa chỉ hiện thời của đỉnh stack. Khi đẩy dữ liệu vào stack, SP tăng lên một giá trò, tiếp theo dữ liệu được ghi vào stack. Khi lấy dữ liệu ra khỏi stack, dữ liệu được đọc ra trước sau đó SP được giảm. Stack của 8051 nằm trong vùng RAM nội và có thể truy xuất bằng đòa chỉ trực tiếp. 128 bytes đầu tiên đối với 8051/8031 và 256 bytes đối với 8052/8032 trong vùng RAM nội có thể dùng làm stack. Để tạo ra stack bắt đầu tại 60H, ta khởi động thanh ghi SP: MOV SP, #5FH ; Như vậy stack được giới hạn trong 32 bytes. Ta dùng giá trò 5FH vì SP sẽ tăng lên 60H trước khi đẩy dữ liệu đầu tiên vào stack. Khi lập trình ta không cần phải khởi động lại thanh ghi SP vì nó đã được khởi động với giá trò khi reset. Thanh ghi SP chứa giá trò mặc đònh là 07H. Do đó stack mặc đònh bắt đầu tại 08H. Nếu trình không khởi động lại stack thì các thanh ghi 1, 2, 3 không thể sử dụng vì nó được dùng làm stack. Stack được truy xuất một cách rõ ràng bằng các lệnh PUSH, POP để lưu trữ tạm thời hay truy xuất dữ liệu. Nó cũng có thể được truy xuất ngầm khi có các lệnh gọi đến chương trình con. Các lệnh ACALL, LCALL hay ngắt sẽ đẩy thanh ghi đếm chương trình (PC) vào stack. Lệnh RET, RETI trả giá trò trong stack lại cho PC. Con trỏ dữ liệu (DPTR) Con trỏ dữ liệu dùng để truy xuất mã hay dữ liệu từ bộ nhớ ngoài và thanh ghi 16 bit. Thanh ghi này gồm hai thanh ghi DPL (byte thấp, đòa chỉ 82H) và DPH (byte cao, đòa chỉ 83H). Ba lệnh sau đây sẽ ghi giá trò 55H vào RAM ngoài tại đòa chỉ 1000H. MOV A, #55H; MOV DPTR, #1000H; MOV @DPTR, A; Các thanh ghi Port: Các port của 8051 gồm có port 0 đòa chỉ 80H, port 1 đòa chỉ 90H, port 2 đòa chỉ A0H, port 3 đòa chỉ B0H. Các port 0, 2 và 3 không được dùng để xuất nhập nếu đang sử dụng bộ nhớ ngoài. Còn lại port 1 có thể dùng để xuất nhập (I/O). Tất cả các port đều có thể dùng truy xuất bit. Điều này cung cấp cho vi điều khiển khả năng giao tiếp rất mạnh. Ta có thể dùng chân P1.7 để đóng mở động cơ. Chân P1.7 nối với transitor để lái một relay đóng mở động cơ. Lệnh SETB P1.7 mở động cơ. Lệnh CLR P1.7 tắt động cơ. Hai lệnh trên dùng toán tử dấu chấm để xác đònh đòa chỉ bit trong một byte. Các thanh ghi bộ đònh thời: 8051 có hai bộ đònh thời 16 bit. Timer 0 có đòa chỉ 8AH (TL0 byte thấp) và 8DH (TH1 byte cao). Ngoài bộ đònh thời còn có hai thanh ghi: thanh ghi điều khiển TCON đòa chỉ 88H và thanh ghi xác đònh mode cho timer TMOD đòa chỉ 89H. Trong đó chỉ có thanh ghi TCON truy xuất được từng bit. Các thanh ghi cổng nối tiếp: 8051 chứa cổng nối tiếp bên trong MCU để giao tiếp với các thiết bò nối tiếp như thiết bò đầu cuối, modem v.v… Cổng nối tiếp gồm có hai thanh ghi: một thanh ghi đệm SBUF là nạp dữ liệu để truyền đi. Đọc SBUF là nhận dữ liệu đã thu được vào. Các mode truyền có thể được lập trình thông qua thanh ghi điều khiển cổng kế tiếp. Thanh ghi này có thể truy xuất bit và có đòa chỉ 98H. Các thanh ghi ngắt: 8051 có 5 nguồn ngắt và hai mức ưu tiên. Các ngắt bò cấm khi reset hệ thống. Các ngắt được cho phép thông qua thanh ghi IE có đòa chỉ 0AH. Các mức ưu tiên cũng được set bởi thanh ghi IP tại đòa chỉ B8H. Cả hai thanh ghi này đều có thể truy xuất bit. IE có đòa chỉ A8H. Ngắt chỉ được chấp nhận khi thanh ghi này đã được lập trình. Thanh ghi PCON (Power Control Register) Thanh ghi PCON có đòa chỉ 87H, chứa các bits điều khiển linh tinh, được tóm tắt trong bảng 4.4. Bit SMOD nhân đôi tốc độ truyền nối tiếp ở các mode 1, 2 và 3. Các bit 4, 5, 6 không được đònh nghóa. Bit 3 và 2 là hai cờ được tùy ý trong lập trình ứng dụng. Các bit PD (power down) và IDL (idle) đều có trong các họ IC MCS-51 nhưng chỉ với IC dùng CMOS mà thôi. Lệnh set bit IDL là lệnh được thi hành cuối cùng trước khi CPU vào chế độ idle. Ở tín hiệu này chế độ xung clock được ngắt ra khỏi CPU, nhưng không ngắt ra khỏi ngắt quãng, timer và cổng nối tiếp. Trạng thái CPU và nội dung các thanh ghi được bảo toàn. Các chân của cổng song song được giữ ở mức trạng thái của chúng. ALE và PSEN ở mức cao. Các chế độ idle kết thúc khi có bất kỳ một ngắt nào hoặc reset hệ thống, đồng thời bit IDL bò xóa. + Power down Mode it K ý hiệu Mô tả S OMD Tốc độ kép; khi được set, tốc độ truyền nối tiếp được nhân đôi các chế độ 1,2,3. Không được đònh nghóa G F1 G F0 P D I DL “nt” “nt” Cờ dùng cho mục đích tổng quát 1 Cờ dùng cho mục đích tổng quát 2 Power down, set mode power down. Chỉ thoát khi reset Idle mode, set mode idle. Thoát khi có ngắt hoặc reset Bảng 4.4 Tóm tắt thanh ghi PCON Lệnh set bit PD là lệnh cuối cùng trước khi CPU chuyển sang mode power down. Ở chế độ này: (1) bộ dao động nội ngưng hoạt động, (2) các chức năng bò dừng, (3) nội dung RAM nội được giữ ở mức logic của chún, (5) ALE và PSEN ở mức thấp. Chỉ có thể thoát khỏi chế độ này khi reset hệ thống. Khi ở chế độ power down, Vcc có thể giảm đến 2V. Lưu ý cần phải trả lại mức áp 5V cho Vcc khi thoát khỏi chế độ power down. . đỉnh stack. Khi đẩy dữ liệu vào stack, SP tăng lên một giá trò, tiếp theo dữ liệu được ghi vào stack. Khi lấy dữ liệu ra khỏi stack, dữ liệu được đọc ra trước. dùng chân P1 .7 để đóng mở động cơ. Chân P1 .7 nối với transitor để lái một relay đóng mở động cơ. Lệnh SETB P1 .7 mở động cơ. Lệnh CLR P1 .7 tắt động cơ.