Hướng dẫn sử dụng vi điều khiển 8-Bit SG8V1 (Phần 2)

16. Inter-Integrated Circuit (I2C)

Ngoại vi I2C hỗ trợ đầy đủ các chức năng của chế độ Master và Slave của chuẩn bus I2C. Nó có

thể cấu hình hoạt động với các chức năng sau:

 Master và có ngắt có start và stop bit

 Master không có ngắt start và stop bit

 Slave 10-bit địa chỉ và có ngắt có start và stop bit

 Slave 7-bit địa chỉ và có ngắt có start và stop bit

 Slave 10-bit địa chỉ không có ngắt có start và stop bit

 Slave 7-bit địa chỉ và không có ngắt có start và stop bit

pdf100 trang | Chia sẻ: phuongt97 | Lượt xem: 401 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Hướng dẫn sử dụng vi điều khiển 8-Bit SG8V1 (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
chọn đích để ghi vào dst = 0: lưu vào thanh ghi ACC dst = 1: ghi vào thanh ghi trỏ bởi reg dest Đích ghi vào, nó là thanh ghi ACC hoặc một thanh ghi chức năng reg 8-bit vị trí thanh ghi cần truy xuất (00h tới FFh) imm Giá trị hằng số trong mã lệnh (có thể là 8 hoặc 15 bit) label Tên nhãn chương trình Off 18/28 Địa chỉ tương đối (số bù 2) cho các lệnh nhảy tương đố hoặc địa chỉ trực Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 162 tiếp cho các lệnh Call/Branch và Return. u Không sử dụng hoặc không thay đổi x Giá trị không cần quan tâm. Mã bit tự tạo ra là giá trị 0. (reg) Nội dung của reg [reg][n] Sử dụng bit n của thanh ghi reg = Gán giá trị [ ] Trường bit trong thanh ghi || Ghép chuỗi các bit Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 163 19.2. Thanh ghi cờ phép toán Tên Bit R/W Mô tả Không sử dụng [7:3] R Z [2] R/W Cờ không 0: kết quả không bằng 0 1: kết quả bằng 0 HC [1] R/W Cờ nhớ một nửa (Half-Carry) 0: không có chuyển số nhớ từ số thấp qua số cao 1: có chuyển số nhớ từ số thấp qua số cao C [0] R/W Cờ nhớ/Cờ mượn (Carry / Borrow) 0: không có cờ nhớ tại ngõ ra 1: có cờ nhớ tại ngõ ra 19.3. Tóm tắt tập lệnh Bảng 19-2 liệt kê tất cả các lệnh của VĐK SG8V1 Bảng 19-2: Tập lệnh SG8V1 Tên Đối số Chức năng Cờ ảnh hưởng Nhóm số học ADDI imm ACC = (ACC) + imm C, HC, Z ADDR reg, dst, bse dest = (ACC) + (reg) C, HC, Z ADDRC reg, dst, bse dest = (ACC) + (reg) + C C, HC, Z DEC reg, dst, bse dest = (reg) - 1 C, HC, Z INC reg, dst, bse dest = (reg) + 1 C, HC, Z MULI imm HI:LO = (ACC) x imm không MULR reg, bse HI:LO = (ACC) x (reg) không SUBAR reg, dst, bse dest = (ACC) - (reg) C, HC, Z SUBARC reg, dst, bse dest = (ACC) - (reg) - C C, HC, Z SUBI imm ACC = (ACC) - imm C, HC, Z SUBRA reg, dst, bse dest = (reg) - (ACC) C, HC, Z SUBRAC reg, dst, bse dest = (reg) - (ACC) - C C, HC, Z Nhóm lo-gic ANDI imm ACC = (ACC) AND imm Z ANDR reg, dst, bse dest = (ACC) AND (reg) Z BCLR reg, bit, bse R[bit] = 0 không BSET reg, bit, bse R[bit] = 1 không CLR reg, bse R = 00h Z CPL reg, dst, bse dest = NOT (reg) Z DA HC_tmp || ACC[3:0] = ([ACC[3:0] > 9] và [HC = 1]) ?(ACC [3:0]) + 6 : ACC [3:0]) ACC [7:4] = ([ACC [7:4] > 9] và [C = 1]) ? (ACC [7:4]) + 6 + HC_tmp; C = 1 : (ACC [7:4]) + HC_tmp C Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 164 NOP không làm gì cả không ORI imm ACC = (ACC) OR imm Z ORR reg, dst, bse dest = (ACC) OR (reg) Z RL reg, dst, bse dest[7:0] = R[6:0] || R[7] Z RLC reg, dst, bse C || dest[7:0] = R[7:0] || C C, Z RR reg, dst, bse dest[7:0] = R[0] || R[7:1] Z RRC reg, dst, bse C || dest[7:0] = R[0] || C || R[7:1] C, Z SET reg, bse R = FFh không XCHD reg, dst, bse dest [7:0] = R[3:0] || R[7:4] không XORI imm ACC = (ACC) XOR imm Z XORR reg, dst, bse dest = (ACC) XOR (reg) Z Nhóm rẽ nhánh chương trình BRC n C=1; PC = (PC) + 1 + off8 không BRNC n C=0; PC = (PC) + 1 + off8 không BRNZ n Z=0; PC = (PC) + 1 + off8 không BRZ n Z=1; PC = (PC) + 1 + off8 không BTBC reg, bit, bse R[bit] = 0; bỏ qua lệnh tiếp theo không BTBS reg, bit, bse R[bit] = 1; bỏ qua lệnh tiếp theo không DBNZ reg, dst, bse dest = (reg) - 1 IF dest ≠ 0; bỏ qua lệnh tiếp theo không DBZ reg, dst, bse dest = (reg) - 1 IF dest = 0; bỏ qua lệnh tiếp theo không IBNZ reg, dst, bse dest = (reg) + 1 IF dest ≠ 0; bỏ qua lệnh tiếp theo không IBZ reg, dst, bse dest = (reg) + 1 IF dest = 0; bỏ qua lệnh tiếp theo không JMPA PC = (PC) + 1 + (TPS,ACC) không RET PC = (TS) không RETA imm PC = (TS) ACC = imm không RETI PC = (TS) GIE/GIEH = 1 hoặc PIE/GIEL = 1 không SCALL n PC = (PC) + 1 + off11 TS = (PC) + 1 không SJMP n PC = (PC) + 1+ off11 không TBZ IF (reg) = 0, bỏ qua lệnh tiếp theo không LCALL imm PC = imm không TS = (PC) + 2 LJMP imm PC = imm không Nhóm điều khiển hệ thống IDLE 00h → WDT postscaler, 0 → WDT prescaler, 0 → WDTO, 1 → PWD WDTO, PWD CLRWDT 000h → WDT, 000h → WDT postscaler, 0→ WDTO, 0→ PWD WDTO, PWD PUSH TS = (PC) + 1, tăng con trỏ Stack không POP Xóa (TS), giảm con trỏ Stack không Nhóm sao chép dữ liệu Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 165 IDP0 imm DPH0 = imm[13:8] không DPL0 = imm[7:0] IDP1 imm DPH1 = imm[13:8] không DPL1 = imm[7:0] IBS imm BS = imm[5:0] không IACC imm ACC = imm không IDPOFF imm DPOFF = imm không LD reg, bse ACC = (reg) Z ST reg, bse R = (ACC) không Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 166 19.4. Hoạt động của lệnh Giải thích các giá trị giới hạn cho các đối số: 0 ≤ reg ≤ 255 0 ≤ imm ≤ 255 -128 ≤ Off8 ≤ 127 -1024 ≤ Off11 ≤ 1023 0 ≤ dst ≤ 1 0 ≤ bse ≤ 1 0 ≤ bit ≤ 7 Các chú ý đối với tập lệnh: Đối với những lệnh có bit d trong mã lệnh (bit thứ [9]), thì nếu d = 0, kết quả sẽ lưu lại trong thanh ghi ACC. Nếu d = 1 thì kết quả sẽ lưu lại trong thanh ghi reg. Đối với những lệnh có bit e trong mã lệnh (bit thứ [8]), nếu bit e = 0, thì băng bộ nhớ 0 sẽ được chọn. Nếu e = 1 thì băng bộ nhớ được chọn sẽ phụ thuộc giá trị của thanh ghi BS. Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 167 ADDI - ADD constant to ACC ADDI imm OPCODE imm (constant) 15 7 08 OPCODE = 0000_1111 ACC = (ACC) + imm Cộng nội dung của thanh ghi tích lũy ACC với giá trị tức thời trong mã lệnh. Kết quả lưu trong thanh ghi ACC. Các bit cờ ảnh hưởng: C, HC, Z ADDI 0x15; Trước lệnh: ACC = 10h Sau lệnh: ACC = 25h ADDR - ADD ACC to reg ADDR reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0010_01 Cộng nội dung của thanh ghi tích lũy ACC với nội dung thanh ghi reg. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. dest = (ACC) + (reg) Các bit cờ ảnh hưởng: C, HC, Z ADDR REG, 0, 0 Trước lệnh: ACC = 17h, REG = 0C2h Sau lệnh: ACC = 0D9h, REG= 0C2h Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 168 ADDRC - ADD ACC and Carry bit to reg ADDRC reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0010_00 dest = (ACC) + (reg) + C Cộng nội dung của thanh ghi tích lũy ACC với nội dung thanh ghi reg và cờ nhớ. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: C, HC, Z ADDRC REG, 0, 0 Trước lệnh: Carry bit = 1, REG = 02h, ACC = 4Dh Sau lệnh: Carry bit = 0, REG = 02h, ACC = 50h ANDI - AND constant to ACC ANDI imm OPCODE imm (constant) 15 7 08 OPCODE = 0000_1011 ACC = (ACC) AND imm Nội dung của thanh ghi tích lũy ACC được AND với giá trị tức thời trong mã lệnh. Kết quả lưu trong thanh ghi ACC. Các bit cờ ảnh hưởng: Z ANDI 0x5F Trước lệnh: ACC = A3h Sau lệnh: ACC = 03h Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 169 ANDR - AND ACC to reg ANDR reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 \ OPCODE = 0001_01 dest = (ACC) AND (reg) Nội dung của thanh ghi tích lũy ACC được AND nội dung thanh ghi reg. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z ANDR REG, 0, 0 Trước lệnh: ACC = 17h, REG = C2h Sau lệnh: ACC = 02h, REG = C2h BCLR - Bit Clear reg BCLR reg, bit, bse OPCODE bit bse reg 15 11 9 8 7 012 OPCODE = 1001 R[bit] = 0 Tong thanh ghi reg, tại vị trí bit, giá trị sẽ bị xóa 0. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: không có BCLR REG, 6, 0 Trước lệnh: REG = C7h Sau lệnh: REG = 87h Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 170 BRC - Branch if Carry BRC off8 OPCODE off8 15 7 08 OPCODE = 1110_0010 IF C=1 then PC = (PC) + 1 + off8 Else PC = (PC) + 1 Nếu cờ nhớ C = 1 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu dạng bù 2. Lệnh này là một lệnh 2 chu kỳ. Các bit cờ ảnh hưởng: không có BRC 5 Trước lệnh: PC = địa chỉ lệnh BRC Sau lệnh: Nếu Carry = 1; PC = address (HERE + 6) Nếu Carry = 0; PC = address (HERE + 1) BRNC - Branch if Not Carry BRNC off8 OPCODE off8 15 7 08 OPCODE = 1110_0011 IF C=0 then PC = (PC) + 1 + off8 Else PC = (PC) + 1 Nếu cờ nhớ C = 0 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu dạng bù 2. Lệnh này là một lệnh 2 chu kỳ. Các bit cờ ảnh hưởng: không có BRNC TARGET Trước lệnh: PC = địa chỉ lệnh BRNC Sau lệnh: Nếu Carry = 0; PC = address (TARGET) Nếu Carry = 1; PC = address (TARGET) Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 171 BRNZ - Branch if Not Zero BRNZ off8 OPCODE off8 15 7 08 OPCODE = 1110_0001 IF Z=0 then PC = (PC) + 1 + off8 Else PC = (PC) + 1 Nếu cờ không Z = 0 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu dạng bù 2. Lệnh này là một lệnh 2 chu kỳ. Các bit cờ ảnh hưởng: không có BRNZ TARGET Trước lệnh: PC = địa chỉ lệnh BRNZ Sau lệnh: Nếu Zero = 0; PC = address (TARGET) Nếu Zero = 1; PC = address (TARGET) BRZ - Branch if Zero BRZ off8 OPCODE off8 15 7 08 OPCODE = 1110_0000 IF Z=1 then PC = (PC) + 1 + off8 Else PC = (PC) + 1 Nếu cờ không Z = 1 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu dạng bù 2. Lệnh này là một lệnh 2 chu kỳ. Các bit cờ ảnh hưởng: không có BRZ TARGET Trước lệnh: PC = địa chỉ lệnh BRZ Sau lệnh: Nếu Zero = 1; PC = address (TARGET) Nếu Zero = 0; PC = address (TARGET) Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 172 BSET - Bit Set reg BSET reg, bit, bse OPCODE bit bse reg 15 11 9 8 7 012 OPCODE = 1000 R[bit] = 1 Tong thanh ghi reg, tại vị trí bit, giá trị sẽ được gán lên 1. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: không có BSET REG, 7, 1 Trước lệnh: REG = 0Ah Sau lệnh: REG = 8Ah BTBC - Bit Test reg, Bypass if Clear BTBC reg, bit, bse OPCODE bit bse reg 15 11 9 8 7 012 OPCODE = 1011 IF (R[bit] = 0) bỏ qua lệnh tiếp theo Tong thanh ghi reg, tại vị trí bit, nếu giá trị của bit này bằng 0 thì lệnh tiếp theo sẽ không được thực thi. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: không có BTBC FLAG, 1, 0 Trước lệnh: PC = địa chỉ của BTBC Sau lệnh: Nếu FLAG[1] = 0; PC = PC + 2 Nếu FLAG[1] = 1; PC = PC + 1 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 173 BTBS - Bit Test reg, Bypass if Set BTBS reg, bit, bse OPCODE bit bse reg 15 11 9 8 7 012 OPCODE = 1010 IF (R[bit] = 1) bỏ qua lệnh tiếp theo Tong thanh ghi reg, tại vị trí bit, nếu giá trị của bit này bằng 1 thì lệnh tiếp theo sẽ không được thực thi. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: không có BTBS FLAG, 1, 0 Trước lệnh: PC = địa chỉ của BTBS Sau lệnh: Nếu FLAG[1] = 1; PC = PC + 2 Nếu FLAG[1] = 0; PC = PC + 1 CLR - Clear reg CLR reg, bse OPCODE bse reg 15 9 8 7 0 OPCODE = 0110_101 IF (reg > ACC) bỏ qua lệnh tiếp theo Xóa nội dung của thanh ghi reg về 0. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z CLR REG,1 Trước lệnh: REG = 7Fh, Z = ? Sau lệnh: REG = 00h, Z = 1 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 174 CLRWDT - Clear Watchdog Timer CLRWDT OPCODE 15 0 OPCODE = 0000_0000_0000_0100 WDT postscaler = 000h WDT prescaler = 000h WDTO = 0 PWD = 1 Xóa nội dung của bộ đếm Watchdog về 0. Các bit cờ ảnh hưởng: WDTO, PWD CLRWDT Trước lệnh: WDT Counter = ? Sau lệnh: WDT Counter = 00h, WDT Postscaler = 0, WDTO = 0, PWD = 0 CPL - Complement reg CPL reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0001_11 dest = NOT (reg) Lấy bù 1 của nội dung thanh ghi reg. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z CPL REG, 0, 0 Trước lệnh: REG = 00h Sau lệnh: REG = 00h, ACC = FFh Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 175 DA - Decimal Adjust ACC Register DA OPCODE 15 0 OPCODE = 0000_0000_0000_0111 HC_tmp || ACC[3:0] = ([ACC[3:0] > 9] và [HC = 1]) ?(ACC [3:0]) + 6 : ACC [3:0]) ACC [7:4] = ([ACC [7:4] > 9] và [C = 1]) ? (ACC [7:4]) + 6 + HC_tmp; C = 1 : (ACC [7:4]) + HC_tmp Sau khi thực hiện các phép toán trên các số BCD, lệnh này chỉnh sửa giá trị trong thanh ghi ACC cho đúng với BCD. Kết quả được lưu lại thanh ghi ACC. Các bit cờ ảnh hưởng: C DA Trước lệnh: ACC = B3h, C = 0, HC = 0 Sau lệnh: ACC = 13h, C = 1, HC = 0 DBNZ - Decrement reg, Bypass if not 0 DBNZ reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0100_11 dest = (reg)- 1 IF (dest ≠ 0) bỏ qua lệnh tiếp theo Giảm nội dung thanh ghi reg đi 1 đơn vị. Nếu kết quả sau khi giảm khác 0 thì bỏ qua lệnh tiếp theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ. Các bit cờ ảnh hưởng: không có DBNZ TEMP, 1, 0 Trước lệnh: TEMP = ? Sau lệnh: TEMP = TEMP – 1 If TEMP = 0 PC = (PC) + 1 If TEMP ≠ 0; PC = (PC) + 2 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 176 DBZ - Decrement reg, Bypass if 0 DBZ reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0010_11 dest = (reg)- 1 IF (dest = 0) bỏ qua lệnh tiếp theo Giảm nội dung thanh ghi reg đi 1 đơn vị. Nếu kết quả sau khi giảm bằng 0 thì bỏ qua lệnh tiếp theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ. Các bit cờ ảnh hưởng: không có DBZ TEMP, 1, 0 Trước lệnh: TEMP = ? Sau lệnh: TEMP = TEMP – 1 If TEMP ≠ 0 PC = (PC) + 1 If TEMP = 0; PC = (PC) + 2 DEC - Decrement reg DEC reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0000_01 dest = (reg)- 1 Giảm nội dung thanh ghi reg đi 1 đơn vị. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: C, HC, Z DEC CNT, 1, 0 Trước lệnh: CNT = 01h, Z = 0 Sau lệnh: CNT = 00h, Z = 1 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 177 IACC - Immediate value to ACC IACC imm OPCODE imm (constant) 15 7 08 OPCODE = 0000_1110 ACC = imm Nạp nội dung 8-bit cho thanh ghi ACC. Kết quả lưu vào thanh ghi ACC. Các bit cờ ảnh hưởng: không có IACC 0x3C Trước lệnh: ACC = ? Sau lệnh: ACC = 3Ch IBZ - Increment reg, Bypass if not 0 IBNZ reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0100_10 dest = (reg)+ 1 IF (dest ≠ 0) bỏ qua lệnh tiếp theo Tăng nội dung thanh ghi reg lên 1 đơn vị. Nếu kết quả sau khi tăng khác 0 thì bỏ qua lệnh tiếp theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ. Các bit cờ ảnh hưởng: không có IBNZ REG, 1, 0 Trước lệnh: PC = địa chỉ lệnh IBNZ Sau lệnh: If REG ≠ 0; PC = (PC) + 2 If REG = 0; PC = (PC) + 1 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 178 IBS - Immediate value to Bank Select IBS imm OPCODE imm (constant) 15 7 08 00 6 5 OPCODE = 0000_0001 BS = imm Nạp nội dung 6 bit cho thanh ghi chọn băng BS. Kết quả lưu vào thanh ghi BS. Các bit cờ ảnh hưởng: không có IBS 0x01 Trước lệnh: BS = ? Sau lệnh: BS = 01h Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 179 IBZ - Increment reg, Bypass if 0 IBZ reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0011_11 dest = (reg)+ 1 IF (dest = 0) bỏ qua lệnh tiếp theo Tăng nội dung thanh ghi reg lên 1 đơn vị. Nếu kết quả sau khi tăng bằng 0 thì bỏ qua lệnh tiếp theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ. Các bit cờ ảnh hưởng: không có IBZ REG, 1, 0 Trước lệnh: PC = địa chỉ lệnh IBZ Sau lệnh: If REG =0; PC = (PC) + 2 If REG ≠ 0; PC = (PC) + 1 IDLE - Enter Idle Mode IDLE OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0011_11 WDT postscaler = 000h WDT prescaler = 000h WDTO = 0 PWD = 1 Đưa thiết bị về chế độ tiết kiệm năng lượng. Trong trạng thái này thì các ngoại vi không bắt buộc phải chạy sẽ được tắt xung clock (chi tiết xem mục Chế độ tiết kiệm năng lượng (IDLE Mode)). Các bit cờ ảnh hưởng: không có IDLE Trước lệnh: WDTO = ?, PWD = ? Sau lệnh: WDTO = 0 *, PWD = 1 * Nếu thiết bị đánh thức bởi Watchdog thì bit này sẽ được gán lên 1. Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 180 IDP0 - Immediate value to Data Pointer 0 IDP0 imm OPCODE1 imm [13:8] (constant) 15 9 010 0 8 7 OPCODE1 = 1101_00 OPCODE2 imm [7:0] 15 11 012 0 6 5 OPCODE2 = 0111 DPH0 = imm[13:8] DPL0 = imm[7:0] Nạp nội dung 14 bit cho cặp thanh ghi DPH0 và DPL0 của con trỏ số 0. Các bit cờ ảnh hưởng: không có IDP0 0x100 Trước lệnh: DPH0 = ?, DPL0 = ? Sau lệnh: DPH0 = 01h, DPL0 = 00h IDP1 - Immediate value to Data Pointer 1 IDP1 imm OPCODE1 imm [13:8] (constant) 15 9 010 0 8 7 OPCODE1 = 1101_01 OPCODE2 imm [7:0] 15 11 012 0 6 5 OPCODE2 = 0111 DPH1 = imm[13:8] DPL1 = imm[7:0] Nạp nội dung 14 bit cho cặp thanh ghi DPH1 và DPL1 của con trỏ số 1. Các bit cờ ảnh hưởng: không có IDP1 0x234 Trước lệnh: DPH1 = ?, DPL1 = ? Sau lệnh: DPH1 = 02h, DPL1 = 34h Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 181 IDPOFF - Immediate value to Data Pointer Offset IDPOFF imm OPCODE imm (constant) 15 7 08 OPCODE = 1110_0111 IDPOFF 0xA1 Nạp nội dung 8-bit cho thanh ghi DPOFF. Kết quả lưu vào thanh ghi DPOFF. Các bit cờ ảnh hưởng: không có IDPOFF 0xA1 Trước lệnh: DPOFF = ? Sau lệnh: DPOFF = A1h INC - Increment reg INC reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0010_10 dest = (reg)+ 1 Tăng nội dung thanh ghi reg lên 1 đơn vị. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: C, HC, Z INC COUNT, 1, 0 Trước lệnh: COUNT = FFh, Z = 0, C = ?, HC= ? Sau lệnh: COUNT = 00h, Z = 1, C = 1, HC = 1 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 182 JMPA - Jump with ACC JMPA OPCODE 0 15 7 08 OPCODE = 1110_0110 PC = (PC) + 1 + (TPS,ACC) Nhảy đến địa chỉ bất cứ vị trí nào trong bộ nhớ chương trình. Nội dung của PC + 1 được cộng với nội dung cặp thanh ghi TPS và ACC. Trong đó, TPS là các bit cao, còn ACC là các bit thấp. Chú ý: nếu nội dung của thanh ghi TPS hoặc ACC thay đổi thì phải trễ sau 1 chu kỳ mới được phép thực hiện lệnh JMPA. Các bit cờ ảnh hưởng: không có JMPA Trước lệnh: PC = địa chỉ lệnh JMPA, ACC = 08h, TPS = 00h Sau lệnh: PC = (PC) + 9, ACC = 08h, TPS = 00h LCALL - Long Subroutine Call LCALL imm OPCODE imm [7:0] 15 7 08 OPCODE1 = 1110_0101 OPCODE2 imm [7:0] 15 8 012 0 711 OPCODE2 = 0111 PC = target16 TS = (PC) + 2 Gọi chương trình con tại bất cứ vị trí nào trong bộ nhớ chương trình. Trước khi nhảy đến chương trình con thì địa chỉ (PC) + 2 sẽ được lưu lại trong Stack. Sau đó chương trình sẽ tiếp tục tại vị trí của chương trình con. Các bit cờ ảnh hưởng: không có LCALL FUNCTION Trước lệnh: PC = địa chỉ lệnh LCALL Sau lệnh: PC = địa chỉ của FUCNTION Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 183 Ld - Load reg to ACC LD reg, bse OPCODE 0 bse reg 15 10 9 8 7 0 OPCODE = 0101_00 PC = target16 TS = (PC) + 2 Nạp thanh ghi tích lũy ACC giá trị của thanh ghi reg. Các bit cờ ảnh hưởng: Z LD REG, 0 Trước lệnh: ACC = ?, REG = 55h Sau lệnh: ACC = 00h, REG = 00h, Z = 1 LJMP - Long Jump LJMP imm OPCODE imm [7:0] 15 7 08 OPCODE1 = 1110_0100 OPCODE2 imm [7:0] 15 8 012 0 711 OPCODE2 = 0111 PC = target16 Nhảy đến vị trí bất kỳ trong bộ nhớ chương trình. Sau đó chương trình sẽ tiếp tục tại vị trí của nhảy đến. Các bit cờ ảnh hưởng: không có LJMP THERE Trước lệnh: PC = địa chỉ lệnh LJMP Sau lệnh: PC = địa chỉ của THERE Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 184 MULI - Multiply Constant with ACC MULI imm OPCODE imm (constant) 15 7 08 OPCODE = 0000_1101 HI:LO = (ACC) x imm Thực hiện phép toán nhân không dấu giữa thanh ghi tích lũy ACC và giá trị tức thời trong mã lệnh. Kết quả phép nhân được lưu vào cặp thanh ghi HI:LO. Với HI là phần 8-bit cao của tích và LO là phần 8-bit thấp của tích. Các bit cờ ảnh hưởng: không có MULI 0x3C Trước lệnh: ACC = A8h, HI = ?, LO = ? Sau lệnh: ACC = A8h, HI = 27h, LO = 60h MULR - Multiply reg with ACC MULR reg, bse OPCODE bse reg 15 9 8 7 0 OPCODE = 0000_001 HI:LO = (ACC) x (reg) Thực hiện phép toán nhân không dấu giữa thanh ghi tích lũy ACC và thanh ghi reg. Kết quả phép nhân được lưu vào cặp thanh ghi HI:LO. Với HI là phần 8-bit cao của tích và LO là phần 8-bit thấp của tích. Các bit cờ ảnh hưởng: không có MULR REG, 1 Trước lệnh: ACC = C4h, REG = D1h, HI =?, LO = ? Sau lệnh: ACC = C4h, REG = D1h, HI = A0h, LO = 04h Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 185 NOP - No Operation NOP OPCODE 15 0 OPCODE = 0000_0000_0000_0000 Không làm gì cả Lệnh này không thực hiện bất cứ thay đổi nào trong trạng thái hệ thống. Sau lệnh này chỉ tăng giá trị của PC lên thôi. Các bit cờ ảnh hưởng: không có NOP Sau lệnh: không thay đổi trạng thái ORI - OR Constant with ACC ORI imm OPCODE imm (constant) 15 7 08 OPCODE = 0000_1001 ACC = (ACC) OR imm Thực hiện OR nội dung của thanh ghi tích lũy ACC với giá trị tức thời trong mã lệnh. Các bit cờ ảnh hưởng: Z ORI 0x35 Trước lệnh: ACC = 9Ah Sau lệnh: BFh Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 186 ORR - OR ACC with reg ORR reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0001_00 dest = (ACC) OR (reg) Thực hiện OR nội dung của thanh ghi tích lũy ACC với nội dung của thanh ghi reg. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z ORR REG, 0, 1 Trước lệnh: REG = 13h, ACC = 91h Sau lệnh: REG = 13h, ACC = 93h POP - Pop Top of Return Stack POP OPCODE 15 0 OPCODE = 0000_0000_0000_0110 Xóa (TS), giảm con trỏ Stack Lấy một mục ra khỏi Stack đồng thời giảm giá trị của con trỏ đọc Stack đi 1 đơn vị. Các bit cờ ảnh hưởng: không có POP Trước lệnh: TS = 31A2h, Stack (thấp hơn 1 mức) = 4332h SJMP NEW Sau lệnh: TS = 4332h, PC = địa chỉ của NEW Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 187 PUSH - Push Top of Return Stack PUSH OPCODE 15 0 OPCODE = 0000_0000_0000_0101 TS = (PC) + 1, tăng con trỏ Stack Đẩy giá trị của (PC) + 1 vào Stack đồng thời tăng giá trị của con trỏ lên 1 đơn vị. Các bit cờ ảnh hưởng: không có PUSH Trước lệnh: TS = 345Ah, PC = 0124h Sau lệnh: PC = 0126h, TS = 0126h, Stack (thấp hơn 1 mức) = 345Ah RET - Return from Subroutine RET OPCODE 15 0 OPCODE = 0000_0000_0000_0010 PC = (TS) Trở về từ chương trình con, địa chỉ PC được cập nhật với giá trị nhận được từ Stack. Các bit cờ ảnh hưởng: không có RETA k0 Trước lệnh: ACC = ? Sau lệnh: ACC = k0 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 188 RETI - Return from Interrupt RETI OPCODE 15 0 OPCODE = 0000_0000_0001_0000 PC = (TS) GIE/GIEH = 1 hoặc PIE/GIEL = 1 Trở về từ chương trình xử lý ngắt, Stack được đọc ra và giảm địa chỉ con trỏ Stack. Giá trị đọc từ Stack sẽ được cập nhật cho thanh ghi bộ đếm chương trình PC. Các bit cờ ảnh hưởng: không có RETI Trước lệnh: PC = địa chỉ lệnh RETI Sau lệnh: PC = (TS), GIE/GIEH, PIE/GIEL = 1 RL - Rotate Left reg (no carry) RL reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0100_01 dest[7:0] = R[6:0] || R[7] Nội dung của thanh ghi reg được xoay trái 1 bit. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z RL REG, 1, 0 Trước lệnh: REG = 1010 1011 Sau lệnh: REG = 0101 0111 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 189 RLC - Rotate Left reg through Carry RLC reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0011_01 C || dest[7:0] = R[7:0] || C Nội dung của thanh ghi reg được xoay trái 1 bit qua cờ nhớ C. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z, C RLC REG, 0, 0 Trước lệnh: REG = 1110 0110, ACC = ?, C = 0 Sau lệnh: REG = 1110 0110, ACC = 1100 1100, C = 1 RR - Rotate Right reg (no carry) RR reg, dst, bse OPCODE dst bse reg 15 10 9 8 7 0 OPCODE = 0100_00 dest[7:0] = R[0] || R[7:1] Nội dung của thanh ghi reg được xoay phải 1 bit. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse. Các bit cờ ảnh hưởng: Z RR REG, 0, 0 Trước lệnh: ACC = ?, REG = 1101 0111 Sau lệnh: ACC = 1110 1011, REG = 1101 0111 Tập lệnh © 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 190 RRC - Rotate Right reg through Carry RRC reg, dst, bse OPCODE dst bse reg 15 10

Các file đính kèm theo tài liệu này:

  • pdfhuong_dan_su_dung_vi_dieu_khien_8_bit_sg8v1_phan_2.pdf
Tài liệu liên quan