Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 1
Trang chủ: www.icdrec.edu.vn E-mail: [email protected]
Điện thoại: (84-8).37242171 - (84-8).37242172 Email kinh doanh: [email protected]
Email hỗ trợ: [email protected]
ƯỚNG DẪN SỬ DỤNG
VI ĐIỀU KHIỂN 8-bit
Thông tin cập nhật
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 2
Ngày cập nhật Thông tin cập nhật Phiên bản
13/10/2014 Mô tả lại bit trạng thái ngắt
UxRCIF của thanh ghi IF2,
thuộc ngoại vi UART
Bổ sung đặc tính điện, thông
tin package, kết nối các chân
đặc biệt
Rev 1.0
29/10/2014 Chỉnh sửa lại mô tả tập lệnh Rev 1.1
10/12/2014 Bổ sung công suất tiêu thụ Rev 1.2
12/12/2014 Sửa phần mô tả lệnh SUBI Rev 1.3
23/06/2015 Sửa thông tin layout Rev 1.4
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 3
Nội dung
Nội dung........................................................................................................................................... 3 Mục lục hình .................................................................................................................................... 7 Mục lục bảng.................................................................................................................................. 10 Danh Mục Thuật Ngữ và Từ Viết Tắt............................................................................................ 11
1. Giới thiệu ................................................................................................................................... 14 1.1. Sơ đồ chân ........................................................................................................................... 16 1.2. Sơ đồ khối ........................................................................................................................... 18
2. Kiến trúc pipeline ....................................................................................................................... 19 2.1. Các bước thực hiện lệnh ..................................................................................................... 19
2.2. Kiến trúc pipeline 3 tầng ..................................................................................................... 19
2.3. Cách tính số chu kỳ thực hiện lệnh ..................................................................................... 20 3. Chế độ tiết kiệm năng lượng (IDLE Mode) ............................................................................... 23
3.1. Mô tả ................................................................................................................................... 23 3.2. Thanh ghi báo trạng thái CPU - CPUSTA ......................................................................... 25 3.3. Bộ đếm chương trình (PC) .................................................................................................. 25 3.4. Stack .................................................................................................................................... 25
3.4.1. Truy xuất giá trị mới nhất của Stack (TS: Top of Stack) ............................................. 26 3.4.2. Stack Pointer (SP) ........................................................................................................ 26
4. Reset của SG8V1 ....................................................................................................................... 29 4.1. Tổng quan về Reset ............................................................................................................. 29
4.2. Reset bởi người sử dụng (chân RST ) .............................................................................. 29
4.3. Reset khi chọn lập trình Flash (chân SPCS) ....................................................................... 29
4.4. Reset bởi stack .................................................................................................................... 30
4.5. Reset bởi Watchdog ............................................................................................................ 30 5. Kết nối các chân tín hiệu đặc biệt .............................................................................................. 31
5.1. Tụ nguồn, Cap, SPCS ......................................................................................................... 31 5.2. Mạch kết nối thạch anh ....................................................................................................... 32 5.3. Reset .................................................................................................................................... 33
6. Tổ chức bộ nhớ chương trình ..................................................................................................... 35 6.1. Bộ đếm chương trình .......................................................................................................... 35 6.2. Stack .................................................................................................................................... 36
6.2.1. Truy xuất giá trị mới nhất của Stack (TS: Top of Stack) ............................................. 36 6.2.2. Stack Pointer (SP) ........................................................................................................ 37
7. Tổ chức bộ nhớ dữ liệu .............................................................................................................. 38
7.1. Bộ nhớ Flash Data Memory ................................................................................................ 38
7.2. Bộ nhớ RAM ....................................................................................................................... 38 7.2.1. Thanh ghi chọn băng .................................................................................................... 39 7.2.2. Truy cập nhanh bộ nhớ dữ liệu .................................................................................... 40
7.2.3. Thanh ghi mục đích chung ........................................................................................... 40 7.2.4. Thanh ghi chức năng đặc biệt ...................................................................................... 40
7.2.5. Các chế độ định địa chỉ bộ nhớ .................................................................................... 46 8. Bộ nhân 8-bit.............................................................................................................................. 48 9. Ngắt ............................................................................................................................................ 49
9.1. Thanh ghi quản lý ngắt toàn cục (GIC) .............................................................................. 50 9.2. Thanh ghi điều khiển ngắt theo cạnh (INTEDG)................................................................ 52 9.3. Thanh ghi cho phép ngắt 1 (IE1) ........................................................................................ 52
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 4
9.4. Thanh ghi độ ưu tiên ngắt 1 (IP1) ....................................................................................... 53
9.5. Thanh ghi lưu cờ ngắt 1 (IF1) ............................................................................................. 54 9.6. Thanh ghi cho phép ngắt 2 (IE2) ........................................................................................ 56 9.7. Thanh ghi độ ưu tiên ngắt 2 (IP2) ....................................................................................... 57
9.8. Thanh ghi lưu cờ ngắt 2 (IF2) ............................................................................................. 58 9.9. Thanh ghi cho phép ngắt 3 (IE3) ........................................................................................ 60 9.10. Thanh ghi độ ưu tiên ngắt 3 (IP3) ..................................................................................... 61 9.11. Thanh ghi lưu cờ ngắt 3 (IF3) ........................................................................................... 61
10. Cổng truy xuất dữ liệu (General Purpose Input/Output - GPIO) ............................................. 63
10.1. GPIO PortA ....................................................................................................................... 65 10.2. GPIO PortB ....................................................................................................................... 66 10.3. GPIO PortC ....................................................................................................................... 70 10.4. GPIO PortD ....................................................................................................................... 73
11. Watchdog Timer ...................................................................................................................... 77 12. Timer 0 ..................................................................................................................................... 79
12.1. Mô tả Timer 0 ................................................................................................................... 79 12.2. Ngắt Timer0 ...................................................................................................................... 80
12.3. Bộ chia tần trước ............................................................................................................... 80 12.4. Thanh ghi .......................................................................................................................... 81
12.4.1. WT0CON ................................................................................................................... 81
12.4.2. T0REG ....................................................................................................................... 82 13. Timer 1 ..................................................................................................................................... 83
13.1. Chức năng của Timer 1 ..................................................................................................... 83
13.1.1. Tổng quan chức năng định thời của Timer 1 ............................................................. 83 13.1.2. Các chế độ của Timer1 .............................................................................................. 84
13.1.3. Đọc và ghi 16-bit thanh ghi bộ đếm Timer1 .............................................................. 85
13.2. Khối bắt và so sánh sự kiện .............................................................................................. 85
13.2.1. Chế độ bắt sự kiện ...................................................................................................... 86 13.2.2. Chế độ so sánh sự kiện ............................................................................................... 87
13.3. Thanh ghi .......................................................................................................................... 87 13.3.1. T1CON ....................................................................................................................... 88 13.3.2. T1RH.......................................................................................................................... 89 13.3.3. T1RL .......................................................................................................................... 89
13.3.4. CCRH ......................................................................................................................... 89 13.3.5. CCRL ......................................................................................................................... 89
14. Timer 2 và Timer 3 (Timer_x) ................................................................................................. 90 14.1. Tổng quan Timer_x........................................................................................................... 90 14.2. Hoạt động của Timer_x .................................................................................................... 90
14.3. Ngắt Timer_x .................................................................................................................... 91 14.4. Đọc/ghi 10-bit trong Timer_x. .......................................................................................... 91
14.5. Thanh ghi .......................................................................................................................... 92 14.5.1. TxCON ....................................................................................................................... 92 14.5.2. TxRH.......................................................................................................................... 92 14.5.3. TxRL .......................................................................................................................... 93 14.5.4. TxPRH ....................................................................................................................... 93
14.5.5. TxPRL ........................................................................................................................ 93 15. Bộ tạo xung PWM (The Pulse Width Modulation) ................................................................. 94
15.1. Tổng quan PWM_x ........................................................................................................... 94 15.2. Chu kỳ xung PWM_x ....................................................................................................... 94 15.3. Chu kỳ nhiệm vụ ............................................................................................................... 95
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 5
15.4. Cấu hình hoạt động cho khối PWM_x .............................................................................. 96
15.5. Thanh ghi .......................................................................................................................... 97 15.5.1. PWMxCON................................................................................................................ 97 15.5.2. PWMxRL ................................................................................................................... 97
16. Serial Peripheral Interface (SPI) .............................................................................................. 98 16.1. Giới thiệu SPI.................................................................................................................... 98 16.2. Các thanh ghi của SPI ....................................................................................................... 99
16.2.1. Thanh ghi điều khiển SPI - SPICON ......................................................................... 99 16.2.2. Thanh ghi trạng thái - SPISTA ................................................................................ 100
16.3. Hoạt động của SPI .......................................................................................................... 101 16.4. Các bước cấu hình SPI .................................................................................................... 103
16.4.1. Cấu hình SPI ở chế độ master .................................................................................. 103 16.4.2. Cấu hình SPI ở chế độ slave .................................................................................... 103
17. Inter-Integrated Circuit (I2C) ................................................................................................. 106 17.1. Thanh ghi của I2C ........................................................................................................... 106
17.1.1. I2CCON1 ................................................................................................................. 106 17.1.2. I2CCON2 ................................................................................................................. 108
17.1.3. I2CSTA .................................................................................................................... 109 17.1.4. CNTH/ADDRH và CNTL/ADDRL ........................................................................ 112 17.1.5. I2CBUF .................................................................................................................... 113
17.2. Hoạt động ........................................................................................................................ 114 17.3. Chế độ Master ................................................................................................................. 115
17.3.1. Master Truyền .......................................................................................................... 115
17.3.2. Master Nhận ............................................................................................................. 118 17.3.3. Đồng bộ clock .......................................................................................................... 121
17.3.4. Phân xử .................................................................................................................... 121
17.3.5. Định thời của sự kiện Start ...................................................................................... 122
17.3.6. Định thời của sự kiện Repeat Start .......................................................................... 123 17.3.7. Định thời của sự kiện Stop ....................................................................................... 124
17.3.8. Xung đột bus ............................................................................................................ 124 17.4. Chế độ Slave ................................................................................................................... 128
17.4.1. Định địa chỉ Slave .................................................................................................... 128 17.4.2. Mặt nạ địa chỉ........................................................................................................... 128
17.4.3. Địa chỉ 7-bit ............................................................................................................. 129 17.4.4. Chế độ 10-bit địa chỉ ................................................................................................ 131
17.5. Kéo dài xung clock ......................................................................................................... 132 17.6. Địa chỉ General Call........................................................................................................ 133 17.7. Dạng sóng ....................................................................................................................... 133
17.7.1. Dạng sóng I2C Master phát (chế độ 7-bit hoặc 10-bit địa chỉ) ................................ 134 17.7.2. Dạng sóng I2C Master nhận (chế độ 7-bit địa chỉ) .................................................. 135
17.7.3. Dạng sóng I2C Slave nhận chế độ 7-bit địa chỉ ....................................................... 136 17.7.4. Dạng sóng I2C Slave phát chế độ 7-bit địa chỉ ........................................................ 137 17.7.5. Dạng sóng I2C Slave nhận chế độ 10-bit địa chỉ ..................................................... 138 17.7.6. Dạng sóng I2C Slave phát chế độ 10-bit địa chỉ ...................................................... 139
18. Ngoại vi UART ...................................................................................................................... 140
18.1. Tổng quan về ngoại vi UART ......................................................................................... 140 18.2. Các thanh ghi liên quan đến ngoại vi UART .................................................................. 140
18.2.1. Thanh ghi trạng thái của ngoại vi UART thứ x (UxSTA) ....................................... 141 18.2.2. Thanh ghi điều khiển của UART thứ x .................................................................... 142 18.2.3. Thanh ghi tốc độ baud của UART thứ x (UxBRL) ................................................. 143
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 6
18.2.4. Thanh ghi lưu dữ liệu truyền của UART thứ x (UxTXREG) .................................. 144
18.2.5. Thanh ghi lưu dữ liệu nhận của UART thứ x (UxRXREG) .................................... 144 18.2.6. Thanh ghi cho phép ngắt thứ 2 (IE2) ....................................................................... 144 18.2.7. Thanh ghi thiết lập ưu tiên ngắt thứ 2 (IP2) ............................................................. 145
18.2.8. Thanh ghi trạng thái ngắt thứ 2 (IF2) ....................................................................... 146 18.2.9. Thanh ghi cấu hình chiều dữ liệu cho Port C (DIRC) ............................................. 148 18.2.10. Thanh ghi cấu hình chiều dữ liệu cho Port B (DIRB) ........................................... 149
18.3. Bộ tạo tốc độ Baud (BRG) .............................................................................................. 150 18.3.1. Tính toán tốc độ Baud .............................................................................................. 151
18.3.2. Xung lấy mẫu và xung dịch dữ liệu bên trong UART ............................................. 153 18.3.3. Lấy mẫu dữ liệu ....................................................................................................... 154 18.3.4. Dịch dữ liệu .............................................................................................................. 155
18.4. Bộ truyền UART ............................................................................................................. 155
18.4.1. Cấu trúc bộ truyền UART ........................................................................................ 155 18.4.2. Cấu hình sử dụng bộ truyền của ngoại vi UART ..................................................... 156
18.5. Bộ nhận UART ............................................................................................................... 158 18.5.1. Cấu trúc bộ nhận UART .......................................................................................... 158
18.5.2. Cấu hình sử dụng bộ nhận của ngoại vi UART ....................................................... 159 19. Ngoại vi ADC ........................................................................................................................ 162
19.1. Cấu trúc cơ bản của ADC ............................................................................................... 162
19.2. Các thanh ghi liên quan đến hoạt động của ADC ........................................................... 163 19.2.1. Thanh ghi điều khiển thứ 1 của ADC (ADCON1) .................................................. 163 19.2.2. Thanh ghi điều khiển thứ 2 của ADC (ADCON2) .................................................. 164
19.2.3. Thanh ghi lưu dữ liệu ADC (ADBUF) .................................................................... 164 19.2.4. Thanh ghi cho phép ngắt số 3 (IE3) ......................................................................... 165
19.2.5. Thanh ghi ưu tiên ngắt số 3 (IP3) ............................................................................ 165
19.2.6. Thanh ghi trạng thái ngắt số 3 (IF3) ........................................................................ 165
19.3. Hoạt động của ngoại vi ADC .......................................................................................... 166 19.4. Các chú ý khi sử dụng ngoại vi ADC ............................................................................. 167
19.4.1. Nguồn xung clock cấp cho ngoại vi ADC ............................................................... 167 19.4.2. Các yêu cầu về thông số và kết nối .......................................................................... 168
20. Bộ điều khiển truy xuất Flash ................................................................................................ 170 20.1. Thanh ghi điều khiển truy xuất Flash ............................................................................. 170
20.1.1. Thanh ghi trọng số cao của Flash Pointer (FPTH) .................................................. 171 20.1.2. Thanh ghi trọng số thấp của Flash Pointer (FPTH) ................................................. 171
20.2. Hoạt động của bộ điều khiển truy xuất flash .................................................................. 171 20.2.1. Truy xuất Flash Program Memory ........................................................................... 171 20.2.2. Truy xuất Flash Data Memory ................................................................................. 173
21. Bộ nhớ chương trình FLASH ................................................................................................ 174 21.1. Phân vùng FLASH .......................................................................................................... 174
21.2. Chế độ bảo vệ chương trình ............................................................................................ 175 22. Tập lệnh ................................................................................................................................. 176
22.1. Giới thiệu ........................................................................................................................ 176 22.2. Thanh ghi cờ phép toán ................................................................................................... 178 22.3. Tóm tắt tập lệnh .............................................................................................................. 178
22.4. Hoạt động của lệnh ......................................................................................................... 181 23. Đặc tính vật lý điện ................................................................................................................ 214 24. Thông tin package .................................................................................................................. 215
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 7
Mục lục hình
Hình 1-1: Sơ đồ chân ..................................................................................................................... 16 Hình 1-2: Sơ đồ khối của vi điều khiển SG8V1 ............................................................................ 18 Hình 2-1: Các bước thực hiện lệnh ................................................................................................ 19 Hình 2-2: Hoạt động thực hiện lệnh với kiến trúc không có pipeline ........................................... 20 Hình 2-3: Thực hiện lệnh với kiến trúc có pipeline ....................................................................... 20
Hình 2-4: Thực hiện lệnh thường với kiến trúc đường ống ........................................................... 20 Hình 2-5: Thực hiện lệnh bypass với kiến trúc đường ống ........................................................... 21 Hình 2-6: Thực hiện lệnh rẽ nhánh đơn chu kỳ với kiến trúc đường ống...................................... 21 Hình 2-7: Thực hiện lệnh rẽ nhánh 2 chu kỳ với kiến trúc đường ống .......................................... 22 Hình 3-1: Mô tả clock trong chế độ nghỉ ....................................................................................... 23
Hình 3-2: Mô tả trường hợp CPU wake up và thực hiện tiếp tục quá trình trước đó .................... 24 Hình 3-3: Mô tả trường hợp CPU wake up và vào chương trình ngắt........................................... 24 Hình 3-4: Stack và các thanh ghi liên quan ................................................................................... 26
Hình 5-1. Các tụ và điện trở kết nối ở các chân ............................................................................. 31 Hình 5-2. Mạch kết nối thạch anh .................................................................................................. 32 Hình 5-3. Layout cho chân thạch anh ............................................................................................ 33
Hình 5-4. Mạch kết nối đến chân RST cơ bản ............................................................................ 33
Hình 5-5: Định thời mạch reset ngoài ............................................................................................ 34
Hình 5-6. Mạch kết nối đến chân RST hạn chế nhiễu................................................................. 34
Hình 5-7. Mạch reset được mắc thêm diode .................................................................................. 34
Hình 6-1: Bản đồ địa chỉ của bộ nhớ dữ liệu ................................................................................. 35 Hình 6-2: Stack và các thanh ghi liên quan ................................................................................... 37
Hình 7-1: Bộ nhớ Flash Data Memory .......................................................................................... 38 Hình 7-2: Cấu trúc bộ nhớ dữ liệu ................................................................................................. 39 Hình 7-3: Sử dụng thanh ghi BS để chọn băng ............................................................................. 40
Hình 10-1: Cell chuẩn của IO_PAD .............................................................................................. 63 Hình 10-2: Mô tả một kết nối Port cơ bản ..................................................................................... 65
Hình 10-3: IO PortA ...................................................................................................................... 66 Hình 10-4: PortB[4] - dùng chung với Timer0 .............................................................................. 68 Hình 10-5: IO PortB[0:1] - dùng chung với UART3..................................................................... 68 Hình 10-6: IO PortB[2:3] - dùng chung với UART2..................................................................... 68
Hình 10-7: IO PortB[5:7] - dùng chung với bộ lập trình FLASH ................................................. 69 Hình10-8: IO PortC[0:1] - dùng chung với UART1...................................................................... 71 Hình10-9: IO PortC[2:3] - dùng chung với PWM ......................................................................... 71
Hình10-10: IO PortC[4:5] - dùng chung với SPI ........................................................................... 71 Hình10-11: IO PortC[6:7] - dùng chung với SPI ........................................................................... 72 Hình 10-12: IO PortD[0:3] - dùng chung với ngắt ngoài .............................................................. 74 Hình 10-13: IO PortD[4:5] - dùng chung với I2C ......................................................................... 74
Hình 10-14: IO PortD[6] - dùng chung với Capture/Compare ...................................................... 75 Hình 10-15: IO PortD[7] - dùng chung với Timer1....................................................................... 75 Hình 11-1 : Mô tả khối Watchdog Timer ...................................................................................... 77 Hình 12-1: Mô tả sơ đồ khối Timer0 ............................................................................................. 80 Hình 13-1: Mô tả sơ đồ khối Timer 1 ............................................................................................ 84
Hình 13-2: Sơ đồ của khối bắt sự kiện ........................................................................................... 87 Hình 13-3: Sơ đồ của khối so sánh sự kiện .................................................................................... 87 Hình 14-1: Sơ đồ khối Timer_x (Timer 2 hoặc Timer 3) .............................................................. 90
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 8
Hình 15-1: Sơ đồ của khối PWM_x............................................................................................... 94
Hình 15-2: Dạng sóng PWM ......................................................................................................... 96 Hình16-1: Sơ đồ khối SPI .............................................................................................................. 98 Hình16-2: Sơ đồ kết nối của SPI ................................................................................................. 102
Hình 16-3: Các chế độ truyền dữ liệu của SPI ............................................................................. 102 Hình 16-4: Dạng sóng của SPI slave (CKP = 0, CKE = 1) ........................................................ 104 Hình 16-5: Đồng bộ tín hiệu SPI SSx .......................................................................................... 105 Hình 17-1: Kết nối các thiết bị đến bus I2C ................................................................................ 115 Hình 17-2: Khung truyền với địa chỉ 7-bit ở chế độ Master truyền ............................................ 116
Hình 17-3: Khung truyền với địa chỉ 10-bit ở chế độ Master truyền .......................................... 117 Hình 17-4: Khung truyền với địa chỉ 7-bit ở chế độ Master nhận ............................................... 118 Hình 17-5: Khung truyền với địa chỉ 10-bit ở chế độ Master nhận ............................................. 120 Hình 17-6: Đồng bộ clock............................................................................................................ 121
Hình 17-7: Phân xử ...................................................................................................................... 122 Hình 17-8: Định thời của quá trình tạo sự kiện Start ................................................................... 123 Hình 17-9: Định thời của quá trình tạo sự kiện Repeat Start ....................................................... 124 Hình 17-10: Định thời của quá trình tạo sự kiện Stop ................................................................. 124
Hình 17-11: Xung độ bus khi tạo Start (1) .................................................................................. 125 Hình 17-12: Xung độ bus khi tạo Start (2) .................................................................................. 125 Hình 17-13: Xung độ bus khi tạo Repeat Start (1) ...................................................................... 126
Hình 17-14: Xung độ bus khi tạo Repeat Start (2) ...................................................................... 126 Hình 17-15: Xung độ bus khi tạo Repeat Start (3) ...................................................................... 126 Hình 17-16: Xung độ bus khi tạo Stop ........................................................................................ 126
Hình 17-17: Xung đột bus trong quá trình truyền nhận dữ liệu ................................................... 127 Hình 17-18: Địa chỉ 7-bit ............................................................................................................. 129
Hình 17-19: Định địa chỉ chế độ 10 bit ........................................................................................ 131
Hình 17-20: Dạng sóng I2C Master phát ..................................................................................... 134
Hình 17-21: Dạng sóng I2C Master nhận .................................................................................... 135 Hình 17-22: Dạng sóng I2C Slave nhận chế độ 7-bit địa chỉ ...................................................... 136
Hình 17-23: Dạng sóng I2C Slave phát chế độ 7-bit địa chỉ ....................................................... 137 Hình 17-24: Dạng sóng I2C Slave nhận chế độ 10-bit địa chỉ .................................................... 138 Hình 17-25: Dạng sóng I2C Slave phát chế độ 10-bit địa chỉ ..................................................... 139 Hình 18-1: Các thành phần chính của ngoại vi UART ................................................................ 140
Hình 18-2: Xung lấy mẫu dữ liệu và xung dịch dữ liệu tính theo hệ số N .................................. 154 Hình 18-3: Xung lấy mẫu dữ liệu và xung dịch dữ liệu với N = 0 .............................................. 154 Hình 18-4: Xung lấy mẫu dữ liệu và xung dịch dữ liệu với N = 1 .............................................. 154 Hình 18-5: Lẫy mẫu dữ liệu với N ≠ 0 ........................................................................................ 154 Hình 18-6: Lấy mẫu dữ liệu với N = 0 ........................................................................................ 155
Hình 18-7: Dịch dữ liệu ............................................................................................................... 155 Hình 18-8: Minh họa cấu trúc cơ bản của bộ truyền UART ........................................................ 156
Hình 18-9: Truyền một khung dữ liệu ......................................................................................... 158 Hình 18-10: Truyền liên tục ......................................................................................................... 158 Hình 18-11: Cấu trúc của UART nhận ........................................................................................ 159 Hình 18-12: UART tiếp nhận ...................................................................................................... 161 Hình 19-1: Sơ đồ khối ngoại vi ADC .......................................................................................... 162
Hình 19-2: Giản đồ thời gian cho hoạt động của ADC ............................................................... 167 Hình 19-3: Lần chuyển đổi đầu tiên sau khi bit ADON (ADCON1[7]) được tích cực ............... 167 Hình 19-4: Mô hình ngõ vào của ADC ........................................................................................ 169 Hình 20-1: Quá trình truy xuất flash ............................................................................................ 172 Hình21-1: Sơ đồ kết nối bộ nạp ................................................................................................... 174
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 9
Hình 24-1: Hình chiếu đứng chip SG8V1 ................................................................................... 215
Hình 24-2: Hình chiếu cạnh chip SG8V1 .................................................................................... 215 Hình 24-3: Mặt cắt A-A ............................................................................................................... 216 Hình 24-4: Mặt cắt B-B ............................................................................................................... 216
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 10
Mục lục bảng
Bảng 1-1: Mô tả chân ..................................................................................................................... 17 Bảng 4-1: Điều kiện reset cho các thanh ghi đặc biệt .................................................................... 30 Bảng 7-1: Các thanh ghi chức năng đặc biệt ................................................................................. 42 Bảng 10-1: Mô tả chân của một IO_PAD ...................................................................................... 63 Bảng 10-2: Mô tả chiều.................................................................................................................. 64
Bảng 10-3: Mô tả bảng nhận dữ liệu ............................................................................................. 64 Bảng 10-4: Thanh ghi DIRA.......................................................................................................... 66 Bảng 10-5: Mô tả thanh ghi PORTA ............................................................................................. 66 Bảng 10-6: Chức năng của PortB .................................................................................................. 69 Bảng 10-7: Thanh ghi DIRB .......................................................................................................... 69
Bảng10-8: Mô tả thanh ghi PORTB .............................................................................................. 70
Bảng 10-9: Chức năng của PortC .................................................................................................. 72 Bảng 10-10: Thanh ghi DIRC ........................................................................................................ 72
Bảng10-11: Chức năng PORTC .................................................................................................... 73 Bảng10-12: Chức năng của PortD ................................................................................................. 75 Bảng 10-13: Thanh ghi DIRD ........................................................................................................ 76 Bảng 10-14: Mô tả chức năng PORTD .......................................................................................... 76
Bảng 11-1 : Mô tả thanh ghi WT0CON ......................................................................................... 77 Bảng 12-1: Mô tả thanh ghi WT0CON .......................................................................................... 81
Bảng 12-2: Mô tả thanh ghi T0REG .............................................................................................. 82 Bảng 13-1: Mô tả thanh ghi T1CON ............................................................................................. 88 Bảng 13-2: Mô tả thanh ghi T1RH ................................................................................................ 89
Bảng 13-3: Mô tả thanh ghi T1RL ................................................................................................. 89 Bảng 13-4: Mô tả thanh ghi CCRH ............................................................................................... 89
Bảng 13-5: Mô tả thanh ghi CCRL ................................................................................................ 89 Bảng 14-1: Mô tả thanh ghi TxCON ............................................................................................. 92
Bảng 14-2 Mô tả thanh ghi TxRH ................................................................................................. 92 Bảng 14-3 Mô tả thanh ghi TxRL .................................................................................................. 93
Bảng 14-4 Mô tả thanh ghi TxPRH ............................................................................................... 93 Bảng 14-5 Mô tả thanh ghi TxPRL................................................................................................ 93
Bảng 15-1: Mô tả thanh ghi PWMxCON ...................................................................................... 97 Bảng 15-2: Mô tả thanh ghi PWMxRL.......................................................................................... 97 Bảng 16-1: Thanh ghi SPI.............................................................................................................. 99
Bảng16-2: Thanh ghi điều khiển SPI- SPICON ............................................................................ 99 Bảng 16-3: Thanh ghi trạng thái SPI- SPISTA ............................................................................ 100
Bảng 17-1: Mô tả thanh ghi I2CCON1 ở chế độ Master ............................................................. 106
Bảng 17-2: Mô tả thanh ghi I2CCON1 ở chế độ Slave ............................................................... 107
Bảng 19-1. Một số giá trị cấu hình tham khảo cho xung clock ngoại vi ADC ............................ 168 Bảng 22-1: Mô tả cho các trường mã lệnh ................................................................................... 176 Bảng 22-2: Tập lệnh SG8V1........................................................................................................ 178 Bảng 23-1: Thông số vật lý điện .................................................................................................. 214 Bảng 24-1: Kích thước vật lý 1 .................................................................................................... 215
Bảng 24-2: Kích thước vật lý 2 .................................................................................................... 216
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 11
Danh Mục Thuật Ngữ và Từ Viết Tắt
Thuật ngữ hoặc ký hiệu Mô tả
RISC
Viết tắt của cụm từ “Reduced Instructions Set Computer”
Một cấu trúc hay phương pháp thiết kế vi xử lý theo hướng
“đơn giản hóa tập lệnh”.
Package Dạng đóng gói chip
LQFP
Viết tắt của cụm từ “Low-profile Quad Flat Package”
Một dạng đóng gói chip với hình dạng phẳng, dẹp, bốn cạnh
bằng nhau.
FIFO
Viết tắt của cụm từ “First In First Out”
Một dạng bộ nhớ lưu dữ liệu hoạt động theo nguyên tắc dữ liệu
được đọc ra theo đúng thứ tự dữ liệu được ghi vào.
full-duplex Truyền nhận song công. Một ngoại vi hỗ trợ “full-duplex” có
thể vừa truyền và nhận dữ liệu tại cùng một thời điểm.
Pipeline
Kỹ thuật “đường ống”
Một kỹ thuật thiết kế vi xử lý cho phép các lệnh có thể thực thi
theo kiểu gối đầu nhau nhằm tận dụng thời gian rỗi giữa các
công đoạn, qua đó làm tăng tốc độ thực hiện lệnh của vi xử lý.
MCU Viết tắt của “Microcontroller Unit”
Bộ vi điều khiển
Reset Là một thuật ngữ chỉ một tác động hay hoạt động khôi phục lại
trạng thái ổn định ban đầu (trạng thái gốc).
Clock Là xung nhịp đồng bộ
CPU
Viết tắt của cụm từ “Central Processing Unit”
Là đơn vị xử lý trung tâm thực hiện giải mã, phân tích và thực
thi các lệnh lập trình.
Flash Tên của loại bộ nhớ được sử dụng làm bộ nhớ chương trình
Stack Bộ lưu trữ địa chỉ truy cập lệnh
Watchdog Bộ định thời giám sát hoạt động của CPU để tránh trường hợp
CPU bị treo khi đang xử lý.
Wake up Là trạng thái sẵn sàng hoạt động
UART Viết tắt của cụm từ “Universal Asynchronous Receiver
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 12
Thuật ngữ hoặc ký hiệu Mô tả
Transmitter”
Ngoại vi truyền nhận nối tiếp bất đồng bộ.
ADC Viết tắt của cụm từ “Analog Digital Conveter”
Ngoại vi chuyển đổi tín hiệu tương tự thành một giá trị số.
Counter Bộ đếm sự kiện
DIR Viết tắt của “Direction”
Chiều
GPIO Viết tắt của cụm từ “General Purpose Input/Output”
Cổng truy xuất đa chức năng
Port Cổng truy xuất
PU
Viết tắt của “Pull-Up”
Kéo lên. Một chân giao tiếp hay tín hiệu được “kéo lên” nghĩa
là chân giao tiếp hay tín hiệu đó sẽ có mức điện áp cao.
Postscaler Bộ chia tần sau
Prescaler Bộ chia tần trước
PWM Viết tắt của cụm từ “Pulse Width Modulation”
Điều chế độ rộng xung
SPCS Viết tắt của cụm từ “Special Program Chip Select”
Chân chọn lập trình
Timer Bộ định thời
Watchdog timer Bộ định thời cảnh báo
WDT Viết tắt của cụm từ “WatchDog Timer”
Bộ định thời cảnh báo
OSC Dao động
Weak pull-up Mức kéo lên yếu
SPI Viết tắt của cụm từ “Serial Peripheral Interface”
Giao tiếp ngoại vi nối tiếp
SCK Clock nối tiếp của ngoại vi SPI
SDI Viết tắt của cụm từ “Serial data input”
Ngõ vào dữ liệu nối tiếp của ngoại vi SPI
Nội dung
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 13
Thuật ngữ hoặc ký hiệu Mô tả
SDO Viết tắt của cụm từ “Serial data output”
Ngõ ra dữ liệu nối tiếp của ngoại vi SPI
SSx Lựa chọn slave hoạt động của ngoại vi SPI
Master Chủ (ngoại vi điều khiển những ngoại vi tương đương khác)
Slave Tớ (ngoại vi chịu sự điều khiển từ ngoại vi tương đương khác)
R Viết tắt của từ “Read”
Chỉ khả năng có thể truy xuất đọc thông tin.
W Viết tắt của từ “Write”
Chỉ khả năng có thể tác động ghi (thay đổi) nội dung dữ liệu.
W(0) Vị trí bit chỉ được phép xóa hoặc ghi vào giá trị 0.
BS Thanh ghi Bank Select. Nó dùng để chọn lựa băng cho RAM
C, HC, Z Các bit trạng thái của ALU: Carry, Half Carry, Zero
GIE Viết tắt của cụm từ “Global Interrupt Enable”
Bit cho phép ngắt toàn cục
PC Viết tắt của cụm từ “Program counter”
Bộ đếm chương trình
PWD Viết tắt của cụm từ “Power-Down”
Bit thông báo chế độ tiết kiệm nguồn
HI Byte cao của thanh ghi kết quả phép nhân
LO Byte thấp của thanh ghi kết quả phép nhân
WDTO Viết tắt của cụm từ “Watchdog time-out”
TS Viết tắt của cụm từ “Top-of-Stack”
ACC
Viết tắt của từ Accumulator
Thanh ghi dùng để lưu trữ của kết quả trung gian sau khi xử lý
toán học và logic
Bypass Bỏ qua (lệnh tiếp theo)
Giới thiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 14
1. Giới thiệu
SG8V1 là một vi điều khiển RISC 8-bit đa dụng, sử dụng cho nhiều mục đích khác nhau. Tập
lệnh gồm 63 lệnh, độ rộng mỗi từ lệnh 16-bit. Bộ nhớ chương trình 64Kx16 và bộ nhớ dữ liệu
16KB. Có 91 thanh ghi có chức năng đặc biệt. SG8V1 được tích hợp rất nhiều ngoại vi như
Watchdog Timer, Timer/Counter, PWM, UART, I2C, SPI,… SG8V1 có thể được sử dụng để làm
bộ phận điều khiển trung tâm của rất nhiều ứng dụng như máy giặt, máy điều hòa, robot, thiết bị
truyền thông, quang báo điện tử,…
Đặc tính chung
Tần số hoạt động: 0 MHz - 20 MHz
Tập lệnh 63 lệnh, độ rộng từ lệnh 16-bit
Có 19 nguồn ngắt
Có 15 mức stack chương trình
Bộ nhớ chương trình Flash bên trong chip, dung lượng 64K x 16
Bộ nhớ dữ liệu bên trong chip, dung lượng 16K x 8
Bộ nhân 8x8 bằng phần cứng, thực hiện đơn chu kỳ
Có chế độ tiết kiệm năng lượng
Có chế độ bảo mật bộ nhớ chương trình
Trình biên dịch Assembly/C
Có Watchdog Timer
Điện áp hoạt động 3.3V
Package cho chip LQFP 48 chân
Giới thiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 15
Ngoại vi
Watchdog Timer: 16-bit, sử dụng xung clock hệ thống
Timer0: Timer/counter 8-bit, kết hợp với 8-bit prescaler; sử dụng xung clock hệ thống
hoặc xung clock ngoài
Timer1: Timer/counter 16-bit, kết hợp với prescaler; sử dụng xung clock hệ thống hoặc
xung clock ngoài; hỗ trợ chế độ capture/compare
Timer2: Timer/counter 10-bit, kết hợp với period register, prescaler và postscaler 10-bit;
sử dụng xung clock hệ thống
Timer3: Timer/counter 10-bit, kết hợp với period register, prescaler và postscaler 10-bit;
sử dụng xung clock hệ thống
GPIO: có 4 port GPIO, mỗi port 8-bit
PWM1: độ phân giải 10-bit
PWM2: độ phân giải 10-bit
UART1: truyền nhận full-duplex, FIFO 2 mức, có hỗ trợ chế độ truyền liên tục
UART2: truyền nhận full-duplex, FIFO 2 mức, có hỗ trợ chế độ truyền liên tục
UART3: truyền nhận full-duplex, FIFO 2 mức, có hỗ trợ chế độ truyền liên tục
SPI: truyền nhận full-duplex, hỗ trợ 2 chế độ Master và Slave
I2C: Hỗ trợ chế độ truyền Standard và Fast, chế độ Master và Slave, chế độ truyền 7-bit
địa chỉ và 10-bit địa chỉ, chế độ Multi-master, chế độ General-call
ADC: Hỗ trợ 4 ngõ vào analog; độ phân giải 8-bit; tốc độ lấy mẫu 500KSPS
Giới thiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 16
1.1. Sơ đồ chân
1
2
3
4
5
6
7
8
9
10
11
12
36
35
34
33
32
31
30
29
28
27
26
25
48 47 46 45 44 43 42 41 40 39 38 37
13 14 15 16 17 18 19 20 21 22 23 24
VREF
VIN4
VIN3
VIN2
VIN1
OSC2
OSC1
RST
PORTB7/SPDATAO
PORTB6/SPDATAI
PORTB5/SPCLK
PORTB4/T0CLK
GND
VDD2
PORTA7
PORTA6
PORTA5
PORTA4
PORTA3
PORTA2
PORTA1
PORTA0
GND
VDD1
VD
D3
GN
D
CA
P
PO
RT
D0
/IN
T0
PO
RT
D1
/IN
T1
PO
RT
D2
/IN
T2
PO
RT
D3
/IN
T3
PO
RT
D4
/SC
L
PO
RT
D5
/SD
A
PO
RT
D6
/CC
PO
RT
D7
/T1C
LK
SP
CS
PO
RT
B3
/TX
2
PO
RT
B2
/RX
2
PO
RT
B1
/TX
3
PO
RT
B0
/RX
3
PO
RT
C0
/RX
1
PO
RT
C1
/TX
1
PO
RT
C2
/PW
M1
PO
RT
C3
/PW
M2
PO
RT
C4
/SC
K
PO
RT
C5
/SD
I
PO
RT
C6
/SD
O
PO
RT
C7
/SS
SG8V1 MCU
Hình 1-1: Sơ đồ chân
Giới thiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 17
Bảng 1-1: Mô tả chân
Tên chân Loại chân Mô tả chân
VDD1 Vào Nguồn cung cấp
VDD2 Vào Nguồn cung cấp
VDD3 Vào Nguồn cung cấp
GND x 3 Vào Mass
RST
Vào Reset
OSC1 Vào Ngõ vào thạch anh
OSC2 Ra Ngõ ra thạch anh
PORTA[7:0] Vào / Ra Bidirectional IO port
PORTB[7:0] Vào / Ra Bidirectional IO port
PORTC[7:0] Vào / Ra Bidirectional IO port
PORTD[7:0] Vào / Ra Bidirectional IO port
SPCS Vào Chip select cho bộ lập trình Flash
SPCLK Vào Clock cho bộ lập trình Flash
SPDATAI Vào Dữ liệu ngõ vào cho bộ lập trình Flash
SPDATAO Ra Dữ liệu ngõ ra cho bộ lập trình Flash
T0CLK Vào Clock ngoài dùng cho Timer 0
TX1 Ra Ngõ truyền của UART1
RX1 Vào Ngõ nhận của UART1
TX2 Ra Ngõ truyền của UART2
RX2 Vào Ngõ nhận của UART2
TX3 Ra Ngõ truyền của UART3
RX3 Vào Ngõ nhận của UART3
PWM1 Ra Ngõ ra của PWM1
PWM2 Ra Ngõ ra của PWM2
SCK Vào / Ra Xung clock cho SPI.
Chế độ Master: Out / Chế độ Slave: In
SDI Vào Dữ liệu ngõ vào SPI
SDO Ra Dữ liệu ngõ ra SPI
SS Vào Tín hiệu Slave Select cho SPI
INT0 Vào Ngắt ngoài 0
INT1 Vào Ngắt ngoài 1
INT2 Vào Ngắt ngoài 2
INT3 Vào Ngắt ngoài 3
SCL Vào / Ra Xung clock nối tiếp cho I2C
SDA Vào / Ra Dữ liệu nối tiếp cho I2C
CC Vào / Ra Chân cho Capture/Compare
Chế độ Capture: In / Chế độ Compare: Out
T1CLK Vào Clock ngoài dùng cho Timer 1
VIN1 Vào Ngõ vào kênh 1 cho ADC
VIN2 Vào Ngõ vào kênh 2 cho ADC
VIN3 Vào Ngõ vào kênh 3 cho ADC
VIN4 Vào Ngõ vào kênh 4 cho ADC
VREF Vào Điện áp chuẩn cho ADC
CAP Vào Chân nối tụ điện
Giới thiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 18
1.2. Sơ đồ khối
Vi điều khiển SG8V1 bao gồm phần lõi vi xử lý 8-bit và các ngoại vi xung quanh. Các ngoại vi
bao gồm: IO Port (GPIO), Watchdog Timer (WDT), Timer0 (TMR0), ADC, Timer1 (TMR1),
Timer2 (TMR2), Timer3 (TMR3), PWM1, PWM2, SPI, I2C, UART1, UART2, UART3. Bộ nhớ
chương trình 64Kx16 được thực hiện bằng Flash. Một khối điều khiển việc lập trình cho Flash
được tích hợp bên trong.
PWM2
SG8V1
Microprocessor
CorePWM1
Serial
Flash
Programming
Controller
TMR1
TMR2
TMR0
UART1 UART2SPI
GPIO
PORTs
Flash 64kx16
SG8V1
TMR3
WDT
UART3
ADC
I2C
DC – Regulator
Hình 1-2: Sơ đồ khối của vi điều khiển SG8V1
Kiến trúc pipeline
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 19
2. Kiến trúc pipeline
2.1. Các bước thực hiện lệnh
Về cơ bản, mỗi một lệnh đơn được chia ra làm 3 bước để thực hiện: FETCH, DECODE, và
EXECUTE. Mỗi bước thực hiện trong một chu kỳ xung clock. Như vậy, mỗi lệnh đơn sẽ hoàn tất
sau 3 chu kỳ xung clock.
FETCH
DECODE
EXECUTE
Nhận lệnh từ bộ
nhớ chương trình
Giải mã lệnh
Thực hiện lệnh
Chu kỳ xung clock 1
Chu kỳ xung clock 2
Chu kỳ xung clock 3
Hình 2-1: Các bước thực hiện lệnh
FETCH: Nhận lệnh từ bộ nhớ chương trình Flash.
DECODE: Giải mã lệnh vừa nhận được ở tầng FETCH.
EXECUTE: Thực hiện các công việc tính toán và ghi kết quả vào đích đến (thanh ghi, bộ nhớ dữ
liệu)
2.2. Kiến trúc pipeline 3 tầng
Kiến trúc pipeline 3 tầng được thực hiện nhằm cải thiện tốc độ hoạt động của SG8V1. Theo đó, 3
bước khác nhau của 3 lệnh liên tiếp sẽ được thực hiện đồng thời. Điều này làm tốc độ hoạt động
của SG8V1 tăng gấp 3 lần. Nghĩa là, mặc dù mỗi lệnh đơn được thực hiện trong 3 chu kỳ xung
clock, nhưng tính trung bình, thời gian để thực hiện chỉ là 1 chu kỳ xung clock. (xem Hình 2-2 và
Hình 2-3)
Kiến trúc pipeline
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 20
F D E
FETCH DECODE EXECUTE F D E
FETCH DECODE EXECUTE
Chu kỳ 1 2 3 4 5 6
Lệnh 1
Lệnh 2
Hình 2-2: Hoạt động thực hiện lệnh với kiến trúc không có pipeline
F D E
F D E
F D E
Chu kỳ 1 2 3 4 5
Lệnh 1
Lệnh 2
Lệnh 3
Hình 2-3: Thực hiện lệnh với kiến trúc có pipeline
2.3. Cách tính số chu kỳ thực hiện lệnh
Trung bình các lệnh thường được thực hiện trong 1 chu kỳ xung clock, như được thể hiện ở Hình
2-4.
F D E
F D E
F D E
F D E
Lệnh 1
Chu kỳ 1 2 3 4 5 6
Lệnh 2
Lệnh 3
Lệnh 4
Hình 2-4: Thực hiện lệnh thường với kiến trúc đường ống
Kiến trúc pipeline
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 21
Đối với các lệnh bypass, trình tự thực hiện lệnh sẽ được thực hiện như Hình 2-5. Theo đó, trung
bình mỗi lệnh bypass sẽ được thực hiện trong 2 chu kỳ xung clock.
F D E
F D
F D E
F D E
Chu kỳ 1 2 3 4 5 6
Lệnh 1: Lệnh Bypass
Lệnh 2: Lệnh bị bypass
Lệnh 3
Lệnh 4
Lệnh này không được thực hiện
Hình 2-5: Thực hiện lệnh bypass với kiến trúc đường ống
Đối với các lệnh rẽ nhánh đơn chu kỳ, trình tự thực hiện lệnh được thể hiện như Hình 2-6. Theo
đó, trung bình mỗi lệnh rẽ nhánh đơn chu kỳ sẽ được thực hiện trong 2 chu kỳ xung clock.
F D E
F
F D E
F D E
Lệnh 1: Lệnh rẽ nhánh
Lệnh 2
Lệnh 3: Lệnh mới ở địa chỉ nhảy tới
Chu kỳ 1 2 3 4 5 6
Lệnh này sẽ không được thực hiện
Hình 2-6: Thực hiện lệnh rẽ nhánh đơn chu kỳ với kiến trúc đường ống
Đối với lệnh rẽ nhánh 2 chu kỳ (lệnh nhảy dài), trình tự thực hiện lệnh được thể hiện như Hình
2-7. Theo đó, trung bình mỗi lệnh rẽ nhánh 2 chu kỳ sẽ được thực hiện trong 3 chu kỳ xung
clock.
Kiến trúc pipeline
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 22
F D E
F
F
F D E
Lệnh 1 (chu kỳ 1): Lệnh rẽ nhánh 2 chu kỳ
Lệnh 3: Lệnh mới ở địa chỉ nhảy tới
Lệnh 4
Chu kỳ 1 2 3 4 5 6
D E
Lệnh 2
F D E
7
Lệnh này không được
thực hiện
Lệnh 1 (chu kỳ 2): Lệnh rẽ nhánh 2 chu kỳ
Hình 2-7: Thực hiện lệnh rẽ nhánh 2 chu kỳ với kiến trúc đường ống
Chế độ tiết kiệm năng lượng
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 23
3. Chế độ tiết kiệm năng lượng (IDLE Mode)
3.1. Mô tả
SG8V1 cho phép người dùng quản lý xung clock cung cấp cho CPU và các ngoại vi. Mỗi thành
phần này hoạt động với một nguồn cấp clock riêng. Các nguồn clock này có thể tắt/mở bằng cách
lập trình.
SG8V1 hỗ trợ 2 chế độ:
Đang hoạt động (Run mode)
Chế độ tiết kiệm năng lượng (IDLE mode)
Ở chế độ đang hoạt động, clock cấp cho CPU và ngoại vi nhịp liên tục (kể cả trong trường hợp
ngoại vi không hoạt động). Nếu muốn tiết kiệm năng lượng khi CPU đang rảnh rỗi, người sử
dụng có thể sử dụng lệnh IDLE để đưa CPU vào chế độ IDLE. Ở chế độ này, clock cấp cho CPU
sẽ dừng lại (xem Hình 3-1). Một chú ý là trước khi thực hiện lệnh IDLE, người dùng nên xóa các
bit ON/OFF của các ngoại vi không sử dụng. Các bit này được mô tả trong Tập Thanh Ghi Có
Chức Năng Đặt Biệt (Special Function Registers).
Clock từ
thạch anh
Clock cấp
cho CPU
Vào chế cho nghỉ wake up
Clock cấp cho ngoại
vi đang tắt
Clock cấp cho ngoại
vi đang mở
Hình 3-1: Mô tả clock trong chế độ nghỉ
Sau khi đã vào chế độ tiết kiệm năng lượng, CPU có thể được đánh thức từ nhiều cách: ngắt hoặc
tràn Watchdog.
Để CPU có thể được đánh thức từ ngắt, người dùng phải cho phép các sự kiện ngắt xảy ra. Trong
quá trình CPU thức giấc, các tình huống sau có thể xảy ra:
Chế độ tiết kiệm năng lượng
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 24
Nếu bit GIE/GIEH được set lên 1 (ngắt ưu tiên cao) hay cả hai bit GIE/GIEH và
PIE/GIEL được set lên 1(ngắt ưu tiên thấp), chương trình sẽ nhảy đến vec-tơ ngắt tương
ứng. Ngược lại, chương trình sẽ thực hiện tiếp tục quá trình trước đó.
PC PC+1 PC+2 PC+3 PC+4 PC+5 PC+6 PC+7PC
Vào chế độ IDLE wake up
Clock từ
thạch anh
Clock cấp
cho CPU
Clock cấp cho ngoại
vi đang tắt
Clock cấp cho ngoại
vi đang mở
Hình 3-2: Mô tả trường hợp CPU wake up và thực hiện tiếp tục quá trình trước đó
PC PC+1 PC+2 PC+3 PC+4 A A+1 A+2PC
vào chế độ DILEwake up
A: Vector ngắt
Clock từ
thạch anh
Clock cấp
cho CPU
Clock cấp cho ngoại
vi đang tắt
Clock cấp cho ngoại
vi đang mở
Hình 3-3: Mô tả trường hợp CPU wake up và vào chương trình ngắt
Việc tràn Watchdog sẽ đánh thức CPU khi nó đang ở chế độ IDLE. Tuy nhiên, người sử
dụng cần lưu ý là nếu CPU đang ở chế độ hoạt động, sự kiện tràn Watchdog sẽ làm cho
SG8V1 khởi động lại. Vì vậy, khi CPU đang hoạt động, người sử dụng nên xóa
Watchdog bằng lệnh CLRWDT trước khi bị tràn.
Chế độ tiết kiệm năng lượng
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 25
3.2. Thanh ghi báo trạng thái CPU - CPUSTA
Tên Bit R/W Mô tả
SRE [7] R/W Xem 3.4.2.2 Thanh ghi báo trạng
thái CPU – CPUSTA
SOV [6] R/W(0) Xem 3.4.2.2 Thanh ghi báo trạng
thái CPU – CPUSTA
SUNF [5] R/W(0) Xem 3.4.2.2 Thanh ghi báo trạng
thái CPU – CPUSTA
Bit dự trữ [4:2] U Không thực hiện
PWD [1] R Cờ báo đã vào chế độ IDLE
0: Khi bật nguồn hoặc sau
lệnh CLRWDT
1: Khi CPU vào chế độ
IDLE
WDTO [0] R Cờ thông báo tràn Watchdog
0: Khi bật nguồn hoặc sau
lệnh CLRWDT hoặc lệnh
IDLE
1: Khi tràn Watchdog
3.3. Bộ đếm chương trình (PC)
Bộ đếm chương trình của SG8V1 là một thanh ghi 16-bit. Nó sử dụng làm địa chỉ của bộ nhớ
chương trình.
3.4. Stack
Giá trị của thanh ghi PC được xếp vào stack khi một trong các sự kiện sau được thực hiện: sau
lệnh LCALL, SCALL, PUSH và đáp ứng ngắt. Ngược lại, đối với lệnh RET, RETA, RETI và
POP giá trị của PC sẽ được lấy ra khỏi stack.
Trong SG8V1, Stack hoạt động như một RAM có 15 word (mỗi word 16-bit) với địa chỉ để truy
xuất là Stack-Pointer (SP) 4 bit. SP có thể truy xuất được bằng phần mềm. Stack chỉ có thể chứa
tối đa 15 giá trị của PC. Do đó, CPU chỉ có thể xếp PC vào Stack được nhiều nhất 15 lần. Lần
xếp thứ 16 được thực hiện chương trình có thể sẽ bị sai.
Chế độ tiết kiệm năng lượng
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 26
Quá trình xếp PC vào stack được thực hiện như sau:
Tăng Stack-Pointer thêm 1
Ghi giá trị PC vào vùng nhớ của stack được trỏ bởi Stack-Pointer vừa nhận được
Quá trình lấy PC ra khỏi stack được thực hiện như sau:
Giá trị PC cần lấy chính là giá trị của vùng nhớ trong Stack được trỏ bởi Stack-Pointer
hiện tại.
Sau khi lấy xong giá trị của PC, Stack-Pointer giảm đi 1.
3.4.1. Truy xuất giá trị mới nhất của Stack (TS: Top of Stack)
TS là giá trị vùng nhớ của Stack được trỏ bởi Stack-Pointer (SP). TS có thể đọc/ghi bằng phần
mềm. TS được chia thanh 2 thanh ghi TSH (chứa byte cao của TS) và TSL (chứa byte thấp của
TS). Người dùng có thể đọc cặp thanh ghi TSH và TSL để biết được giá trị hiện tại của TS.
Khi mới khởi động, SP bằng 0. Tại vị trí này, giá trị của TS không có nghĩa (người dùng không
sử dụng giá trị này).
Chú ý:
Người sử dụng nên cấm ngắt toàn cục trong khi truy xuất stack để tránh việc tràn stack không
mong muốn.
0C10h
1111
1101
0000
1101
Con trỏ stack
SP[3:0]
0Ch 10h
TSH TSL
Thanh ghi Top of Stack
stack [15:0]
-
Hình 3-4: Stack và các thanh ghi liên quan
3.4.2. Stack Pointer (SP)
3.4.2.1. Mô tả
Stack-Pointer (SP) là thanh ghi 4 bit dùng để trỏ giá trị mới nhất của stack (Top of stack). SP có
thể đọc/ghi bằng phần mềm.
Chế độ tiết kiệm năng lượng
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 27
Mỗi lần xếp PC vào stack, SP tăng thêm 1.
Mỗi lần lấy giá trị PC ra khỏi stack (POP, trở về từ chương trình ngắt hay chương trình con), SP
giảm đi 1.
Việc đọc/ghi trực tiếp TS bằng phần mềm không ảnh hưởng đến giá trị của SP.
Trong quá trình sử dụng stack, người dùng nên chú ý các điểm sau:
Khi stack đã đầy (SP = 15), nếu tiếp tục xếp PC vào stack sẽ làm tràn stack ngưỡng trên. Bit
SOV sẽ set lên 1 (bit này chỉ có thể xóa khi bật nguồn hoặc xóa bằng phần mềm).
Tương tự, khi stack đang rỗng (SP=0), việc lấy PC ra khỏi stack sẽ làm cho bit SUNF bật lên
1(bit này chỉ có thể xóa khi bật nguồn hoặc xóa bằng phần mềm).
Khi có các sự kiện trên, hai trường hợp sau xảy ra:
Bit SRE bằng 1 sẽ làm SG8V1 khởi động lại.
Bit SRE bằng 0 không làm SG8V1 khởi động lại. Tuy nhiên, giá trị của TS và SP sẽ
không thay đổi.
3.4.2.2. Thanh ghi báo trạng thái CPU – CPUSTA
Chế độ tiết kiệm năng lượng
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 28
Tên Bit R/W Mô tả
SRE [7] R/W Cho phép khởi động lại CPU do
stack
0: Không cho phép khởi
động lại CPU
1: Cho phép khởi động lại
CPU
SOV [6] R/W(0) Cờ thông báo tràn stack ngưỡng
trên (Overflow)
0: không xảy ra tràn stack
ngưỡng trên, khi bật
nguồn, khi xóa bằng phần
mềm
1: xảy ra tràn stack ngưỡng
trên
SUNF [5] R/W(0) Cờ báo tràn stack ngưỡng dưới
(underflow)
0: không tràn stack
ngưỡng dưới, khi bật
nguồn, khi xóa bằng phần
mềm
1: xảy ra tràn stack ngưỡng
dưới
Bit dự trữ [4:2] U Không thực hiện
PWD [1] R Xem 3.2 Thanh ghi báo trạng thái
CPU - CPUSTA
WDTO [0] R Xem 3.2 Thanh ghi báo trạng thái
CPU - CPUSTA
Reset
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 29
4. Reset của SG8V1
4.1. Tổng quan về Reset
SG8V1 sử dụng các nguồn sau đây để xử lý reset CPU, Flash và khối lập trình Flash:
1. Reset bởi người dùng (do tác động trên chân RST ).
2. Reset khi chọn lập trình Flash (do tác động trên chân SPCS).
3. Reset bởi Stack (tràn trên và tràn dưới).
4. Reset bởi Watchdog (tràn bộ đếm).
Khối RESET sẽ sử dụng tất cả các nguồn ở trên để tạo các tín hiệu reset nội thích hợp cho các
thành phần bên trong.
4.2. Reset bởi người sử dụng (chân RST )
Người sử dụng có thể reset lại SG8V1 bất cứ lúc nào thông qua chân RST . Chân này phải được
giữ mức thấp trong ít nhất trong 5 chu kỳ xung clock hệ thống để vi điều khiển được reset hoàn
toàn.
4.3. Reset khi chọn lập trình Flash (chân SPCS)
Chân SPCS được sử dụng để chọn chế độ nạp Flash hoặc chế độ hoạt động thông thường. Khi
chế độ nạp Flash được chọn, CPU sẽ không hoạt động và tất cả các thanh ghi được reset.
Chú ý:
Khối lập trình Flash luôn được reset trong chế độ hoạt động thông thường và chân SPCS giữ mức
cao.
Reset
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 30
4.4. Reset bởi stack
Reset bởi stack chỉ có thể xảy ra khi bit SRE (CPUSTA [7]) tích cực. Lúc này, có hai trạng thái
làm xuất hiện reset là:
Reset sinh ra do điều kiện tràn trên: Khi Stack đầy nhưng vẫn được nạp tiếp giá trị mới.
Reset sinh ra do điều kiện tràn dưới: Khi Stack rỗng nhưng vẫn bị yêu cầu lấy giá trị ra.
4.5. Reset bởi Watchdog
Khi CPU đang hoạt động, nếu Watchdog được bật thì một tác động reset sẽ được tạo ra khi
Watchdog bị tràn bộ đếm. Trong trường hợp CPU ở trạng thái rảnh (IDLE) thì sự kiện tràn bộ
đếm Watchdog sẽ làm CPU vào trạng thái wake-up.
Chú ý:
Tín hiệu reset_chip tích cực mức thấp. Tín hiệu này được tạo ra từ bốn nguồn là reset bởi người
dùng, reset chọn bộ lập trình Flash, reset bởi Stack và reset bởi Watchdog .
Tín hiệu reset lập trình tích cực mức thấp. Tín hiệu này được tạo bởi hai nguồn là reset bởi người
dùng và chân SPCS .
Tín hiệu reset chính sẽ reset bộ lập trình Flash, các bit trạng thái CPUSTA, ngoại trừ bit SRE.
Tín hiệu này tích cực mức cao và được tạo bởi hai nguồn là reset bởi người sử dụng và reset khi
chọn bộ lập trình.
Bảng 4-1: Điều kiện reset cho các thanh ghi đặc biệt
Nguồn Bộ đếm lập trình CPUSTA
Reset chính 0000h 000---00
Reset bởi chọn bộ lập trình Flash 0000h 0xx---xx
Reset bởi Stack 0000h 0xx---xx
Reset bởi WDT 0000h 0xx---xx
Wake up bởi WDT PC+1 uuu---uu
Wake up bởi ngắt PC+1 (*) uuu---uu
(*): Khi sự kiện wake up xảy ra bởi nguồn ngắt, nếu bit GIE/GIEH (GIC [2]) được tích cực hay
cả hai bit GIE/GIEH và PIE/GIEL (GIC [1]) được tích cực, sự thực thi sẽ đến vị trí vector ngắt.
Nếu không, sự thực thi sẽ trở về quá trình trước đó.
Chân tín hiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 31
5. Kết nối các chân tín hiệu đặc biệt
5.1. Tụ nguồn, Cap, SPCS
SG8V1
C3
C2
C1
VDD1
GND
VDD2
GND
VDD3 GND CAP
C
R
Rlimit
C4
SPCS
VDD
VDD
R3
Hình 5-1. Các tụ và điện trở kết nối ở các chân
Tất cả các giá trị chỉ là gợi ý
C1 C3: 0.1µF
C4: 10µF
R3: 300Ω 360Ω
R, Rlimit, C: xem mục 5.3 Reset
Chú ý:
Tất cả các chân VDD đều phải được cấp nguồn.
Chân tín hiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 32
5.2. Mạch kết nối thạch anh
clk
XTAL
OSC1
OSC2
Rs
C1
C2 SG8V1
Cs
Oscillator
Hình 5-2. Mạch kết nối thạch anh
Gía trị tụ C1, C2 khuyến cáo sử dụng: 12pF – 27pF
Giá trị của C1 và C2 thay đổi tùy theo tụ CL của thạch anh và tụ ký sinh Cs giữa hai chân OSC1
và OSC2 sau khi thực hiện PCB. Mối liên hệ giữa C1, C2, Cs và CL theo công thức sau:
CL = C1 x C2
C1 + C2 + Cs
Ví dụ, thạch anh có CL là 15pF và tụ kí sinh Cs là 5pF thì C1 = C2 = 20pF
Điện trở Rs dùng để hạn công suất tiêu tán của thạch anh. Nếu công suất tiêu tán của thạch anh
lớn hơn giá trị của nhà sản xuất đưa ra thì cần phải có điện trở trở Rs. Ngược lại, điện trở Rs
không cần thiết.
Giá trị Rs được xác định theo công thức sau:
Rs = ½ π.F.C2 với F là tần số của thạch anh
Khuyến cáo cho PCB:
Đặt thạch anh càng gần chân của bộ dao động càng tốt
Đặt vòng bảo vệ (GND) xung quanh các chân thạch anh
Các tín hiệu khác không nên đặt song song với tín hiệu ngõ vào OSC1 của bộ dao động
Đặt vùng GND ngay bên dưới thạch anh và chân của bộ dao động
Chân tín hiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 33
OSC1
OSC2
GND
Vòng bảo vệ (GND)
Vùng GND ở mặt dưới của board
SG8V1
C1
C2
Thạch anh
Hình 5-3. Layout cho chân thạch anh
5.3. Reset
Hình 5-4 là mạch reset dùng cho người sử dụng. Tín hiệu reset ngoài trên chân RST được tạo
bởi mạch RC (xem Hình 5-4). Giá trị đề nghị của điện trở là 10 KΩ và tụ C là 1 µF.
VDD
R
C
RST
Hình 5-4. Mạch kết nối đến chân RST cơ bản
Sau khi chân RST được kéo xuống mức thấp, tín hiệu reset nội phải mất một khoảng thời gian
gọi là thời gian trễ (tdelay) trước khi nó lên lại mức cao. Giá trị tối thiểu của tdelay khoảng 2.3RC
(xem trong Hình 5-5). Nếu R = 10KΩ và C = 1µF, tdelay ≈ 2.3 ×10K×1µ = 23 ms.
Chân tín hiệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 34
0.9×VDD
tdelay
/RST
reset nội
VDD
V
t (s)
t (s)
V
Thời
gian trễ
Hình 5-5: Định thời mạch reset ngoài
Trong các ứng dụng cần hạn chế nhiễu, mạch reset có thể được mắc như sau:
VDD
R
C
RST
R limit
Hình 5-6. Mạch kết nối đến chân RST hạn chế nhiễu
Trong trường hợp, ứng dụng yêu cầu tụ C phải xả nhanh khi mất nguồn cấp VDD thì mạch reset
có thể được mắc thêm diode như sau:
VDD
R
C
RST
VDD
VDD
R
C
RST
R limit
VDD
Hình 5-7. Mạch reset được mắc thêm diode
Đối với các mạch reset, giá trị điện trở R được khuyến cáo từ 10KΩ đến 40KΩ. Giá trị điện trở
Rlimit được khuyến cáo từ 470Ω đến 5KΩ. Giá trị tụ C tối thiểu là 0.1µF.
Tổ chức bộ nhớ chương trình
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 35
6. Tổ chức bộ nhớ chương trình
Vi điều khiển SG8V1 có bộ đếm chương trình (PC) 16-bit, nó có thể định địa chỉ đến 64Kx16 bộ
nhớ chương trình. Khi PC trỏ đến ô nhớ cuối cùng của bộ nhớ chương trình (FFFFh), nếu nó tiếp
tục tăng lên nữa thì sẽ quay trở lại địa chỉ vec-tơ ngắt (0000h). Khi PC trỏ tới những vùng địa chỉ
chưa lập trình thì mã lệnh đọc được là FFh, mã lệnh này được CPU đối xử như là một lệnh
“Không thực thi” (NOP).
Vector RESET
Vector ngắt ưu tiên cao
0000H
0008H
FFFFH
PC [15:0]
stack mức 1
stack mức 15
.
.
15 0
Vector ngắt ưu tiên thấp 0010H
CALL / RETURN
Hình 6-1: Bản đồ địa chỉ của bộ nhớ dữ liệu
6.1. Bộ đếm chương trình
Bộ đếm chương trình (PC) có độ rộng là 16-bit. Nó chính là địa chỉ dùng để đọc bộ nhớ chương
trình. Dữ liệu đọc ra từ bộ nhớ chương trình chính là mã lệnh chuẩn bị được thực thi. Bình
thường, giá trị của PC sẽ tăng lên 1 sau mỗi chu kỳ xung clock để trỏ đến đọc một mã lệnh mới.
Tuy nhiên, đối với các lệnh rẽ nhánh chương trình như: SCALL, LCALL, SJMP, LJMP, JMPA,
giá trị của PC sẽ được cập nhật theo các giá trị tính toán sau khi thực hiện các lệnh rẽ nhánh này.
Tổ chức bộ nhớ chương trình
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 36
6.2. Stack
Giá trị của thanh ghi PC được xếp vào Stack khi một trong các sự kiện sau được thực hiện: sau
lệnh LCALL, SCALL, PUSH và đáp ứng ngắt. Ngược lại, đối với lệnh RET, RETA, RETI và
POP giá trị của PC sẽ được lấy ra khỏi stack.
Trong SG8V1, Stack hoạt động như một RAM có 15 word (mỗi word 16-bit) với địa chỉ để truy
xuất là Stack-Pointer (SP) 4 bit. SP có thể truy xuất được bằng phần mềm. Stack chỉ có thể chứa
tối đa 15 giá trị của PC. Do đó, CPU chỉ có thể xếp PC vào Stack được nhiều nhất 15 lần. Nếu
lần xếp thứ 16 được thực hiện, Stack sẽ bị tràn.
Quá trình xếp PC vào stack được thực hiện như sau:
Tăng Stack-Pointer thêm 1
Ghi giá trị PC vào vùng nhớ của Stack được trỏ bởi Stack-Pointer vừa nhận được
Quá trình lấy PC ra khỏi stack được thực hiện như sau:
Giá trị PC cần lấy chính là giá trị của vùng nhớ trong Stack được trỏ bởi Stack-Pointer
hiện tại.
Sau khi lấy xong giá trị của PC, Stack-Pointer giảm đi 1.
6.2.1. Truy xuất giá trị mới nhất của Stack (TS: Top of Stack)
TS là giá trị vùng nhớ của Stack được trỏ bởi Stack-Pointer (SP). TS có thể đọc/ghi bằng phần
mềm. TS được chia thanh 2 thanh ghi TSH (chứa byte cao của TS) và TSL (chứa byte thấp của
TS). Người dùng có thể đọc cặp thanh ghi TSH và TSL để biết được giá trị hiện tại của TS.
Khi mới khởi động, SP bằng 0. Tại vị trí này, giá trị của TS không có nghĩa (người dùng không
sử dụng giá trị này).
Chú ý:
Người sử dụng nên cấm ngắt toàn cục trong khi truy xuất stack để tránh việc tràn stack không
mong muốn.
Tổ chức bộ nhớ chương trình
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 37
0C10h
1111
1101
0000
1101
Con trỏ Stack
SP[3:0]
0Ch 10h
TSH TSL
Thanh ghi Top of Stack
Stack [14:0]
-
Hình 6-2: Stack và các thanh ghi liên quan
6.2.2. Stack Pointer (SP)
6.2.2.1. Mô tả
Stack-Pointer (SP) là thanh ghi 4 bit dùng để trỏ giá trị mới nhất của stack (Top of stack). SP có
thể đọc/ghi bằng phần mềm.
Mỗi lần xếp PC vào stack, SP tăng thêm 1.
Mỗi lần lấy giá trị PC ra khỏi stack (POP, trở về từ chương trình ngắt hay chương trình con), SP
giảm đi 1.
Việc đọc/ghi trực tiếp TS bằng phần mềm không ảnh hưởng đến giá trị của SP.
Trong quá trình sử dụng stack, người dùng nên chú ý các điểm sau:
Khi stack đã đầy (SP = 15), nếu tiếp tục xếp PC vào stack sẽ làm tràn stack ngưỡng trên. Bit
SOV sẽ set lên 1 (bit này chỉ có thể xóa khi bật nguồn hoặc xóa bằng phần mềm).
Tương tự, khi stack đang rỗng (SP=0), việc lấy PC ra khỏi stack sẽ làm cho bit SUNF bật lên
1(bit này chỉ có thể xóa khi bật nguồn hoặc xóa bằng phần mềm).
Khi có các sự kiện trên, hai trường hợp sau xảy ra:
Bit SRE bằng 1 sẽ làm SG8V1 khởi động lại.
Bit SRE bằng 0 không làm SG8V1 khởi động lại. Tuy nhiên, giá trị của TS và SP sẽ
không thay đổi.
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 38
7. Tổ chức bộ nhớ dữ liệu
7.1. Bộ nhớ Flash Data Memory
SG8V1 hỗ trợ vùng nhớ flash kích thước 1536x16 bit (3KB) để lưu trữ dữ liệu. Mỗi lần truy xuất
16 bit (1 word) hoặc 1 page (64 word) bằng lệnh MRF hoặc MFR (xem mục 20. Bộ điều khiển
truy xuất Flash).
15 0
.
.
.
0x000
0x5FF
Hình 7-1: Bộ nhớ Flash Data Memory
7.2. Bộ nhớ RAM
Vi điều khiển SG8V1 có 16 Kbytes bộ nhớ dữ liệu. Trong VĐK là một khối bộ nhớ truy cập
ngẫu nhiên tĩnh (SRAM). Để truy cập một ô nhớ thì một địa chỉ 14 bit sẽ cấp đến bộ nhớ dữ liệu
và đọc về 8-bit giá trị ngõ ra. Địa chỉ truy xuất có thể theo chế độ trực tiếp hoặc gián tiếp (mục
7.2.5.3 Định địa chỉ gián tiếp qua con trỏ). Bộ nhớ được chia thành 64 băng, mỗi băng chứa 256
byte dữ liệu.
Nội dung của bộ nhớ dữ liệu bao gồm các thanh ghi chức năng đặc biệt (SFR) và các thanh ghi
mục đích chung (GPR). Các thanh ghi SFR được dùng chứa các bit điều khiển và trạng thái hoạt
động của lõi CPU và các ngoại vi. Các thanh ghi GPR thì dùng chứa dữ liệu người dùng trong
lúc các ứng dụng được thực thi. Trong bộ nhớ dữ liệu có những vùng ô nhớ không được thực
hiện phần cứng, việc đọc đến các ô nhớ này sẽ trả về giá trị 0.
Hình 7-2 là cấu trúc của bộ nhớ dữ liệu.
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 39
Các thanh ghi chức năng
cơ bản
Các thanh ghi chức năng
cơ bản
Các thanh ghi chức năng
cơ bản
Các thanh ghi chức năng
đặc biệt
5BH
00H
FFH
00H
FFH
BANK0 BANK1 BANK62 BANK63
FFH
00H
FFH
BS [5:0] = 00000 BS [5:0] = 000001 BS [5:0] = 111110 BS [5:0] = 111111
00H
Các thanh ghi chức năng
cơ bản
BSE (BANK SELECTION): đối số được lấy từ mã lệnh bit [8]
BSE= 0: truy cập đến BANK0
BSE= 1: truy cập đến đến BANK được chỉ ra bởi thanh ghi BS
Hình 7-2: Cấu trúc bộ nhớ dữ liệu
7.2.1. Thanh ghi chọn băng
Bộ nhớ dữ liệu của SG8V1 được chia thành 64 băng thuận tiện trong việc truy xuất bộ nhớ. Việc
lựa chọn băng sẽ sử dụng thanh ghi BS để trỏ đến, thanh ghi này có 6 bit (BS0 đến BS5). Các bit
này chính là các bit cao từ bit 12 đến bit 8 của địa chỉ dùng để truy cập đến bộ nhớ dữ liệu. Với
các lệnh có các bit trong mã lệnh dùng để định địa chỉ như: ADDR, CLR, INC, DEC… thì 8-bit
thấp của mã lệnh chính là 8-bit địa chỉ thấp của địa chỉ truy cập bộ nhớ dữ liệu. Địa chỉ cuối cùng
chính là ghép của 6 bit chọn băng và 8-bit từ mã lệnh tạo thành địa chỉ 14 bit. Giá trị của thanh
ghi chọn băng BS có thể ghi vào bằng lệnh IBS. Cách thực hiện ghép các bit để tạo ra địa chỉ truy
xuất bộ nhớ dữ liệu được trình bày trên Hình 7-3.
Đối với người sử dụng, trước khi truy xuất phải đảm bảo giá trị trong thanh ghi BS đã trỏ đến
đúng băng cần dùng. Trong bộ nhớ dữ liệu, có một số thanh ghi chức năng không có đầy đủ tất
cả các bit trong thanh ghi, khi ghi đến thì sẽ bỏ qua, khi đọc ra thì trả về giá trị là 0. Việc thực
hiện các phép toán với các thanh không có cũng sẽ trả về kết quả bình thường và cập nhật các
thanh ghi trạng thái hoạt động (nếu có).
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 40
Bank 0
Bộ nhớ dữ liệu
Bank 1
Bank 2
Bank 3
000h
100h
200h
300h
BS [5:0] = 000010 (chọn băng)
Instruction [7:0] = 1111_1111
Bank 63
3F00h
14 bit địa chỉ
Hình 7-3: Sử dụng thanh ghi BS để chọn băng
7.2.2. Truy cập nhanh bộ nhớ dữ liệu
Đối với các lệnh có bao gồm việc định địa chỉ thanh ghi trong mã lệnh, bit số 8 của mã lệnh (bit
bse) sẽ hỗ trợ cơ chế chuyển đổi nhanh băng cần dùng cho người lập trình. Cụ thể như sau, khi
giá trị của bit bse =0, điều này có nghĩa là lệnh sẽ truy cập đến các thanh ghi nằm trong băng 0.
Ngược lại, bse=1 thì truy cập vào các thanh ghi nằm trong băng được chọn bởi thanh ghi BS.
Với việc hỗ trợ này, người lập trình có thể chuyển đổi nhanh giữa băng 0 và các băng khác mà
không cần phải chuyển đổi giá trị thanh ghi BS cho mỗi lần truy xuất.
7.2.3. Thanh ghi mục đích chung
Chip SG8V1 có tầm địa chỉ các thanh ghi mục đích chung từ 5Bh của băng 0 cho đến địa chỉ
cuối của bộ nhớ dữ liệu là 3FFFh trong băng 63. Giá trị của các thanh ghi này không được reset
khi bật nguồn hay do các nguồn reset khác. Vì vậy để đảm bảo, người sử dụng phải luôn luôn ghi
giá trị vào trước sau đó mới sử dụng lại các thanh ghi này.
7.2.4. Thanh ghi chức năng đặc biệt
Tập thanh ghi chức năng đặc biệt (SFR) của SG8V1 bao gồm tất cả là 91 thanh ghi. Chúng nằm
từ địa chỉ 000h đến 05Ah. Các bit trong thanh ghi sử dụng cho việc điều khiển và trạng thái của
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 – Hướng dẫn sử dụng 41
CPU và các ngoại vi. Về tên, địa chỉ, chức năng của các thanh ghi xem trong Bảng 7-1. Về chi
tiết chức năng cho từng bit trong thanh ghi sẽ được trình bày trong các mục của ngoại vi tương
ứng.
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 User manual 42
Bảng 7-1: Các thanh ghi chức năng đặc biệt
Ghi chú:
u = không thay đổi, x = không xác định, - = không thực hiện, đọc ra là ‘0’, q = giá trị phụ thuộc điều kiện.
Nhóm Tên thanh ghi Địa chỉ Giá trị reset Mô tả
Các thanh ghi hệ thống
IDA0 0x000 N/A Indirect Access 0
IDA1 0x001 N/A Indirect Access 1
IDAOFF0 0x002 N/A Indirect Access with Offset 0
IDAOFF1 0x003 N/A Indirect Access with Offset 1
IDAINC0 0x004 N/A Indirect Access and then Increment Data Pointer 0
IDAINC1 0x005 N/A Indirect Access and then Increment Data Pointer 1
INCIDA0 0x006 N/A Increase Data Pointer 0 and then Indirect Access 0
INCIDA1 0x007 N/A Increase Data Pointer 1 and then Indirect Access 1
IDADEC0 0x008 N/A Indirect Access and then Decrease Data Pointer 0
IDADEC1 0x009 N/A Indirect Access and then Decrease Data Pointer 1
DECIDA0 0x00A N/A Decrease Data Pointer 0 and then Indirect Access
DECIDA1 0x00B N/A Decrease Data Pointer 1 and then Indirect Access
DPH0 0x00C --uu uuuu Indirect Data Memory Address Pointer 0 High Byte
DPL0 0x00D uuuu uuuu Indirect Data Memory Address Pointer 0 Low Byte
DPH1 0x00E --uu uuuu Indirect Data Memory Address Pointer 1 High Byte
DPL1 0x00F uuuu uuuu Indirect Data Memory Address Pointer 1 Low Byte
BS 0x010 --00 0000 Bank Select Register
SP 0x011 ---- 0000 Stack Pointer Control
TSH 0x012 xxxx xxxx Top of Stack High Byte
TSL 0x013 xxxx xxxx Top of Stack Low Byte
HI 0x014 uuuu uuuu Product Register High Byte
LO 0x015 uuuu uuuu Product Register Low Byte
CF 0x016 ---- -uuu Calculation Flags
CPUSTA 0x017 0uu- --uu (*) Central Processing Unit Status
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 User manual 43
TPS 0x018 0000 0000 Table Page Select
DPOFF 0x019 uuuu uuuu Data Pointer Offset
Bộ điều khiển ngắt
GIC 0x01A ---- -000 Global Interrupt Control
INTEDG 0x01B ---- 1111 Interrupt Edge Control
IE1 0x01C 0000 0000 Interrupt Enable 1
IP1 0x01D 1111 1111 Interrupt Priority 1
IF1 0x01E xxxx 0000 Interrupt Flag 1
IE2 0x01F 0000 0000 Interrupt Enable 2
IP2 0x020 1111 1111 Interrupt Priority 2
IF2 0x021 0000 0000 Interrupt Flag 2
IE3 0x022 ---- -000 Interrupt Enable 3
IP3 0x023 ---- -111 Interrupt Priority 3
IF3 0x024 ---- -000 Interrupt Flag 3
PORTA PORTB PORTC PORTD
DIRA 0x025 0000 0000 Direction of Port A data
DIRB 0x026 0000 0000 Direction of Port B data
DIRC 0x027 0000 0000 Direction of Port C data
DIRD 0x028 0000 0000 Direction of Port D data
PORTA 0x029 xxxx xxxx Port A data
PORTB 0x02A xxxx xxxx Port B data
PORTC 0x02B xxxx xxxx Port C data
PORTD 0x02C xxxx xxxx Port D data
WATCHDOG /TIMER0
WT0CON 0x02D 0011 1111 Watchdog and Timer0 Control
T0REG 0x02E uuuu uuuu Timer0 Register
TIMER1
T1CON 0x02F 0000 0000 Timer1 Control
T1RH 0x030 uuuu uuuu Timer1 High Byte Register
T1RL 0x031 uuuu uuuu Timer1 Low Byte Register
CCRH 0x032 uuuu uuuu Capture/Compare High Byte Register
CCRL 0x033 uuuu uuuu Capture/Compare Low Byte Register
TIMER2 T2CON 0x034 0-00 0000 Timer2 Control
T2RL 0x035 0000 0000 Timer2 Register Low Byte
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 User manual 44
T2PRL 0x036 1111 1111 Timer2 Period Low Byte
T2H 0x037 --11 --00 Timer2 High Period and High Register
TIMER3
T3CON 0x038 0-00 0000 Timer3 Control
T3RL 0x039 0000 0000 Timer3 Register Low Byte
T3PRL 0x03A 1111 1111 Timer3 Period Low Byte
T3H 0x03B --11 --00 Timer3 High Period and High Register
UART1
U1STA 0x03C 0010 0000 UART1 Status Register
U1CON 0x03D 0000 0000 UART1 Control Register
U1BRL 0x03E 0000 0000 UART1 Baudrate Register Low Byte
U1TXREG 0x03F 0000 0000 UART1 Transmitter Data Register
U1RXREG 0x040 0000 0000 UART1 Receiver Data Register
UART2
U2STA 0x041 0010 0000 UART2 Status Register
U2CON 0x042 0000 0000 UART2 Control Register
U2BRL 0x043 0000 0000 UART2 Baudrate Register Low Byte
U2TXREG 0x044 0000 0000 UART2 Transmitter Data Register
U2RXREG 0x045 0000 0000 UART2 Receiver Data Register
UART3
U2STA 0x046 0010 0000 UART3 Status Register
U2CON 0x047 0000 0000 UART3 Control Register
U2BRL 0x048 0000 0000 UART3 Baudrate Register Low Byte
U2TXREG 0x049 0000 0000 UART3 Transmitter Data Register
U2RXREG 0x04A 0000 0000 UART3 Receiver Data Register
PWM1 PWM1CON 0x04B 00-- --uu PWM1 Control
PWM1RL 0x04C uuuu uuuu PWM1 Register Low Byte
PWM2 PWM2CON 0x04D 00-- --uu PWM2 Control
PWM2RL 0x04E uuuu uuuu PWM2 Register Low Byte
SPI
SPICON 0x04F 0--0 0000 SPI Control
SPISTA 0x050 ---- -000 SPI Status
SPIBUF 0x051 uuuu uuuu SPI Buffer
I2C I2CCON1 0x052 0000 0100 I2C Control 1
I2CCON2 0x053 1000 0000 I2C Control 2
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 User manual 45
I2CSTA 0x054 0000 0000 I2C Status
CNTH/ADDRH 0x055 0000 0000 I2C High Count Time Register
CNTL/ADDRL 0x056 0000 0000 I2C Low Count Time Register / I2C Slave Address
I2CBUF 0x057 uuuu uuuu I2C Buffer
ADC
ADCON1 0x058 0--- 0000 ADC Control 1 Register
ADCON2 0x059 ---- ---1 ADC Control 2 Register
ADBUF 0x05A uuuu uuuu ADC Buffer
FLASH
FLASH_CTRL 0x05B ---- -000 Flash control
FPTH 0x5C uuuu uuuu Flash high pointer
FPTL 0x5D uuuu uuuu Flash low pointer
(*) Hai bit thấp của thanh ghi này [1:0] có giá trị là 0 sau khi bật nguồn.
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 46
7.2.5. Các chế độ định địa chỉ bộ nhớ
Bộ nhớ chương trình chỉ có thể định địa chỉ bằng nội dung thanh ghi bộ đếm chương trình (PC),
như bộ nhớ dữ liệu có thể truy cập bằng 3 cách định địa chỉ. Hầu hết các lệnh chỉ sử dụng một
kiểu định địa chỉ. Một số lệnh có thể sử dụng đến 3 kiểu định địa chỉ, nó phụ thuộc vào các toán
hạng được sử dụng. Các kiểu lệnh địa chỉ thì như sau:
Kế thừa và giá trị từ mã lệnh
Trực tiếp
Gián tiếp qua con trỏ
7.2.5.1. Kế thừa và giá trị từ mã lệnh
Trong tập lệnh của SG8V1 có một số lệnh điều khiển hoạt động của hệ thống. Các lệnh này sẽ
tác động trực tiếp đến giá trị các thanh ghi điều khiển mà không cần phải thực hiện định địa chỉ
thông qua mã lệnh chương trình. Các lệnh LCALL và LJUMP thì bao gồm luôn cả địa chỉ đích rẽ
nhánh trong mã lệnh.
7.2.5.2. Định địa chỉ trực tiếp
Trong kiểu định địa chỉ trực tiếp, địa chỉ của nguồn và đích được lấy ra từ mã lệnh. Bit cho biết
nguồn băng được lựa chọn sẽ được dùng trong kiểu định địa chỉ này. Nếu bit bse có giá trị là 1
thì nội dung của thanh ghi BS sẽ được dùng để chọn băng dữ liệu. Nếu bit bse là 0 thì băng 0 sẽ
được sử dụng.
Kết quả sau khi tính toán sẽ được lưu ngược trở lại thanh ghi. Trong các mã lệnh có ghi giá trị trở
lại thanh ghi, bit dst sẽ chọn nguồn ghi đến. Nếu dst = 1, kết quả sẽ lưu vào thanh ghi reg được sử
dụng. Nếu dst = 0, kết quả sẽ lưu lại thanh ghi ACC.
7.2.5.3. Định địa chỉ gián tiếp qua con trỏ
Ngoài phương pháp định địa chỉ trực tiếp, SG8V1 còn hỗ trợ phương pháp định địa chỉ gián tiếp
qua các con trỏ địa chỉ. Hệ thống có 2 thanh ghi con trỏ là IDA0 và IDA1, tương ứng với mỗi
con trỏ là một cặp thanh ghi DPHx và DPLx. Các thanh ghi con trỏ được đặt trong vùng các
thanh ghi chức năng đặc biệt nên việc lập trình truy xuất đến có thể thực hiện dễ dàng. Các con
trỏ rất hữu dụng trong thực hiện truy các dữ liệu có cấu trúc hoặc các mảng bộ nhớ.
Các trường hợp truy xuất địa chỉ sử dụng con trỏ sẽ có các trường hợp như sau:
Tổ chức bộ nhớ dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 47
Truy cập địa chỉ con trỏ và tăng giá trị con trỏ lên 1: dùng thanh ghi INCIDAx (tăng trước
khi truy xuất) hoặc IDAINCx (tăng sau khi truy xuất).
Truy cập địa chỉ con trỏ và giảm giá trị con trỏ xuống 1: dùng thanh ghi DECIDAx (giảm
trước khi truy xuất) hoặc IDADECx (giảm sau khi truy xuất).
Truy cập địa chỉ con trỏ cộng với offset: dùng thanh ghi IDAOFFx. Thanh DPOFF chính
là offset được cộng vào các con trỏ trong trường hợp này. Nó được dùng chung cho cả 2
con trỏ IDA0 và IDA1. Thanh ghi này chứa giá trị 8-bit có dấu nghĩa là nằm trong tầm từ
-128 đến +127 tính từ vị trí của con trỏ.
Ví dụ 7-1: Xóa toàn bộ các ô nhớ trong Băng 1
IDP0 0x100 ;
NEXT CLR IDAINC0, 0 ; Xóa ô nhớ địa chỉ 100h sau đó giá trị của con trỏ
TBZ DPL0, 0 ; kiểm tra xem đã làm xong hết cho Băng1 chưa ?
SJMP NEXT ; Chưa, xóa ô tiếp theo
CONTINUE ; Tiếp tục thực hiện các chương trình sau đó
Chú ý:
Nếu người lập trình sử dụng cách định địa chỉ gián tiếp, nhưng vị trí con trỏ chỉ đến chính là địa
chỉ của các thanh ghi nội dung con trỏ DPHx hoặc DPLx thì kết quả có không đúng như mong
muốn. Trong trường hợp này, giá trị của thanh ghi DPHx hoặc DPLx sẽ nhận từ kết quả của quá
trình tính toán.
Bộ nhân 8-bit
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 48
8. Bộ nhân 8-bit
Chip SG8V1 có hỗ trợ một bộ nhân 8-bit phần cứng trong khối thực thi mã lệnh ALU. Phép nhân
sử dụng là nhân không dấu. Kết quả trả về là giá trị 16-bit lưu trong cặp thanh ghi tích HI và LO.
Lệnh nhân không ảnh hưởng đến bất cứ cờ trạng thái nào của hệ thống (thanh ghi CF). Phép toán
nhân trả về dữ liệu sau một chu kỳ xung clock giúp tăng hiệu năng của hệ thống và giảm kích
thước mã lệnh chương trình khi phải dùng các giải thuật nhân bằng phần mềm.
Ví dụ 8-1 là một đoạn chương trình dùng để thực hiện nhân 2 số trong thanh ghi Reg1 và Reg2
với nhau. Lệnh LD chỉ dùng để nạp giá trị Reg1 vào thanh ghi ACC. Nếu giá trị Reg1 đã có sẵn
trong ACC thì chỉ cần lệnh nhân là đủ.
Ví dụ 8-1: nhân hai số 8-bit không dấu
LD Reg1, 1; nạp số nhân vô thanh ghi Reg1
MULR Reg2, 1; nhân giá trị của thanh ghi Reg1 với Reg2: ARG1 * ARG2 -> HI:LO
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 49
9. Ngắt
SG8V1 có 19 nguồn ngắt:
4 ngắt ngoài
1 ngắt Timer0
1 ngắt Timer1
1 ngắt Timer2
1 ngắt Timer3
6 ngắt UART
2 ngắt I2C
1 ngắt SPI
1 ngắt Capture / Compare
1 ngắt ADC
Các ngắt này có thể cấu hình ở một trong 2 mức ưu tiên: ưu tiên cao (vector ngắt là 0008h) hoặc
thấp (vector ngắt là 0010h).
Ngắt ưu tiên cao được đáp ứng bất kỳ lúc nào, kể cả lúc chương trình đáp ứng dành cho ngắt ưu
tiên thấp đang được thực thi. Trong trường hợp này, SG8V1 sẽ tạm dừng chương trình phục vụ
ngắt ưu tiên thấp. Sau khi chương trình ngắt ưu tiên cao thực hiện xong thì chương trình phục vụ
ngắt thấp sẽ được tiếp tục.
Khi bắt đầu vào chương trình ngắt ưu tiên cao, bit cho phép ngắt toàn cục (GIE) sẽ bị xóa. Vì
vậy, trong thời gian này, tất cả các sự kiện ngắt sẽ bị bỏ qua. Các ngắt này sẽ được xem xét sau
khi chương trình đáp ứng ngắt ưu tiên cao thực hiện xong.
Khi cả hai sự kiện ngắt ưu tiên cao và thấp cùng xảy ra thì ngắt ưu tiên cao sẽ được đáp ứng
trước.
Để cho phép ngắt, trước hết người sử dụng phải set bit cho phép ngắt toàn cục GIE lên 1. Sau đó,
người sử dụng có thể set bit IPE để cho phép ngắt theo độ ưu tiên.
Nếu IPE có giá trị 0, tất cả các ngắt đều có độ ưu tiên ngang nhau và có vector ngắt là 0008h. Khi
đó, bit GIC[1] được hiểu là bit cho phép ngắt ngoại vi (PIE). Để cho phép ngắt ngoại vi, người
dùng phải set bit này lên 1 và ngược lại.
Nếu IPE có giá trị 1, bit GIC[2] sẽ được hiểu là bit cho phép ngắt ưu tiên cao (GIEH). Khi một
ngắt ưu tiên cao được đáp ứng thì bit GIE/GIEH sẽ tự động xóa bằng phần cứng. Do đó, tất cả
các ngắt sau đó sẽ được bỏ qua cho tới khi chương trình ngắt đó hoàn thành (gặp lệnh RETI). Bit
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 50
GIC[1] sẽ là bit cho phép ngắt ưu tiên thấp. Bit này cũng tự động xóa khi một ngắt ưu tiên thấp
được đáp ứng. Khi đó, tất cả các ngắt ưu tiên thấp khác sẽ bị bỏ qua, trừ ngắt ưu tiên cao.
Khi vào chương trình ngắt, đầu tiên, người sử dụng nên sao lưu lại các thanh ghi ACC, CPUSTA
và BS vì những thanh ghi này có thể thay đổi trong quá trình thực thi lệnh. Tiếp theo, nếu có
nhiều ngắt cùng độ ưu tiên xảy ra cùng lúc, người dùng có thể kiểm tra và quyết định xem ngắt
nào cần được đáp ứng.
Trước khi thoát khỏi chương trình đáp ứng ngắt, người sử dụng cần phải làm các việc sau:
Phục hồi lại các thanh ghi ACC, CPUSTA, BS đã sao lưu trước đó
Xóa cờ ngắt của ngắt vừa được đáp ứng
Lệnh RETI dùng để thoát khỏi chương trình đáp ứng ngắt. Nếu ngắt đang được đáp ứng có độ ưu
tiên cao thì lệnh RETI sẽ làm cho bit GIE/GIEH tự động bật lên 1. Ngược lại, nếu ngắt có độ ưu
tiên thấp thì bit GIEL sẽ tụ động bật lên 1.
Sau đây là mô tả hoạt động của các thanh ghi liên quan đến việc điều khiển ngắt:
9.1. Thanh ghi quản lý ngắt toàn cục (GIC)
Tên Bit R/W Mô tả
Bit dự trữ [7:3] U Không thực hiện
GIE/GIEH [2] R/W Khi IPE =1: cho phép ngắt theo
độ ưu tiên.
GIC[2] có nghĩa là bit cho phép
ngắt có độ ưu tiên cao GIEH:
0: cấm tất cả các ngắt
1: cho phép ngắt có độ ưu
tiên cao
Khi IPE=0: không cho phép
ngắt theo độ ưu tiên (tất cả các
ngắt đều đối xử như nhau).
GIC[2] có nghĩa là bit cho phép
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 51
Tên Bit R/W Mô tả
ngắt toàn cục GIE:
0: cấm tất cả các ngắt
1: cho phép tất cả các ngắt
PIE/GIEL [1] R/W Khi IPE =1: cho phép ngắt theo
độ ưu tiên.
GIC[1] có nghĩa là bit cho phép
ngắt có độ ưu tiên thấp GIEL:
0: cấm các ngắt có độ ưu
tiên thấp
1: cho phép các ngắt có độ
ưu tiên thấp
Khi IPE=0: không cho phép
ngắt theo độ ưu tiên (tất cả các
ngắt đều đối xử như nhau)
GIC[1] có nghĩa là bit cho phép
ngắt của ngoại vi PIE:
0: cấm ngắt của tất cả các
ngoại vi (không kể ngắt
ngoài)
1: cho phép ngắt của tất cả
các ngoại vi (không kể
ngắt ngoài)
IPE [0] R/W Bit cho phép ngắt theo độ ưu tiên
0: không cho phép ngắt
theo độ ưu tiên
1: cho phép ngắt theo độ
ưu tiên
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 52
9.2. Thanh ghi điều khiển ngắt theo cạnh (INTEDG)
Tên Bit R/W Mô tả
Bit dự trữ [7:4] U Không thực hiện
INTEDG3 [3] R/W Bit cấu hình cạnh tích cực của
ngắt ngoài 3
1: tích cực cạnh lên
0: tích cực cạnh xuống
INTEDG2 [2] R/W Bit cấu hình cạnh tích cực của
ngắt ngoài 2
1: tích cực cạnh lên
0: tích cực cạnh xuống
INTEDG1 [1] R/W Bit cấu hình cạnh tích cực của
ngắt ngoài 1
1: tích cực cạnh lên
0: tích cực cạnh xuống
INTEDG0 [0] R/W Bit cấu hình cạnh tích cực của
ngắt ngoài 0
1: tích cực cạnh lên
0: tích cực cạnh xuống
9.3. Thanh ghi cho phép ngắt 1 (IE1)
Tên Bit R/W Mô tả
X3IE [7] R/W Bit cho phép ngắt ngoài 3
1: cho phép ngắt
0: cấm ngắt
X2IE [6] R/W Bit cho phép ngắt ngoài 2
1: cho phép ngắt
0: cấm ngắt
X1IE [5] R/W Bit cho phép ngắt ngoài 1
1: cho phép ngắt
0: cấm ngắt
X0IE [4] R/W Bit cho phép ngắt ngoài 0
1: cho phép ngắt
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 53
Tên Bit R/W Mô tả
0: cấm ngắt
T3IE [3] R/W Bit cho phép ngắt Timer3
1: cho phép ngắt
0: cấm ngắt
T2IE [2] R/W Bit cho phép ngắt Timer2
1: cho phép ngắt
0: cấm ngắt
T1IE [1] R/W Bit cho phép ngắt Timer1
1: cho phép ngắt
0: cấm ngắt
T0IE [0] R/W Bit cho phép ngắt Timer0
1: cho phép ngắt
0: cấm ngắt
9.4. Thanh ghi độ ưu tiên ngắt 1 (IP1)
Tên Bit R/W Mô tả
X3IP [7] R/W Bit cấu hình độ ưu tiên của ngắt
ngoài 3:
1: ưu tiên cao
0: ưu tiên thấp
X2IP [6] R/W Bit cấu hình độ ưu tiên của ngắt
ngoài 2:
1: ưu tiên cao
0: ưu tiên thấp
X1IP [5] R/W Bit cấu hình độ ưu tiên của ngắt
ngoài 1:
1: ưu tiên cao
0: ưu tiên thấp
X0IP [4] R/W Bit cấu hình độ ưu tiên của ngắt
ngoài 0:
1: ưu tiên cao
0: ưu tiên thấp
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 54
Tên Bit R/W Mô tả
T3IP [3] R/W Bit cấu hình độ ưu tiên của ngắt
Timer 3:
1: ưu tiên cao
0: ưu tiên thấp
T2IP [2] R/W Bit cấu hình độ ưu tiên của ngắt
Timer 2:
1: ưu tiên cao
0: ưu tiên thấp
T1IP [1] R/W Bit cấu hình độ ưu tiên của ngắt
Timer 1:
1: ưu tiên cao
0: ưu tiên thấp
T0IP [0] R/W Bit cấu hình độ ưu tiên của ngắt
Timer 0:
1: ưu tiên cao
0: ưu tiên thấp
9.5. Thanh ghi lưu cờ ngắt 1 (IF1)
Tên Bit R/W Mô tả
X3IF [7] R/W Cờ ngắt ngoài 3
Khi INTEDG3=1:
0: Không có cạnh lên ở
chân INT3
1: Phát hiện cạnh lên ở
chân INT3 (xóa bằng phần
mềm)
Khi INTEDG3=0:
0: Không có cạnh xuống ở
chân INT3
1: Phát hiện cạnh xuống ở
chân INT3 (xóa bằng phần
mềm)
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 55
Tên Bit R/W Mô tả
X2IF [6] R/W Cờ ngắt ngoài 2
Khi INTEDG2=1:
0: Không có cạnh lên ở
chân INT2
1: Phát hiện cạnh lên ở
chân INT2 (xóa bằng phần
mềm)
Khi INTEDG2=0:
0: Không có cạnh xuống ở
chân INT2
1: Phát hiện cạnh xuống ở
chân INT2 (xóa bằng phần
mềm)
X1IF [5] R/W Cờ ngắt ngoài 1
Khi INTEDG1=1:
0: Không có cạnh lên ở
chân INT1
1: Phát hiện cạnh lên ở
chân INT1 (xóa bằng phần
mềm)
Khi INTEDG1=0:
0: Không có cạnh xuống ở
chân INT1
1: Phát hiện cạnh xuống ở
chân INT1 (xóa bằng phần
mềm)
X0IF [4] R/W Cờ ngắt ngoài 0
Khi INTEDG0=1:
0: Không có cạnh lên ở
chân INT0
1: Phát hiện cạnh lên ở
chân INT0 (xóa bằng phần
mềm)
Khi INTEDG0=0:
0: Không có cạnh xuống ở
chân INT0
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 56
Tên Bit R/W Mô tả
1: Phát hiện cạnh xuống ở
chân INT0 (xóa bằng phần
mềm)
T3IF [2] R/W Cờ ngắt của Timer 3
0: Không có sự kiện tràn
Timer 3
1: Bật lên khi tràn Timer 3
(xóa bằng phần mềm)
T2IF [2] R/W Cờ ngắt của Timer 2
0: Không có sự kiện tràn
Timer 2
1: Bật lên khi tràn Timer 2
(xóa bằng phần mềm)
T1IF [1] R/W Cờ ngắt của Timer 1
0: Không có sự kiện tràn
Timer 1
1: Bật lên khi tràn Timer 1
(xóa bằng phần mềm)
T0IF [0] R/W Cờ ngắt của Timer 0
0: Không có sự kiện tràn
Timer 0
1: Bật lên khi tràn Timer 0
(xóa bằng phần mềm)
9.6. Thanh ghi cho phép ngắt 2 (IE2)
Tên Bit R/W Mô tả
CCIE [7] R/W Bit cho phép ngắt của khối chức
năng bắt/so sánh sự kiện trong
Timer1:
1: cho phép ngắt
0: cấm ngắt
SPIIE [6] R/W Bit cho phép ngắt SPI
1: cho phép ngắt
0: cấm ngắt
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 57
Tên Bit R/W Mô tả
U3RCIE [5] R/W Bit cho phép ngắt khi UART3
nhận dữ liệu
1: cho phép ngắt
0: cấm ngắt
U3TXIE [4] R/W Bit cho phép ngắt khi UART3
phát dữ liệu
1: cho phép ngắt
0: cấm ngắt
U2RCIE [3] R/W Bit cho phép ngắt khi UART2
nhận dữ liệu
1: cho phép ngắt
0: cấm ngắt
U2TXIE [2] R/W Bit cho phép ngắt khi UART2
phát dữ liệu
1: cho phép ngắt
0: cấm ngắt
U1RCIE [1] R/W Bit cho phép ngắt khi UART1
nhận dữ liệu
1: cho phép ngắt
0: cấm ngắt
U1TXIE [0] R/W Bit cho phép ngắt khi UART1
phát dữ liệu
1: cho phép ngắt
0: cấm ngắt
9.7. Thanh ghi độ ưu tiên ngắt 2 (IP2)
Tên Bit R/W Mô tả
CCIP [7] R/W Bit cấu hình độ ưu tiên ngắt của
khối chức năng bắt/so sánh sự
kiện trong Timer1:
1: ưu tiên cao
0: ưu tiên thấp
SPIIP [6] R/W Bit cấu hình độ ưu tiên ngắt của
SPI
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 58
Tên Bit R/W Mô tả
1: ưu tiên cao
0: ưu tiên thấp
U3RCIP [5] R/W Bit cấu hình độ ưu tiên ngắt của
UART3 khi nhận dữ liệu
1: ưu tiên cao
0: ưu tiên thấp
U3TXIP [4] R/W Bit cấu hình độ ưu tiên ngắt của
UART3 khi phát dữ liệu
1: ưu tiên cao
0: ưu tiên thấp
U2RCIP [3] R/W Bit cấu hình độ ưu tiên ngắt của
UART2 khi nhận dữ liệu
1: ưu tiên cao
0: ưu tiên thấp
U2TXIP [2] R/W Bit cấu hình độ ưu tiên ngắt của
UART2 khi phát dữ liệu
1: ưu tiên cao
0: ưu tiên thấp
U1RCIP [1] R/W Bit cấu hình độ ưu tiên ngắt của
UART1 khi nhận dữ liệu
1: ưu tiên cao
0: ưu tiên thấp
U1TXIP [0] R/W Bit cấu hình độ ưu tiên ngắt của
UART1 khi phát dữ liệu
1: ưu tiên cao
0: ưu tiên thấp
9.8. Thanh ghi lưu cờ ngắt 2 (IF2)
Tên Bit R/W Mô tả
CCIF [7] R/W Bit lưu cờ ngắt của khối chức
năng bắt/so sánh sự kiện trong
Timer1:
0: không có ngắt trong quá
trình bắt/so sánh sự kiện
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 59
Tên Bit R/W Mô tả
1: có ngắt trong quá trình
bắt/so sánh sự kiện (phải
xóa bằng phần mềm)
SFIIF [6] R/W Bit lưu cờ ngắt của SPI
0: không có sự kiện gây
ngắt xảy ra
1: sau khi truyền/nhận
xong 1 byte dữ liệu (phải
xóa bằng phần mềm)
U3RCIF [5] R/W Bit lưu cờ ngắt của UART3 khi
nhận dữ liệu
0: FIFO nhận của UART3
rỗng
1: FIFO nhận của UART3
có dữ liệu (tự động xóa khi
FIFO nhận của UART3
rỗng)
U3TXIF [4] R/W Bit lưu cờ ngắt của UART3 khi
phát dữ liệu
0: thanh ghi phát của
UART3 chứa dữ liệu có
nghĩa
1: thanh ghi phát của
UART3 rỗng (thanh ghi
phát của UART3 chứa dữ
liệu có nghĩa)
U2RCIF [3] R Bit lưu cờ ngắt của UART2 khi
nhận dữ liệu
0: FIFO nhận của UART2
rỗng
1: FIFO nhận của UART2
có dữ liệu (tự động xóa khi
FIFO nhận của UART2
rỗng)
U2TXIF [2] R Bit lưu cờ ngắt của UART2 khi
phát dữ liệu
0: thanh ghi phát của
UART2 chứa dữ liệu có
nghĩa
1: thanh ghi phát của
UART2 rỗng (thanh ghi
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 60
Tên Bit R/W Mô tả
phát của UART2 chứa dữ
liệu có nghĩa)
U1RCIF [1] R Bit lưu cờ ngắt của UART1 khi
nhận dữ liệu
0: FIFO nhận của UART1
rỗng
1: FIFO nhận của UART1
có dữ liệu (tự động xóa khi
FIFO nhận của UART1
rỗng)
U1TXIF [0] R Bit lưu cờ ngắt của UART1 khi
phát dữ liệu
0: thanh ghi phát của
UART1 chứa dữ liệu có
nghĩa
1: thanh ghi phát của
UART1 rỗng (thanh ghi
phát của UART1 chứa dữ
liệu có nghĩa)
9.9. Thanh ghi cho phép ngắt 3 (IE3)
Tên Bit R/W Mô tả
Bit dự trữ [7:3] U Không thực hiện
ADIE [2] R/W Bit cho phép ngắt ADC
0: Cấm ngắt
1: Cho phép ngắt
I2CBCIE [1] R/W Bit cho phép ngắt khi xung đột
bus I2C
0: Cấm ngắt
1: Cho phép ngắt
I2CIE [0] R/W Bit cho phép ngắt khi truyền/nhận
dữ liệu trên bus I2C
0: Cấm ngắt
1: Cho phép ngắt
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 61
9.10. Thanh ghi độ ưu tiên ngắt 3 (IP3)
Tên Bit R/W Mô tả
Bit dự trữ [7:3] U Không thực hiện
ADIP [2] R/W Bit cấu hình độ ưu tiên ngắt ADC
0: ưu tiên thấp
1: ưu tiên cao
I2CBCIP [1] R/W Bit cấu hình độ ưu tiên ngắt khi
xung đột bus I2C
0: ưu tiên thấp
1: ưu tiên cao
I2CIP [0] R/W Bit cấu hình độ ưu tiên ngắt khi
truyền/nhận dữ liệu trên bus I2C
0: ưu tiên thấp
1: ưu tiên cao
9.11. Thanh ghi lưu cờ ngắt 3 (IF3)
1) Tên Bit R/W Mô tả
Bit dự trữ [7:3] U Không thực hiện
ADIF [2] R/W Bit lưu cờ khi ngắt khi chuyển đổi
ADC hoàn thành
0: không có sự kiện gây
ngắt
1: bật lên khi chuyển đổi
ADC hoàn thành
I2CBCIF [1] R/W Bit lưu cờ ngắt khi xung đột bus
I2C
0: không có xung đột bus
1: có xung đột bus
Ngắt
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 62
1) Tên Bit R/W Mô tả
I2CIF [0] R/W Bit lưu cờ ngắt khi truyền/nhận dữ
liệu trên bus I2C
Chế độ Master:
0: không có sự kiện gây
ngắt
1: Sau khi bit start hoặc bit
stop được tạo ra; hoặc sau
khi nhận một byte dữ liệu;
hoặc (và) nhận hay truyền
xong một ACK (phải xóa
bằng phần mềm)
Chế độ Slave:
0: không có sự kiện gây
ngắt
1: sau khi nhận được một
ACK; sau khi phát hiện
được một bit start hoặc
stop (nếu được cho phép)
(phải xóa bằng phần mềm)
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 63
10. Cổng truy xuất dữ liệu (General Purpose Input/Output -
GPIO)
Chip SG8V1 có tất cả 4 nhóm GPIO, mỗi nhóm là 8 cổng truy xuất (port). Một số port được kết
hợp với những chức năng đặc trưng của các ngoại vi. Bình thường, các port có nhiệm vụ truy
xuất dữ liệu vào/ra, khi một ngoại vi có sử dụng port được sử dụng, thì những port này sẽ không
dùng được ở trạng thái truy xuất thông thường mà dành riêng cho chức năng của ngoại vi đó. Tất
cả các port được pull-up với điện trở 75 KΩ (trừ SDA và SCL của I2C) và một mạch Schmitt
Trigger cho ngõ vào.
IO_PAD được sử dụng cho các port là một bộ đệm hai chiều với mạch CMOS Schmitt tại ngõ
vào có dòng hoạt động là 10mA và cổng đệm 3 trạng thái ngõ ra tại vị trí O. Chi tiết của một cell
IO_PAD như sau:
P
I
O
DIR
PU
Vcc
Hình 10-1: Cell chuẩn của IO_PAD
Bảng 10-1: Mô tả chân của một IO_PAD
Chân Mô tả
P PAD
PU Weak pull-up
DIR Điều khiển chiều
O Dữ liệu ra PAD
I Dữ liệu lấy từ PAD
Hình trên là mô tả của hầu hết các GPIO trong thiết kế SG8V1. Dữ liệu ra được cho phép hay
không bằng bit định chiều DIR. Do đó DIR cũng chính là bit cho phép dữ liệu của Port truyền ra
ngoài. Và dữ liệu vào luôn được lấy từ Port bất chấp giá trị của bit DIR nên khi Port được cấu
hình là một ngõ ra, thì lệnh đọc Port chính là đọc thanh ghi dữ liệu ra (đọc ngược lại hay đọc
vòng) mà không phải là dữ liệu từ bên ngoài. Người sử dụng cần phải cẩn thận trong các trường
hợp dùng ngắt ngoài hay đọc ngược lại từ Port.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 64
Ngõ vào PU được gán cứng cho mỗi chân khác nhau. Hầu hết các chân đều là weak pull-up bằng
cách kết nối PU với mức điện áp cao qua một transistor PMOS. Những chân đặc biệt sau không
kết nối ngõ vào PU dạng weak pull-up:
Chân lựa chọn lập trình Flash (Serial program chip select - SPCS), chân SPCS cần kết nối
dạng weak pull-down.
PortD[5] (SDA) và PortD[4] ( SCL) cho chức năng I2C: các chân này không cần kết nối
ngõ vào PU. Vì thế nếu sử dụng chức năng I2C, cần phải có một số điện trở ngoài kéo lên
nguồn ở những chân này.
Bảng 10-2: Mô tả chiều
Ngõ vào Ngõ ra
DIR PU O P
1 x 0 0
1 x 1 1
0 0 x x
0 1 x RH
Bảng 10-3: Mô tả bảng nhận dữ liệu
Ngõ vào Ngõ ra
PU P I
x 0 0
x 1 1
1 RH 1
Mỗi Port có 3 thanh ghi với những chức năng như sau:
Thanh ghi DIR: thanh ghi lập trình chiều truyền của Port.
Thanh ghi PORTIN: thanh ghi dữ liệu chiều vào của Port, dùng khi đọc từ Port. Đây là
thanh ghi chỉ đọc.
Thanh ghi PORTOUT: thanh ghi dữ liệu ra của Port, dùng khi ghi dữ liệu ra Port. Đây là
thanh ghi chỉ ghi.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 65
D Q
Q D
IO Pin
DIR latch
Data bus
Write to port /WE
D Q
/WEWrite to DIR
Portin
Input
buffer
Portout
Hình 10-2: Mô tả một kết nối Port cơ bản
Hai thanh ghi PORTOUT và PORTIN có chung địa chỉ đích, PORTOUT là thanh ghi chỉ ghi và
thanh ghi PORTIN là thanh ghi chỉ đọc. Khi ghi dữ liệu xuống Port, dữ liệu được chốt tại
PORTOUT, nếu Port được cấu hình là ngõ ra thì PORTOUT được kết nối trực tiếp với PAD. Dữ
liệu tại PAD (có thể là từ bên ngoài nếu Port được cấu hình là ngõ vào hay chính là PORTOUT
nếu Port được cấu hình là ngõ ra) sẽ được lấy trực tiếp vào PORTIN, khi người sử dụng đọc Port
chính là đọc thanh ghi PORTIN.
Ở mức ứng dụng, thanh ghi dữ liệu Port được gọi chung là PORTA, PORTB…Đây là thanh ghi
cho phép đọc và ghi và là tổ hợp chức năng của PORTOUT và PORTIN.
Khi các Port được chia sẻ chức năng với các ngoại vi, nếu ngoại vi tích cực chức năng có sử
dụng Port thì các thanh ghi PORTOUT, PORTIN hay một trong hai sẽ bị cách ly và dành chức
năng truy xuất cho ngoại vi cho đến khi ngoại vi dừng truy xuất.
Mức điện áp cao tại tất cả các GPIO là 3.3V.
10.1. GPIO PortA
PortA là một port 8-bit hai chiều. người sử dụng có thể lập trình để chọn chiều vào/ ra của dữ
liệu. Tất cả các chân PortA được pull-up.
Khi bit DIRA = 0 thì PortA là ngõ vào. Khi bit DIRA = 1 thì PortA là ngõ ra. PortA có 2 thanh
ghi lưu dữ liệu: một thanh lưu dữ liệu đưa ra PortA do CPU ghi vào (DATAOUTA), một thanh
ghi nhận dữ liệu từ PortA (DATAINA).
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 66
PORTA
Portout
D Q
Q D
Input
buffer
DIR latch
/WE
D Q
/WE
Portin
Data bus
Write to port
Write to DIR
Hình 10-3: IO PortA
Bảng 10-4: Thanh ghi DIRA
Tên Bit R/W Mô tả
DIRA [7:0] R/W
Thanh ghi xác định chiều dữ liệu của PortA. Mỗi bit trong thanh
ghi DIR tương ứng với một chân trong PortA.
0: DATAINA = PortA
1: PortA = DATAOUTA.
Bảng 10-5: Mô tả thanh ghi PORTA
Tên Bit R/W Mô tả
PORTA[7:0] [7:0]
R
Khi CPU đọc tại địa chỉ PORTA, dữ liệu gửi về là từ thanh ghi
DATAINA. Mỗi bit trong thanh ghi DATAINA tương ứng với một
chân trong PortA.
W
Khi CPU ghi vào tại địa chỉ PORTA, dữ liệu được ghi vào thanh
ghi DATAOUTA. Mỗi bit trong thanh ghi DATAOUTA tương ứng
với một chân trong PortA khi DIRA = 1.
10.2. GPIO PortB
PortB là một port 8-bit hai chiều. người sử dụng có thể lập trình để chọn chiều vào/ ra của dữ
liệu. Tất cả các chân PortB được pull-up.
Khi bit DIRB = 0 thì PortB là ngõ vào. Khi bit DIRB = 1 thì PortB là ngõ ra. PortB có 2 thanh
ghi lưu dữ liệu: một thanh ghi lưu dữ liệu đưa ra PortB do CPU ghi vào (DATAOUTB), một
thanh ghi nhận dữ liệu từ PortB (DATAINB).
Bên cạnh chức năng GPIO, PortB còn được sử dụng cho các chức năng khác như bộ nạp chương
trình vào FLASH, UART2, Timer0.
Nếu Timer0 được sử dụng clock ngoài cho bộ đếm thì PortB[4] được cấu hình là ngõ vào.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 67
Nếu UART3 được sử dụng thì PortB[0] được cấu hình là ngõ vào và PortB[1] được cấu hình là
ngõ ra.
Nếu UART2 được sử dụng thì PortB[2] được cấu hình là ngõ vào và PortB[3] được cấu hình là
ngõ ra.
Khi nạp FLASH (SPCS=1) thì PortB[6 :5] được cấu hình là ngõ vào và PortB[7] được cấu hình
là ngõ ra. Ở chế độ này thì phần cứng đã tự động cấu hình PortB[7 :5].
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 68
PORTB <4>/T1CLK
Timer0 external
clock
D Q
Q D
DIR latch
/WE
D Q
/WE
Portout
Portin
Input
buffer
Data bus
Write to port
Write to DIR
Hình 10-4: PortB[4] - dùng chung với Timer0
PORTB <0>/RX3
Q D
PORTB <1>/TX3
DIR latch
0
1TX3
U3ON
D Q
Q D
DIR latch
/WE
D Q
/WE
RX3
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Hình 10-5: IO PortB[0:1] - dùng chung với UART3
PORTB <2>/RX2
Q D
PORTB <3>/TX2
DIR latch
0
1TX2
U2ON
D Q
Q D
DIR latch
/WE
D Q
/WE
RX2
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Hình 10-6: IO PortB[2:3] - dùng chung với UART2
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 69
Q D
PORTB <5>/spclk
PORTB<6>spdatai
EEPROM input
Q D
PORTB <7>/spdatao
DIR latch
0
1EEPROM output
spsc
D Q
/WE
D Q
/WE
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Input
buffer
Portin
PortoutData bus
Write to port
Write to DIR
DIR latch
Portout
Portin
Input
buffer
spcsspcs
Hình 10-7: IO PortB[5:7] - dùng chung với bộ lập trình FLASH
Bảng 10-6: Chức năng của PortB
Tên chân Bit DIR I/O Mô tả
PORTB[0]/RX3 0 I Dữ liệu vào /ngõ vào nối tiếp của UART3
1 O Dữ liệu ra
PORTB[1]/TX3 0 I Dữ liệu vào
1 O Dữ liệu ra /ngõ ra nối tiếp của UART3
PORTB[2]/RX2 0 I Dữ liệu vào /ngõ vào nối tiếp của UART2
1 O Dữ liệu ra
PORTB[3]/TX2 0 I Dữ liệu vào
1 O Dữ liệu ra /ngõ ra nối tiếp của UART2
PORTB[4]/T0CLK 0 I Dữ liệu vào /clock ngoài của Timer0
1 O Dữ liệu ra
PORTB[5]/SPCLK 0 I Dữ liệu vào /clock nối tiếp của bộ nạp FLASH
1 O Data output
PORTB[6]/SPDATAI 0 I
Dữ liệu vào / dữ liệu vào nối tiếp của bộ nạp
FLASH
1 O Dữ liệu ra
PORTB[7]/SPDATAO 0 I Dữ liệu vào
1 O Dữ liệu ra / dữ liệu ra nối tiếp của bộ nạp FLASH
Bảng 10-7: Thanh ghi DIRB
Tên Bit R/W Mô tả
DIRB [7:0] R/W
Thanh ghi xác định chiều dữ liệu của PortB. Mỗi bit trong thanh
ghi DIRB tương ứng với một chân trong PortB.
0: DATAINB = PortB
1: PortB = DATAOUTB.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 70
Bảng10-8: Mô tả thanh ghi PORTB
Tên Bit R/W Mô tả
PORTB [7:0]
R
Khi CPU đọc tại địa chỉ PORTB, dữ liệu gửi về là từ thanh ghi
DATAINB. Mỗi bit trong thanh ghi DATAINB tương ứng với một chân
trong PortB.
W
Khi CPU ghi vào tại địa chỉ PORTB, dữ liệu được ghi vào thanh ghi
DATAOUTB. Mỗi bit trong hanh ghi DATAOUTB tương ứng với một
chân trong PortB khi DIRB = 1.
Ngõ ra Port[3] còn phụ thuộc vào bit U2ON trong thanh ghi U2STA (xem phần 18.2.1 Thanh
ghi trạng thái của ngoại vi UART thứ x (UxSTA)).
Ngõ ra Port[1] còn phụ thuộc vào bit U3ON trong thanh ghi U3STA (xem phần 18.2.1 Thanh
ghi trạng thái của ngoại vi UART thứ x (UxSTA)).
10.3. GPIO PortC
PortC là một port 8-bit hai chiều. người sử dụng có thể lập trình để chọn chiều vào/ra của dữ liệu.
Tất cả các chân PortC được pull-up.
Khi bit DIRC = 0 thì PortC là ngõ vào. Khi bit DIRC = 1 thì PortC là ngõ ra. PortC có 2 thanh
ghi lưu dữ liệu: một thanh lưu dữ liệu đưa ra PortC do CPU ghi vào (DATAOUTC), một thanh
ghi nhận dữ liệu từ PortC vào (DATAINC).
Bên cạnh chức năng GPIO, PortC còn được sử dụng cho các chức năng khác như UART1, PWM,
SPI.
Nếu UART1 được sử dụng thì PortC[0] được cấu hình là ngõ vào và PortC[1] được cấu hình là
ngõ ra.
Nếu PWM được sử dụng thì PortC[2] và PortC[3] được cấu hình là ngõ ra.
Nếu SPI được sử dụng:
Chế độ master: PortC[5] được cấu hình là ngõ vào và PortC[4] và PortC[6] được
cấu hình là ngõ ra.
Chế độ slave: PortC[4], PortC[5] và PortC[7] được cấu hình là ngõ vào và
PortC[6] được cấu hình là ngõ ra.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 71
PORTC <0>/RX1
Q D
PORTC <1>/TX1
DIR latch
0
1TX1
U1ON
D Q
Q D
DIR latch
/WE
D Q
/WE
RX1
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Hình10-8: IO PortC[0:1] - dùng chung với UART1
Q D
PORTC <2>/PWM1
PORTC <3>/PWM2
DIR latch
0
1PWM output
PWMxON
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Hình10-9: IO PortC[2:3] - dùng chung với PWM
Q D
PORTC <4>/SCK
DIR latch
0
1SCK output
SPION
Q D
PORTC <5>/SDI
DIR latch
SDISCK input
D Q
/WE
D Q
/WE
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Input
buffer
Portout
Portin
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Hình10-10: IO PortC[4:5] - dùng chung với SPI
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 72
Q D
DIR latch
0
1SDO
SPION
PORTC <6>/SDO
Q D
PORTC <7>/SSx
Data latch
DIR latch
SSx
D Q
/WE
D Q
/WE
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Input
buffer
Data bus
Write to port
Write to DIR
Portout
Portin
Input
buffer
Hình10-11: IO PortC[6:7] - dùng chung với SPI
Bảng 10-9: Chức năng của PortC
Tên chân Bit DIR I/O Mô tả
PORTC[0]/RX1 0 I Dữ liệu vào /ngõ vào nối tiếp của UART1
1 O Dữ liệu ra
PORTC[1]/TX1 0 I Dữ liệu vào
1 O Dữ liệu ra /ngõ ra nối tiếp của UART1
PORTC[2]/PWM1 0 I Dữ liệu vào
1 O Data output/PWM1 output
PORTC[3]/PWM2 0 I Dữ liệu vào
1 O Data output/PWM2 output
PORTC[4]/SCK 0 I Dữ liệu vào /clock vào nối tiếp của SPI trong chế độ slave
1 O Dữ liệu ra / clock ra nối tiếp của SPI trong chế độ master
PORTC[5]/SDI 0 I Dữ liệu ra /dữ liệu vào nối tiếp của SPI
1 O Dữ liệu ra
PORTC[6]/SDO 0 I Dữ liệu vào
1 O Dữ liệu ra /dữ liệu ra nối tiếp của SPI
PORTC[7]/SSx 0 I Dữ liệu vào/chân SSx trong chế độ slave của SPI
1 O Dữ liệu ra
Bảng 10-10: Thanh ghi DIRC
Tên Bit R/W Mô tả
DIRC [7:0] R/W
Thanh ghi xác định chiều dữ liệu của PortC. Mỗi bit trong thanh
ghi DIRC tương ứng với một chân trong PortC.
0: DATAINC = PortC
1: PortC = DATAOUTC.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 73
Bảng10-11: Chức năng PORTC
Tên Bit R/W Mô tả
PORTC [7:0]
R Khi CPU đọc tại địa chỉ PORTC, dữ liệu gửi về là từ thanh ghi
DATAINC. Mỗi bit trong hanh ghi DATAINC tương ứng với một chân
trong PortC.
W Khi CPU ghi vào tại địa chỉ PORTC, dữ liệu được ghi vào thanh ghi
DATAOUTC. Mỗi bit trong hanh ghi DATAOUTC tương ứng với một
chân trong PortC khi DIRC = 1.
Ngõ ra PortC[1] còn phụ thuộc vào bit U1ON trong thanh ghi U2STA (xem phần 18.2.1 Thanh
ghi trạng thái của ngoại vi UART thứ x (UxSTA).
Ngõ ra PortC[2] còn phụ thuộc vào bit PWM1ON trong thanh ghi PWM1CON (xem phần
15.5.1 PWMxCON)
Ngõ ra PortC[3] còn phụ thuộc vào bit PWM2ON trong thanh ghi PWM2CON (xem phần
15.5.1 PWMxCON)
Ngõ ra PortC[4], PortC[5] và PortC[7] ] còn phụ thuộc vào bit SPION trong thanh ghi
SPICON (xem phần 16.2.1 Thanh ghi điều khiển SPI - SPICON)
10.4. GPIO PortD
PortD là một port 8-bit hai chiều. người sử dụng có thể lập trình để chọn chiều vào/ ra của dữ
liệu. Hầu hết các chân PortD được pull-up.
Khi bit DIRD = 0 thì PortD là ngõ vào. Khi bit DIRD = 1 thì PortD là ngõ ra. PortD có 2 thanh
ghi lưu dữ liệu: một thanh ghi lưu dữ liệu đưa ra PortD do CPU ghi vào (DATAOUTD), một
thanh ghi nhận dữ liệu từ PortD vào (DATAIND).
Bên cạnh chức năng GPIO, PortD còn được sử dụng cho các chức năng khác như ngắt ngoài,
I2C, Capture/Compare, Timer1.
Nếu sử dụng ngắt ngoài thì PortD[3:0] được cấu hình là ngõ vào.
Nếu I2C được sử dụng thì PortD[5:4] được điều khiển bằng tín hiệu đặc biệt từ khối I2C.
PortD[5:4] không được pull-up.
Nếu Capture được sử dụng thì PortD[6] được cấu hình là ngõ vào.
Nếu Compare được sử dụng thì PortD[6] được cấu hình là ngõ ra.
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 74
Nếu Timer1 sử dụng clock ngoài cho bộ đếm thì PortD[7] được cấu hình là ngõ vào.
PORTD <0>/INT0
PORTD <1>/INT1
PORTD <2>/INT2
PORTD <3>/INT3
Edge
detect
Set interrupt Flag
INTEDGx
x: number of interrupt source
D Q
Q D
DIR latch
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Input
buffer
Portout
Portin
Hình 10-12: IO PortD[0:3] - dùng chung với ngắt ngoài
Q D
PORTD <4>/SCL
DIR latch
0
10
I2CON
0
1Clock output
PORTD <5>/SDA
SDA input
D
/WE
D
/WE
Q
Q
Write to port
Write to DIR
Input
buffer
Portout
Portin
SCL input
Q D
DIR latch
0
10
I2CON
0
1Clock output
D
/WE
D
/WE
Q
Q
Write to port
Write to DIR
Input
buffer
Portout
Portin
Data bus Data bus
Hình 10-13: IO PortD[4:5] - dùng chung với I2C
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 75
Q D
PORTD<6>/CC
DIR latch
0
1Output compare
T1ON
Input capture
CCEN
D Q
D Q
/WE
Data bus
Write to port
Write to DIR
Portin
Portout
Input
buffer
Hình 10-14: IO PortD[6] - dùng chung với Capture/Compare
Q D
PORTD <7>/T1CLK
DIR latch
Timer1 external clock
D Q
/WE
D Q
/WE
Data bus
Write to port
Write to DIR
Input
buffer
Portin
Portout
Hình 10-15: IO PortD[7] - dùng chung với Timer1
Bảng10-12: Chức năng của PortD
Tên chân Bit DIR I/O Mô tả
PORTD[3:0]/EXINT[3:0] 0 I Dữ liệu vào/ngắt ngoài
1 O Dữ liệu ra
PORTD[4]/SCL 0 I Dữ liệu vào/clock vào nối tiếp của I2C
1 O Dữ liệu ra/clock ra nối tiếp I2C
PORTD[5]/SDA 0 I Dữ liệu vào/dữ liệu vào nối tiếp của I2C
1 O Dữ liệu ra/dữ liệu ra nối tiếp I2C
PORTD[6]/CC 0 I Dữ liệu vào/ngõ vào của khối Compare
1 O Dữ liệu ra/ngõ ra của khối Capture
PORTD[7]/T1CLK 0 I Dữ liệu vào/clock ngoài của Timer1
1 O Dữ liệu ra
Cổng truy xuất dữ liệu
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 76
Bảng 10-13: Thanh ghi DIRD
Tên Bit R/W Mô tả
DIRD [7:0] R/W
Thanh ghi xác định chiều dữ liệu của PortD. Mỗi bit trong thanh
ghi DIRD tương ứng với một chân trong PortD.
0: DATAIND = PortD
1: PortD = DATAOUTD
Bảng 10-14: Mô tả chức năng PORTD
Tên Bit R/W Mô tả
PORTD [7:0]
R
Khi CPU đọc tại địa chỉ PORTD, dữ liệu gửi về là từ thanh ghi
DATAIND. Mỗi bit trong hanh ghi DATAIND tương ứng với một chân
trong PortD.
W
Khi CPU ghi vào tại địa chỉ PORTD, dữ liệu được ghi vào thanh ghi
DATAOUTD. Mỗi bit trong hanh ghi DATAOUTD tương ứng với một
chân trong PortD khi DIRD = 1.
Ngõ ra PortD[5:4] còn phụ thuộc vào bit I2CON trong thanh ghi I2CCON1 (xem phần
17.1.1 I2CCON1)
Ngõ ra PortD[6] còn phụ thuộc vào bit T1ON và CCEN trong thanh ghi T1CON (xem phần
14.5.1 TxCON ).
Watchdog timer
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 77
11. Watchdog Timer
Watchdog Timer là một bộ đếm liên tục với xung clock hệ thống. Trong trạng thái hoạt động
bình thường, khi Watchdog Timer tràn (WDT timeout) sẽ tạo ra tín hiệu reset hệ thống. Khi chip
ở trạng thái nghỉ (IDLE), WDT timeout sẽ đánh thức vi xử lý ra khỏi trạng thái nghỉ. Có thể xóa
hay vô hiệu các bộ đếm của Watchdog Timer bằng cách xóa bit WDTON.
Timer 0 và Watchdog Timer có một bộ đếm 8-bit dùng chung gọi là bộ đếm chia sẻ. Khi bộ đếm
chia sẻ dùng cho Timer 0 (bit PSS bằng 1) thì nó có nhiệm vụ như một bộ đếm chia tần trước
(prescaler), khi được dùng cho Watchdog Timer thì nó hoạt động như một bộ đếm chia tần sau
(postscaler). Không thể dùng bộ đếm này cho cả Timer 0 và Watchdog Timer, do đó khi sử dụng
bộ đếm chia sẻ này cho Timer 0 thì Watchdog Timer sẽ không có bộ chia tần sau và ngược lại.
WDT Counter
:65536Fosc
WDTON 0
1
From Timer0
clock sourcePostscaler
1:2 to 1:256
PS2:PS0
1
0
PSS
PSS
Watchdog
timeout
(reset)/RST
CLRWDT
PSS
(reset)
Hình 11-1 : Mô tả khối Watchdog Timer
Chú ý:
Khi xử lý lệnh CLRWDT (và bộ đếm chia sẻ được định nghĩa cho Watchdog Timer) thì bộ đếm
chia sẻ sẽ bị xóa về 0.
Bộ đếm 16-bit WDT không hỗ trợ đọc/ghi, nó luôn đếm lên khi bit WDTON bằng 1. Bộ đếm này
cũng bị xóa về 0 khi reset, WDTON bằng 0 hay khi thực thi lệnh CLRWDT.
Bảng 11-1 : Mô tả thanh ghi WT0CON
Tên bit R/W Mô tả
WDTON [7] R/W Bit tắt/mở Watchdog Timer
0: Tắt/cấm Watchdog Timer
1: Mở/cho phép Watchdog Timer
T0ON [6] R/W Xem mô tả 12.4.1 WT0CON (Timer 0)
T0CKE [5] R/W Xem mô tả 12.4.1 WT0CON (Timer 0)
T0CKS [4] R/W Xem mô tả 12.4.1 WT0CON (Timer 0)
Watchdog timer
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 78
PSS [3] R/W Bit gán bộ đếm chia sẻ
0: gán cho Timer 0
1: gán cho Watchdog Timer
PS [2:0] R/W Bit chọn tỉ số chia cho Postscaler.
000: 1:2
001: 1:4
010: 1:8
011: 1:16
100: 1:32
101: 1:64
110: 1:128
111: 1:256
Chú ý:
Bộ đếm chia sẻ 8-bit được gọi là prescaler khi sử dụng với Timer0 và postscaler khi sử dụng với
Watchdog Timer.
Xem phần mô tả 3.2 để biết thêm chi tiết về bit WDT0 trong thanh ghi CPUSTA.
Timer0
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 79
12. Timer 0
Timer 0 là bộ đếm/định thời 8-bit. Các chức năng chính của Timer 0 như sau:
Thanh ghi bộ đếm/định thời 8-bit với bộ chia tần trước.
Cho phép đọc trạng thái thanh ghi.
Phát ngắt khi tràn bộ đếm từ FFh qua 00h.
8-bit prescaler lập trình được.
Cho phép chọn xung clock nội hay từ bên ngoài.
Chọn cạnh đồng bộ khi dùng xung clock ngoài.
12.1. Mô tả Timer 0
Chế độ định thì được chọn khi xóa bit T0CKS. Trong chế độ định thì, Timer 0 chạy với xung
clock hệ thống, thanh ghi T0REG sẽ đếm lên sau mỗi cạnh lên của xung clock (trong trường hợp
bộ đếm chia sẻ không được gán cho Timer 0) hay mỗi cạnh lên của xung clock tạo ra từ bộ đếm
chia sẻ (trong trường hợp dùng nguồn clock là clock thạch anh và bộ đếm chia sẻ được gán cho
Timer 0). Thanh ghi T0REG cho phép ghi giá trị khởi tạo của bộ định thì.
Chế độ đếm sự kiện được chọn khi bit T0CKS bằng 1. Trong chế độ này, bộ đếm Timer 0 sẽ tăng
một đơn vị tại mỗi cạnh (cạnh xuống hoặc cạnh lên) của xung clock ngoài hoặc cạnh lên của bộ
chia tần trước nếu bộ chia này được gán cho Timer 0 (lúc này bộ chia tần trước cũng chạy theo
cạnh lên hoặc cạnh xuống của xung clock ngoài). Bit T0CKE sẽ chọn cạnh lên hay cạnh xuống
của xung clock ngoài làm xung đếm (T0CKE bằng 0 sẽ chọn cạnh lên và ngược lại).
Chú ý:
Khi sử dụng xung clock ngoài, PortB[4] phải được cấu hình là một ngõ vào.
Bộ chia trước (prescaler) của Timer 0 là một bộ đếm 8-bit được chia sẻ giữa Timer 0 và
Watchdog Timer (trong Watchdog Timer thanh ghi này được gọi là postscaler). Việc gán bộ đếm
này cho Timer 0 hay Watchdog Timer phụ thuộc vào bit PSS, xóa bit PSS sẽ gán bộ đếm này cho
Timer 0 và ngược lại gán cho Watchdog Timer khi PSS bằng 1. Bộ đếm chia sẻ không hỗ trợ
đọc/ghi và tỉ số chia cho phép từ 1:2 đến 1:256.
Timer0
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 80
Synchronize
external clock
and edge detect
T0CKE
Fosc 0
1Programmable
Prescaler
T0CKS
3
PS[2:0]
1
0
PSS
T0REG Set T0IF
Portb[4]/T0CLK
T0ON
Hình 12-1: Mô tả sơ đồ khối Timer0
12.2. Ngắt Timer0
Ngắt Timer 0 phát khi thanh ghi đếm T0REG tràn từ FFh qua 00h. Tín hiệu phát ngắt sẽ được lưu
trong cờ ngắt T0IF. Ngắt Timer 0 bị cấm khi bit mặt nạ ngắt T0IE bị xóa. Cờ ngắt T0IF phải xóa
bằng phần mềm trong chương trình đáp ứng ngắt trước khi ngắt tiếp tục được cho phép.
12.3. Bộ chia tần trước
Một bộ đếm 8-bit được chia sẻ giữa Timer 0 và Watchdog Timer. Khi bộ đếm này dùng cho
Timer 0 (bit PSS bằng 1) thì nó có nhiệm vụ như một bộ đếm chia tần trước (prescaler), khi được
dùng cho Watchdog Timer thì nó hoạt động như một bộ đếm chia tần sau (postscaler). Không thể
dùng bộ đếm này cho cả Timer 0 và Watchdog Timer, do đó khi sử dụng bộ đếm này cho Timer
0 thì Watdog Timer sẽ không có bộ chia tần sau và ngược lại.
Bit PSS quy định bộ đếm chia sẻ được gán cho Timer 0 hay cho Watchdog Timer, các bit PS[2:0]
chọn tỉ số chia. Khi bộ đếm chia sẻ này được gán cho Timer 0, tất cả các lệnh ghi vào thanh ghi
T0REG sẽ reset lại bộ đếm chia sẻ này. Khi gán bộ đếm chia sẻ này cho Watchdog Timer thì
lệnh CLRWDT sẽ reset bộ đếm chia sẻ này, đồng thời cũng reset bộ đếm 16-bit của Watchdog
Timer.
Chú ý:
Để tránh những reset không mong muốn từ Watchdog Timer khi chuyển bộ đếm chia sẻ từ Timer
0 qua Watchdog Timer và ngược lại, người sử dụng cần phải xóa thanh ghi đếm và bộ đếm chia
sẻ trước khi chuyển:
Khi chuyển bộ đếm chia sẻ từ Timer 0 qua Watchdog Timer:
+ Xóa thanh ghi T0REG về giá trị 0
+ Chọn gán cho Watchdog Timer (PSS = 1), lập trình prescaler cho Watchdog
Timer.
Khi chuyển bộ đếm chia sẻ từ Watchdog Timer qua Timer 0:
+ Xóa thanh ghi bộ đếm Watchdog Timer bằng lệnh CLRWDT
Timer0
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 81
+ Chọn gán cho Timer 0 (PSS = 0), lập trình prescaler cho Timer 0.
12.4. Thanh ghi
Timer 0 được điều khiển thông qua thanh ghi WT0CON, thanh ghi này đồng thời cũng chứa một
số bit điều khiển của Watchdog Timer.
12.4.1. WT0CON
Bảng 12-1: Mô tả thanh ghi WT0CON
Tên bit R/W Mô tả
WDTON [7] R/W Xem mô tả 11 Watchdog Timer
T0ON [6] R/W Bit tắt/mở Timer0
0: tắt/cấm Timer0
1: mở/cho phép Timer0
T0CKE [5] R/W Bit chọn cạnh đếm của xung clock ngoài
0: đếm tại cạnh lên của cung clock ngoài
1: đếm tại cạnh xuống của cung clock ngoài
T0CKS [4] R/W Bit chọn nguồn xung clock cho Timer 0
0: chọn xung clock nội
1: chọn xung clock ngoài
PSS [3] R/W Bit gán bộ đếm prescaler/postscaler
0: gán cho Timer 0
1: gán cho Watchdog Timer
PS [2:0] R/W Bit chọn tỉ số chia cho Postscaler.
000: 1:2
001: 1:4
010: 1:8
011: 1:16
100: 1:32
101: 1:64
110: 1:128
111: 1:256
Timer0
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 82
12.4.2. T0REG
Bảng 12-2: Mô tả thanh ghi T0REG
Tên bit R/W Mô tả
T0REG [7:0] R/W Đây là thanh ghi bộ đếm chính của Timer 0. Khi Timer 0 bật,
T0REG luôn đếm tại cạnh lên của xung clock hệ thống hoặc mỗi
xung ngõ ra bộ chia tần trước. Ngắt sẽ phát sinh và cập nhật vào
cờ ngắt T0IF khi thanh ghi này đếm tràn từ FFh về 00h.
Chú ý:
Xem phần 9.3, 9.4 và 9.5 để biết thêm chi tiết về các bit T0IE, T0IP và T0IF.
Xem phần 10.2 để biết thêm chi tiết về thanh ghi chọn chiều của PortB.
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 83
13. Timer 1
Timer 1 là bộ đếm/định thời 16-bit. Các chức năng chính của Timer 1 như sau:
Thanh ghi bộ đếm/định thời 16-bit với bộ chia tần trước
Cặp thanh ghi bộ đếm 8-bit T1RH, T1RL cho phép đọc và ghi.
Hỗ trợ đọc ghi 16-bit.
Chọn lựa nguồn xung clock nội hay clock ngoài (đếm sự kiện).
Phát ngắt Timer và ngắt đo sự kiện (capture).
Hỗ trợ đo sự kiện và so sánh các sự kiện (compare).
13.1. Chức năng của Timer 1
13.1.1. Tổng quan chức năng định thời của Timer 1
Timer 1 là bộ đếm/định thời 16-bit (gồm hai thanh ghi cho phép đọc/ghi 8-bit T1RH và T1RL).
Thanh ghi Timer 1 (T1RH:T1RL) đếm lên từ 0000h đến FFFFh và quay về 0000h. Ngắt Timer 1,
khi được cho phép, sẽ phát tại thời điểm bộ đếm tràn và chứa sự kiện này trong cờ ngắt T1IF.
Ngắt Timer sẽ bị cấm/được phép bằng cách sử dụng bit T1IE. Timer 1 chạy với hai chế độ:
Chế độ định thời
Chế độ đếm sự kiện
Chế độ hoạt động của Timer 1 được quy định bằng bit chọn nguồn clock T1CKS. Trong chế độ
định thời, bộ đếm Timer 1 sẽ tăng với mỗi cạnh lên của xung clock hệ thống. Trong chế độ đếm
sự kiện, bộ đếm Timer 1 sẽ tăng tại cạnh lên của xung clock ngoài. Timer 1 có thể tắt/mở với bit
cho phép T1ON. Timer 1 được hỗ trợ một bộ chia tần trước (prescaler) lập trình được.
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 84
Synchronize
external clock
and edge detect
Portd[7]/T1CLK
Fosc 0
1
T1CKS
Prescaler
2
T1PRES1:T1PRES0
ST1RH T1RL
T1ON
Set T1IF
Hình 13-1: Mô tả sơ đồ khối Timer 1
13.1.2. Các chế độ của Timer1
13.1.2.1. Chế độ định thời
Chế độ định thời được chọn khi bit T1CKS bằng 0. Chế độ định thời hoạt động dựa trên clock hệ
thống. Trước khi đưa vào bộ đếm, xung clock đếm có thể được chia theo tỉ lệ 1:1 đến 1:8 bằng
cách sử dụng bit lập trình T1PRES[1:0]. Khi giá trị thanh ghi bộ đếm Timer 1 bằng FFFFh và
quay về 0000h. Ngắt Timer 1, khi được cho phép, sẽ phát tại thời điểm bộ đếm tràn và lưu sự
kiện này trong cờ ngắt T1IF. Ngắt Timer sẽ bị cấm/cho phép bằng cách sử dụng bit T1IE.
Chú ý:
Người sử dụng nên tắt Timer 1 (xóa bit T1ON) trước khi thay đổi cấu hình hoạt động của Timer
1.
13.1.2.2. Chế độ đếm sự kiện.
Chế độ đếm sự kiện được chọn khi bit T1CKS bằng 1. Trong chế độ này, bộ đếm Timer 1 sẽ tăng
lên tại mỗi cạnh lên của xung clock ngoài hay cạnh lên của xung clock ngoài sau khi đã chia
xuống bằng bộ prescaler.
Chú ý:
Bộ chia tần trước bị reset khi có reset hệ thống, watchdog timeout và khi ghi vào thanh
ghi T1RL (ghi vào thanh ghi T1RH không ảnh hưởng).
Trong chế độ đếm sự kiện, portD[7] phải được cấu hình là một ngõ vào.
Khi sử dụng xung clock ngoài làm xung đếm thì tần số xung clock ngoài phải lớn hơn ít
nhất hai lần tần số xung clock hệ thống.
13.1.2.3. Ngắt Timer1
Cặp thanh ghi bộ đếm Timer 1 (T1RH:T1RL) tăng dần từ 0000h (hoặc từ giá trị lập trình) tới
FFFFh và tràn về 0000h. Tại thời điểm tràn này, ngắt Timer 1 sẽ xảy ra và cập nhật vào cờ ngắt
T1IF. Nếu bit cho phép ngắt Timer 1 (T1IE) tích cực thì tín hiệu ngắt sẽ được gửi tới CPU.
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 85
13.1.3. Đọc và ghi 16-bit thanh ghi bộ đếm Timer1
Timer1 hỗ trợ đọc ghi 16-bit giá trị tại 1 thời điểm đối với thanh ghi bộ đếm (T1RH:T1RL). Khi
lệnh đọc thanh ghi T1RL xảy ra, giá trị của T1RH đồng thời cập nhật vào một bộ đệm 8-bit ngay
lập tức. Do đó T1RH sau đó luôn nhận được giá trị bộ đếm cao tại ngay thời điểm đọc T1RL (khi
đọc T1RH sẽ đọc giá trị thanh ghi bộ đệm phụ). Ngược lại, quá trình ghi vào T1RH sẽ ghi giá trị
muốn ghi vào bộ đệm, sau đó lệnh ghi vào T1RL đồng thời cũng cập nhật giá trị bộ đệm đã ghi
trước đó vào thanh ghi bộ đếm cao.
Người sử dụng cần phải tuân theo các bước được mô tả trong phần ghi chú dưới đây để nhận
được giá trị bộ đếm đúng. Nếu không theo thứ tự mô tả, giá trị của T1RH sẽ cập nhật hoặc lấy
sai.
Chú ý:
1. Nếu người sử dụng muốn ghi 16-bit giá trị vào T1RH:T1RL thì phải tuân theo các bước
sau:
1. Ghi 8-bit vào T1RH trước
2. Sau đó tiếp tục ghi 8-bit vào T1RL
2. Nếu người sử dụng muốn đọc 16-bit giá trị của T1RH:T1RL thì phải tuân theo các bước
sau:
1. Đọc 8-bit giá trị từ T1RL trước
2. Sau đó đọc 8-bit giá trị từ T1RH
3. Do việc ghi vào T1RH không tác động trực tiếp vào thanh ghi bộ đếm (lúc này ghi vào bộ
đệm), nên việc ghi vào T1RH không gây reset bộ prescaler. Chỉ có quá trình ghi vào T1RL
mới gây reset prescaler.
13.2. Khối bắt và so sánh sự kiện
Khi sử dụng khối bắt hoặc so sánh sự kiện, khối Timer 1 luôn chạy kèm theo hai chức năng này.
Trong chế độ bắt sự kiện, cặp thanh ghi CCRH:CCRL sẽ cập nhật giá trị thanh ghi bộ đếm
T1RH:T1RL khi có sự kiện xảy ra tại PortD[6], sự kiện đó là:
Mỗi cạnh xuống của ngõ vào.
Mỗi cạnh lên của ngõ vào.
Mỗi cạnh lên thứ 4 của ngõ vào.
Mỗi cạnh lên thứ 16 của ngõ vào.
Trong chế độ so sánh sự kiện, giá trị của cặp thanh ghi CCRH:CCRL sẽ được so sánh với thanh
ghi bộ đếm T1RH:T1RL. Khi hai cặp thanh ghi này bằng nhau thì ngõ ra tại PortD[6] sẽ xảy ra
một trong các sự kiện sau:
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 86
Chuyển mức cao.
Chuyển mức thấp.
Không thay đổi.
Đổi trạng thái.
Các sự kiện trên phụ thuộc vào 3 bit cấu hình chế độ CCMOD[2:0]. Cũng tại thời điểm này, cờ
ngắt CCIF sẽ được cập nhật.
Chú ý:
1. CCRH và CCRL là thanh ghi cho phép đọc/ghi. Ngoài ra trong chế độ bắt sự kiện, CCRH
và CCRL cập nhật giá trị của T1RH và T1RL khi có sự kiện xảy ra.
2. Bộ bắt và so sánh sự kiện là một khối con trong Timer 1, chúng phải chạy kèm với timer
1 và được cho phép/cấm bằng bit CCEN. Bit T1ON có ưu tiên cao hơn bit CCEN, CCEN chỉ có
tác dụng khi T1ON bằng 1, do đó người sử dụng cần mở Timer 1 trước (T1ON = 1) trước khi cho
phép bộ bắt và so sánh sự kiện hoạt động (CCEN = 1).
3. Khi sử dụng chế độ so sánh sự kiện, sẽ rất nguy hiểm nếu bit CCEN được đặt lên trước
bit T1ON vì lúc này, trạng thái cấu hình của ngõ ra không được xác định nên sẽ không thấy được
sự kiện xảy ra trên PortD[6]. Người sử dụng phải bật Timer 1 trước trong chế độ này.
4. Trong chế độ bắt sự kiện, PortD[6] phải được cấu hình là một ngõ vào, ngược lại trong
chế độ so sánh sự kiện thì PortD[6] phải được cấu hình là một ngõ ra. Khi PortD[6] được cấu
hình thành ngõ ra, phép ghi xuống PortD[6] có thể gây ra sự kiện mà chế độ bắt sự kiện có thể
nhầm lẫn. Sự nhầm lẫn này có thể gây ngắt không mong muốn nên người sử dụng cần phải xóa
bit cho phép ngắt (CCIE = 0) để tránh ngắt sai và nên xóa bit CCIF trước khi sử dụng bất kỳ chế
độ nào.
13.2.1. Chế độ bắt sự kiện
Các sự kiện được chọn bằng bit CCMOD[2:0] (trong thanh ghi T1ON). Khi có sự kiện xảy ra,
đồng thời cờ ngắt CCIF cũng đặt lên, cờ ngắt này chỉ xóa bằng phần mềm. Nếu một sự kiện khác
xảy ra trước khi giá trị của CCRH:CCRL được đọc lên thì giá trị cũ sẽ bị mất.
Khi sử dụng chế độ bắt sự kiện, một bộ chia trước được sử dụng và tỉ số chia phụ thuộc vào bit
CCMOD[2:0]. Khi Timer 1 tắt hoặc không hoạt động trong chế độ bắt sự kiện hoặc bất kỳ reset
nào xảy ra thì bộ chia này sẽ bị xóa về 0. Việc chuyển từ tỉ lệ chia này qua tỉ lệ khác có thể gây
ngắt không mong muốn. Bên cạnh đó, do bộ chia không bị xóa khi bật chế độ này, do đó lần bắt
sự kiện đầu tiên có thể được đếm từ một giá trị bộ đếm chia tần trước khác không.
Khi người sử dụng muốn chuyển giá trị prescaler, người sử dụng cần phải tắt chế độ bắt sự kiện
(CCEN = 0) trước khi chuyển đổi. Sau đó cho phép chế độ bắt sự kiện hoạt động trở lại (CCEN =
1).
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 87
Fall and rise
edge detect
prescaler
CCMOD[2:0]
CCEN
(Capture
Enable)
CCRH CCRL
T1RH T1RL
Set CCIF
PORTD[6]/CC
Hình 13-2: Sơ đồ của khối bắt sự kiện
Timer 1 có thể chạy ở chế độ định thời hay đếm sự kiện khi hoạt động với chế độ bắt sự kiện.
13.2.2. Chế độ so sánh sự kiện
Khi sự kiện so sánh xảy ra, ngõ ra tại PortD[6] sẽ xảy ra một trong các sự kiện sau:
Chuyển mức cao.
Chuyển mức thấp.
Không thay đổi.
Đổi trạng thái.
Người sử dụng phải cấu hình PortD[6] thành một ngõ ra trước khi sử dụng nó cho chế độ so sánh
sự kiện. Khi hoạt động ở chế độ so sánh phát ngắt mềm (CCMOD[3:0] = 1110), không sử dụng
chân PortD[6].
Chú ý:
Khi tắt chế độ bắt/so sánh sự kiện (xóa bit CCEN) hoặc Timer 1 tắt (T1ON = 0) hoặc không
trong chế độ so sánh sự kiện thì ngõ ra khối Timer 1 giữ mức thấp.
Drive
output
DIRD[6]
CCMOD[2:0]CCEN
CCRH CCRL
T1RH T1RL
Comparator(match)
Set CCIF
PORTD[6]/CC
Hình 13-3: Sơ đồ của khối so sánh sự kiện
13.3. Thanh ghi
Timer 1 có 2 thanh ghi bộ đếm 8-bit: T1RH và T1RL tạo thành một bộ đếm 16-bit. Tất cả các
chức năng của Timer 1 được điều khiển thông qua thanh ghi T1CON. Bên cạnh đó, Timer 1 còn
có cặp thanh ghi CCRH và CCRL dùng cho chế độ bắt/so sánh sự kiện.
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 88
13.3.1. T1CON
Bảng 13-1: Mô tả thanh ghi T1CON
Tên bit R/W Mô tả
T1ON [7] R/W Bit tắt/mở Timer 1
0: tắt/cấm Timer 1
1: mở/cho phép Timer 1
T1CKS [6] R/W Bit chọn nguồn xung clock cho Timer 1
0: chọn xung clock nội
1: chọn xung clock ngoài
CCEN [5] R/W Bit cho phép chế độ bắt/so sánh sự kiện.
0: cấm chế độ bắt/so sánh sự kiện.
1: cho phép chế độ bắt/so sánh sự kiện
CCMOD [4:2] R/W Bit chọn chế độ hoạt động (khi sử dụng bắt/so sánh sự kiện)
000: Chế độ Timer/Counter 16-bit kết hợp bắt sự
kiện cạnh xuống.
001: Chế độ Timer/Counter 16-bit kết hợp bắt sự
kiện cạnh lên.
010: Chế độ Timer/Counter 16-bit kết hợp bắt sự
kiện cạnh lên thứ 4.
011: Chế độ Timer/Counter 16-bit kết hợp bắt sự
kiện cạnh lên thứ 16.
100: Chế độ Timer/Counter 16-bit kết hợp so
sánh sự kiện và chuyển mức cao ngõ ra.
101: Chế độ Timer/Counter 16-bit kết hợp so
sánh sự kiện và chuyển mức thấp ngõ ra.
110: Chế độ Timer/Counter 16-bit kết hợp so
sánh sự kiện và phát ngắt mềm.
111: Chế độ Timer/Counter 16-bit kết hợp so
sánh sự kiện và chuyển trạng thái ngõ ra.
T1PRES [1:0] Bit quy định tỉ lệ chia prescaler
00: tỉ lệ 1:1
01: tỉ lệ 1:2
10: tỉ lệ 1:4
11: tỉ lệ 1:8
Timer1
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 89
13.3.2. T1RH
Bảng 13-2: Mô tả thanh ghi T1RH
Tên bit R/W Mô tả
T1RH [7:0] R/W Đây là thanh ghi lưu giá trị bộ đếm cao của Timer 1. Thanh ghi
này là một bộ đệm 8-bit, giá trị của thanh ghi này sẽ cập nhật giá
trị của bộ đếm cao khi người sử dụng đọc thanh ghi T1RL và sẽ
lưu giá trị mà CPU muốn ghi vào bộ đếm cao. Xem thêm phần
“Đọc và ghi 16-bit thanh ghi bộ đếm Timer 1” để biết thêm thông
tin về thanh ghi này.
13.3.3. T1RL
Bảng 13-3: Mô tả thanh ghi T1RL
Tên bit R/W Mô tả
T1RL [7:0] R/W Đây là 8-bit thanh ghi bộ đếm thấp của Timer 1. Thanh ghi này
kết hợp với thanh ghi bộ đếm cao thành bộ đếm 16-bit.
13.3.4. CCRH
Bảng 13-4: Mô tả thanh ghi CCRH
Tên bit R/W Mô tả
CCRH [7:0] R/W Đây là thanh ghi lưu giá trị cao của giá trị so sánh khi sử dụng
trong chế độ so sánh sự kiện hoặc dùng để bắt giá trị (byte cao)
trong chế độ bắt sự kiện. Thanh ghi nay chỉ nên ghi trong chế độ so
sánh sự kiện và chỉ nên đọc trong chế độ bắt sự kiện.
13.3.5. CCRL
Bảng 13-5: Mô tả thanh ghi CCRL
Tên bit R/W Mô tả
CCRL [7:0] R/W Đây là thanh ghi lưu giá trị thấp của giá trị so sánh khi sử dụng
trong chế độ so sánh sự kiện hoặc dùng để bắt giá trị (byte thấp)
trong chế độ bắt sự kiện. Thanh ghi nay chỉ nên ghi trong chế độ so
sánh sự kiện và chỉ nên đọc trong chế độ bắt sự kiện.
Chú ý:
Xem phần 9.3, 9.4 và 9.5 để biết thêm chi tiết về các bit T1IE, T1IP và T1IF.
Xem phần 9.6, 9.7 và 9.8 để biết thêm chi tiết về các bit CCIE, CCIP và CCIF
Xem phần 10.4 để biết thêm chi tiết về các bit cấu hình chiều của PortD
Timer2 và Timer3
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 90
14. Timer 2 và Timer 3 (Timer_x)
14.1. Tổng quan Timer_x Do Timer 2 và Timer 3 được thiết kế giống nhau, do đó chúng sẽ được mô tả chung và được gọi
là Timer_x (x là 2 hoặc 3)
Timer_x là bộ định thời/đếm sự kiện 10-bit hỗ trợ bộ chia tần trước (prescaler) và bộ chia tần sau
(postscaler). Timer_x còn được dùng để tạo ra chu kỳ tần số của bộ tạo xung PWM (kết hợp với
khối tạo xung PWM). Thanh ghi bộ đếm của Timer_x cho phép đọc/ghi và bị xóa khi reset.
Timer_x hỗ trợ những tính năng sau:
Thanh ghi bộ đếm 10-bit (TxRH:Tx2RL) và thanh ghi đo chu kỳ thời gian 10-bit
(TxPRH:TxPRL).
Cho phép đọc/ghi các thanh ghi.
Hỗ trợ bộ chia tần trước với tỉ số chia 1:1, 1:4, 1:16 và 1:64
Hỗ trợ bộ chia tần sau với tỉ số chia từ 1:1 đến 1:16
Hỗ trợ ngắt
Kết hợp sử dụng với SPI như một bộ tạo xung dịch.
Khối Timer_x được điều khiển thông qua thanh ghi T2CON.
Prescaler1:4; 1:16; 1:64
Fosc
T2ON
ST2RH T2RL
T2PRH T2PRLPostscaler1:1,...1:16
T2PRES1:T2PRES0
T2POS3:T2POS0
(match)
(reset)
Set T2IF
Timer2 outputComparator
Hình 14-1: Sơ đồ khối Timer_x (Timer 2 hoặc Timer 3)
14.2. Hoạt động của Timer_x
Ở chế độ bình thường, bộ đếm Timer_x sẽ tăng tại mỗi cạnh lên xung clock hệ thống hoặc ngõ ra
khối chia tần trước trong trường hợp tỉ số chia tần trước khác 1:1). Tỉ số chia tần trước được chọn
thông qua các bit TxPRES[1:0]. Giá trị thanh ghi bộ đếm Timer_x TxRH:TxRL sẽ được so sánh
với giá trị của thanh ghi TxPRH:TxPRL tại mỗi chu kỳ xung clock hệ thống. Ngay khi hai giá trị
này bằng nhau, bộ so sánh sẽ phát tín hiệu báo bằng nhau. Tín hiệu bằng nhau này được dùng để
tạo chu kỳ xung PWM, hỗ trợ khối SPI, đồng thời dùng để reset giá tri bộ đếm TxRH:TxRL về
000h tại chu kỳ xung clock ngay sau đó và tích cực bộ chia tần ngõ ra.
Timer2 và Timer3
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 91
Khi có tín hiệu reset, cặp thanh ghi TxRH:TxRL sẽ reset về 000h, trong khi cặp thanh ghi
TxPRH:TxPRL sẽ quay về giá trị 3FFh. Cả bộ chia tần trước và bộ chia tần sau đều bị reset trong
các trường hợp sau:
Lệnh ghi vào thanh ghi TxRL.
Bất kỳ tín hiệu reset nào (reset hệ thống, Watchdog timeout…)
Thanh ghi bộ đếm Timer_x không bị xóa khi xóa bit T2CON.
14.3. Ngắt Timer_x
Ngõ ra Timer_x (tạo ra khi giá trị TxRH:TxRL bằng với TxPRH:TxPRL) cung cấp tín hiệu đếm
lên cho bộ chia tần sau. Khi giá trị bộ đếm bộ chia tần sau bằng với giá trị cấu hình (bit
TxPOS[3:0]) thì ngắt xảy ra và cập nhật tại bit cờ ngắt TxIF. Ngắt này sẽ phát tới CPU nếu bit
cho phép ngắt TxIE bằng 1.
Ngõ ra so sánh của Timer_x (ứng với tần số so sánh) được dùng như chu kỳ của xung PWM tạo
ra từ bộ tạo xung PWM. Ngoài ra Timer_x còn được dùng như bộ tạo xung dịch cho khối SPI.
14.4. Đọc/ghi 10-bit trong Timer_x.
Timer_x hỗ trợ đọc ghi 10-bit giá trị tại 1 thời điểm đối với thanh ghi bộ đếm (TxRH:TxRL). Khi
lệnh đọc thanh ghi TxRL xảy ra, giá trị của TxRH đồng thời cập nhật vào một bộ đệm 2 bit ngay
lập tức. Do đó TxRH luôn nhận được giá trị bộ đếm cao tại ngay thời điểm đọc TxRL (khi đọc
TxRH sẽ đọc giá trị thanh ghi bộ đệm phụ). Ngược lại, quá trình ghi vào TxRH sẽ ghi giá trị
muốn ghi vào bộ đệm, sau đó lệnh ghi vào TxRL đồng thời cũng cập nhật giá trị bộ đệm đã ghi
trước đó vào thanh ghi bộ đếm cao.
Người sử dụng cần phải tuân theo các bước được mô tả trong phần ghi chú dưới đây để nhận
được giá trị bộ đếm đúng. Nếu không theo thứ tự mô tả, giá trị của TxRH sẽ cập nhật hoặc lấy
sai.
Chú ý:
1. Nếu người sử dụng muốn ghi 10-bit giá trị vào TxRH:TxRL thì phải tuân theo các bước
sau:
1. Ghi 2 bit vào TxRH trước
2. Sau đó tiếp tục ghi 8-bit vào TxRL
2. Nếu người sử dụng muốn đọc 10-bit giá trị của TxRH:TxRL thì phải tuân theo các bước
sau:
1. Đọc 8-bit giá trị từ TxRL trước
2. Sau đó đọc 2 bit giá trị từ TxRH
Timer2 và Timer3
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 92
3. Do việc ghi vào TxRH không tác động trực tiếp vào thanh ghi bộ đếm (lúc này ghi vào bộ
đệm), nên việc ghi vào TxRH không gây reset bộ prescaler. Chỉ có quá trình ghi vào TxRL
với gây reset prescaler.
14.5. Thanh ghi
Thanh ghi bộ đếm Timer_x là cặp hai thanh ghi bộ đếm cao 2 bit TxRH và thanh ghi bộ đếm
thấp 8-bit TxRL. Hai thanh ghi này có thể đọc và ghi. Thanh ghi bộ đếm Timer_x sẽ tăng từ giá
trị lập trình đến giá trị so sánh và reset về 000h và tiếp tục quá trình đến giá trị so sánh. Ngắt
Timer_x khi được phép sẽ phát ngắt tại ngõ ra bộ chia tần sau.
14.5.1. TxCON
Bảng 14-1: Mô tả thanh ghi TxCON
Tên bit R/W Mô tả
TxON [7] R/W Bit tắt/mở Timer_x
0: tắt/cấm Timer_x
1: mở/cho phép Timer_x
Dự trữ [6] - Bit dự trữ
TxPRES [5:4] R/W Tỉ số chia tần trước.
00: tỉ lệ là 1:1
01: tỉ lệ là 1:4
10: tỉ lệ là 1:16
11: tỉ lệ là 1:64
TxPOS [3:0] Tỉ số chia tần sau
0000: tỉ lệ là 1:1
0001: tỉ lệ là 1:2
…..
1111: tỉ lệ là 1:16
14.5.2. TxRH
Bảng 14-2 Mô tả thanh ghi TxRH
Tên bit R/W Mô tả
TxRH [1:0] R/W Đây là thanh ghi lưu giá trị bộ đếm cao của Timer_x. Thanh ghi
này là một bộ đệm 2 bit, giá trị của thanh ghi này sẽ cập nhật giá
trị của bộ đếm cao khi người sử dụng đọc thanh ghi TxRL và sẽ
lưu giá trị mà CPU muốn ghi vào bộ đếm cao. Xem thêm phần
“Đọc và ghi 10-bit thanh ghi bộ đếm Timer_x” để biết thêm thông
tin về thanh ghi này.
Timer2 và Timer3
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 93
14.5.3. TxRL
Bảng 14-3 Mô tả thanh ghi TxRL
Tên bit R/W Mô tả
TxRL [7:0] R/W Đây là 8-bit thanh ghi bộ đếm thấp của Timer_x. Thanh ghi này
kết hợp với thanh ghi bộ đếm cao thành bộ đếm 10-bit.
14.5.4. TxPRH
Bảng 14-4 Mô tả thanh ghi TxPRH
Tên bit R/W Mô tả
TxPRH [7:0] R/W Đây là thanh ghi lưu 2 bit giá trị so sánh dùng để so sánh với 2 bit
TxRH của bộ đếm Timer_x.
14.5.5. TxPRL
Bảng 14-5 Mô tả thanh ghi TxPRL
Tên bit R/W Mô tả
TxPRL [7:0] R/W Đây là thanh ghi lưu 8 giá trị so sánh dùng để so sánh với 8-bit
TxRL của bộ đếm Timer_x.
Chú ý:
Xem phần 9.3, 9.4 và 9.5 để biết thêm chi tiết về các bit TxIE, TxIP và TxIF.
Bộ tạo xung PWM
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 94
15. Bộ tạo xung PWM (The Pulse Width Modulation)
15.1. Tổng quan PWM_x Chip SG8V1 được thiết kế với hai bộ tạo xung băm PWM: PWM 1 và PWM 2. Tài liệu này mô
tả chung cho hai bộ tạo xung và gọi là PWM_x (x=1, 2).
Bộ tạo xung PWM_x được sử dụng để tạo dạng xung băm dùng cho nhiều ứng dung như điều
khiển động cơ, quản lý công suất…Khối PWM_x được dùng song song với Timer_x, người sử
dụng có thể lựa chọn kết nối với Timer 2 hoặc Timer 3.
Dạng sóng PWM ngõ ra có chu kỳ hoạt động chính là chu kỳ so sánh của Timer_x và chu kỳ
nhiệm vụ ứng với thời gian mà ngõ ra ở mức cao.
PWM_x có hai thanh ghi bộ so sánh 10-bit tạo chu kỳ nhiệm vụ: 8-bit thấp PWMxRL và hai bit
cao PWMxRH. Cả hai thanh ghi này đều cho phép đọc và ghi.
Chú ý:
Khi khối PWM_x không hoạt động (PWMxON = 0) thì ngõ ra bộ tạo xung mặc định có giá trị 0.
TxRH TxRL
Timer_x output
SPWM1RH SPWM1RL
PWM1RH PWM1RL
(reset)
(update)
Output drive
DIRC[2]
PORTC[2]/PWM1
Note: x = 2 or x = 3
comparator
From PWM1CON[1:0]
Hình 15-1: Sơ đồ của khối PWM_x
15.2. Chu kỳ xung PWM_x
Chu kỳ xung PWM_x được đặc trưng bởi giá trị lưu trong cặp thanh ghi so sánh TxPRH:TxPRL
của Timer_x. Chu kỳ xung PWM_x có thể được tính theo công thức sau:
Công thức 15-1: Công thức tính chu kỳ PWM_x
PWM_x period (s) = [(TxPRH:TxPRL) + 1] * TOSC * (giá trị bộ chia tần trước Timer_x)
Bộ tạo xung PWM
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 95
Tần số xung băm được định nghĩa bằng 1/[PWM_x period]. Khi giá trị thanh ghi bộ đếm
Timer_x TxRH:TxRL bằng với thanh ghi chu kỳ so sánh TxPRH:TxPRL thì các sự kiện sau sẽ
xảy ra tại chu kỳ xung clock kế tiếp:
Thanh ghi bộ đếm Timer_x TxRH:TxRL bị xóa về 000h.
Giá trị chu kỳ nhiệm vụ PWM_x được chốt từ cặp thanh ghi PWMxRH:PWMxRL vào
thanh ghi ảnh của chúng SPWMxRH:SPWMxRL là thanh ghi dùng để so sánh.
Ngõ ra bộ tạo xung PWM_x được đặt lên cao (trừ trường hợp chu kỳ nhiệm vụ bằng 0).
Chú ý:
Bộ chia tần sau Timer_x không được sử dụng để tạo ra dạng xung PWM.
15.3. Chu kỳ nhiệm vụ
Chu kỳ nhiệm vụ PWM_x được đặc trưng bằng giá trị cặp thanh ghi PWMxRH:PWMxRL,
PWMxRL chứa 8 bit thấp và PWMxRH chứa 2 bit cao tạo thành 10 bit so sánh tạo chu kỳ nhiệm
vụ. Công thức sau mô tả cách tính chu kỳ nhiệm vụ:
Công thức 15-2: Công thức tính chu kỳ nhiệm vụ PWM_x:
PWM_x duty cycle (s) = (PWMxRH:PWMxRL) * Tosc * (giá trị bộ chia tần trước
Timer_x)
PWM1RH:PWM1RL có thể ghi bất cứ thời điểm nào, nhưng giá trị đó chỉ được cập nhật vào bộ
so sánh tại thời điểm ngõ ra Timer_x tích cực (xong một chu kỳ PWM_x).
Khi giá trị cặp thanh ghi PWMxRH:PWMxRL bằng giá trị bộ đếm Timer_x TxRH:TxRL, ngõ ra
PWM_x sẽ bị xóa về. Tỉ số PWM_X lớn nhất (Max resolution) được mô tả bằng công thức sau:
Công thức 15-3: Công thức tính “Max resolution”
Max Resolution = log (Fosc/Fpwm) / log 2
Chú ý:
Nếu chu kỳ nhiệm vụ lớn hơn chu kỳ xung PWM_x thì ngõ ra PWM_x luôn giữ mức cao.
Bộ tạo xung PWM
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 96
Period cycle Period cycle Period cycle Period cycle
Duty cycle(DC)DCDC
Timer register = Period register
Timer register = PWM1RH:PWM1RL
Cập nhật giá trị mới
Giá trị bộ đếm Timer
Dạng sóng PWM
DC = 0%
Hình 15-2: Dạng sóng PWM
15.4. Cấu hình hoạt động cho khối PWM_x
Khi sử dụng chức năng tạo xung, người sử dụng nên tuân theo các bước sau:
Cấu hình chu kỳ xung PWM bằng cách ghi vào thanh ghi TxPRH:TxPRL.
Cấu hình chu kỳ nhiệm vụ bằng cách ghi vào thanh ghi PWMxRH:PWMxRL.
Cấu hình PortC[2] hoặc PortC[3] là một ngõ ra bằng cách đặt bit DIRC[2] hoặc bit
DIRC[3] lên mức cao. Người sử dụng nên xóa PORTC[2] hoặc PORTC[3] (trong thanh
ghi PORTC) để hệ thống hoạt động tốt hơn (xem chú ý sau).
Cài đặt cho Timer_x: xác định tỉ lệ chia tần trước, bật Timer_x (TxON = 1).
Cho phép khối PWM_x hoạt động (PWMxON = 1).
Chú ý:
Khi khối PWM_x hoạt động (PWMxON = 1) và khối PWM_x được cấu hình sử dụng cho một
ứng dụng nào đó (ví dụ điều khiển động cơ điện) thì PortC[2] hoặc PortC[3] được sử dụng làm
ngõ ra bộ tạo xung. Bình thường khi khối PWM_x bị tắt và PortC[2] hoặc PortC[3] được cấu
hình thành ngõ ra thì ngõ ra lúc này chính là giá trị bit [2] hoặc [3] của thanh ghi PORTC. Khi
khối PWM_x tắt từ trạng thái đang hoạt động, Port chức năng tương ứng được chuyển nhiệm vụ
và ngõ ra lúc này sẽ giữ “0” hoặc “1” tùy giá trị thanh ghi PORTC. Nếu lúc đó mạch ngoài chưa
ngắt chức năng điều xung thì sẽ nhận được tín hiệu điều xung nhỏ nhất (= 0) hoặc lớn nhất (= 1)
bất chấp khối PWM_x đã tắt.
Khi cả hai khối PWM 1 và PWM 2 cùng sử dụng một nguồn Timer, chúng sẽ có chu kỳ xung
PWM, tần số cập nhật giống nhau nhưng chu kỳ nhiệm vụ có thể khác nhau.
Bộ tạo xung PWM
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 97
15.5. Thanh ghi
Khối PWM_x được điều khiển thông qua thanh ghi PWMxCON register. PWM_x có hai cặp
thanh ghi 10-bit: PWMxRH:PWMxRL và SPWMxRH:SPWMxRL, một dùng để chứa giá trị so
sánh của chu kỳ tiếp theo so sánh và một là thanh ghi so sánh.
15.5.1. PWMxCON
Bảng 15-1: Mô tả thanh ghi PWMxCON
Tên bit R/W Mô tả
PWMxON [7] R/W Bit tắt/mở chức năng PWM
0: tắt/cấm PWM_x
1: mở/cho phép PWM_x
PWMxST [6] R/W Bit chọn nguồn Timer
0: nguồn Timer là Timer 2
1: nguồn Timer là Timer 3
Dự trữ [5:2] - Bit dự trữ
PWMxRH [1:0]] R/W Thanh ghi chứa 2 bit cao của bộ so sánh tạo chu kỳ nhiệm vụ. Hai
bit này kết hợp với 8-bit PWMxRL tạo thành 10-bit so sánh với
TxRH:TxRL.
15.5.2. PWMxRL
Bảng 15-2: Mô tả thanh ghi PWMxRL
Tên bit R/W Mô tả
PWMxRL [7:0] R/W Thanh ghi chứa 8-bit thấp của bộ so sánh tạo chu kỳ nhiệm vụ.
Tám bit này kết hợp với 2 bit PWMxRH tạo thành 10-bit so sánh
với TxRH:TxRL.
Chú ý:
Xem phần 10.3 để biết thêm chi tiết về các bit cấu hình chiều của PortC
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 98
16. Serial Peripheral Interface (SPI)
16.1. Giới thiệu SPI
SPI là một khối truyền/nhận đồng bộ nối tiếp. Khối SPI hoạt động với chế độ master hoặc slave.
Ở chế độ slave, khối SPI có thể giao tiếp với nhiều master.
Giao tiếp SPI được sử dụng khá rộng rãi trong cuộc sống như: dùng để đọc ghi bộ nhớ
EEPROM-SPI, điều khiển màn hình LCD, đọc dữ liệu từ các chip đo nhiệt độ chuyên dụng….
SPISR
SPIBUF
PortC[5] /
SDI
PortC[6] /
SDO
prescale
4, 16, 64
Fsoc
TMR2 / 2
clock select
SCK_O
SCK_I
protocol controller
SPIMS
PortC[4] /
SCK
PortC[7] /
SSx
Shift clock
SPISTASPICON
internal data bus
MODE[1:0]
Hình16-1: Sơ đồ khối SPI
Như mô tả hình trên, khối SPI có một bộ đệm 8-bit (SPIBUF) và một thanh ghi dịch (SPISR).
Khi bắt đầu quá trình truyền dữ liệu, thanh ghi SPISR sẽ cập nhật dữ liệu từ thanh ghi SPIBUF.
Khi có clock thì thanh ghi SPISR sẽ nhận dữ liệu từ SDI và phát ra ở SDO. Sau khi nhận và phát
xong 1 byte thì dữ liệu từ SPISR sẽ được đưa đến SPIBUF và bit SPIBF sẽ lên 1.
Giao tiếp của khối SPI gồm có các tín hiệu sau:
Ngõ ra nối tiếp (SDO) – PortC[6] /SDO
Ngõ vào nối tiếp (SDI) – PortC[5] /SDI
Clock nối tiếp (SCK) – PortC[4] /SCK
Trong chế độ slave có thể sử dụng thêm chân:
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 99
Lựa chọn SPI slave (SSx) – PortC[7] /SSx
16.2. Các thanh ghi của SPI SPI có 3 thanh ghi. Chúng được sử dụng chung cho cả chế độ master và slave.
Bảng 16-1: Thanh ghi SPI
Tên thanh ghi Địa chỉ Mô tả
SPICON 0x04F Thanh ghi điều khiển
SPISTA 0x050 Thanh ghi trạng thái
SPIBUF 0x051 Thanh ghi đệm
Thanh ghi SPICON và SPISTA là thanh ghi điều khiển và thanh ghi trạng thái của SPI. Trong
thanh ghi SPISTA có bit BF chỉ được đọc, các bit còn lại có thể đọc và ghi.
Trong quá trình nhận dữ liệu, 2 thanh ghi SPIBUF và SPISR tạo thành bộ đệm 2 thanh ghi. Sau
khi nhận xong 1 byte thì dữ liệu sẽ được đưa đến SPIBUF. Trong khi SPIBUF đang chờ CPU
đọc dữ liệu thì SPISR có thể đang nhận byte thứ 2. Nếu SPISR nhận xong byte thứ 2 và giá trị
trong SPIBUF vẫn chưa được đọc thì giá trị SPISR bị mất đi và cờ tràn bật lên (SPIOV = 1).
Sau khi nhận xong 1 byte thì cờ ngắt SPIIF bật lên để yêu cầu CPU đọc dữ liệu từ thanh ghi
SPIBUF.
16.2.1. Thanh ghi điều khiển SPI - SPICON
Bảng16-2: Thanh ghi điều khiển SPI- SPICON
Tên Bit R/W Mô tả
SPION [7] R/W Bit bật/tắt SPI
0: Khối SPI không được cho phép hoạt động.
1: Khối SPI được cho phép hoạt động.
Dự trữ [6:4] R Không sử dụng
Giá trị đọc ra là 0
CKP [4] R/W Trạng thái nghỉ của SCK
0: Trạng thái nghỉ của SCK là ở mức thấp
1: Trạng thái nghỉ của SCK là ở mức cao
CKE [3] R/W Cạnh của SCK sử dụng để nhận dữ liệu
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 100
Tên Bit R/W Mô tả
0: Nhận dữ liệu ở cạnh thứ hai
1: Nhận dữ liệu ở cạnh đầu tiên
SPIMS [2] R/W Chế độ master hay slave
0: Chế độ master
1: Chế độ slave
MODE [1:0] R/W Chế độ hoạt động của SPI.
Chế độ slave, cho phép cấu hình chế độ sử dụng SSx
00: Chân SSx được sử dụng như là tín hiệu cho phép SPI
01: SPI hoạt động không cần tín hiệu SSx
Chế độ master, hai bit này sử dụng để cấu hình tần số SCK cho SPI
00: SCK = Fosc/4
01: SCK = Fosc/16
10: SCK = Fosc/64
11: SCK = tmr2/2
Chú ý:
SPICON phải được cấu hình trước khi bật bit SPION = 1.
Khi SPI trong chế độ slave và sử dụng chân SSx, khi SSx =1 thì quá trình truyền dữ liệu của
SPI sẽ bị reset.
16.2.2. Thanh ghi trạng thái - SPISTA
Bảng 16-3: Thanh ghi trạng thái SPI- SPISTA
Tên Bit R/W Mô tả
Dự trữ [7:3] R Không sử dụng
Giá trị đọc ra là 0
SPIOV [2] R/W Bit tràn bộ đệm, chỉ sử dụng trong chế độ slave
0: Không bị tràn bộ đệm
1: Bị tràn bộ đệm. Khi SPI nhận xong 1 byte dữ liệu mà byte
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 101
Tên Bit R/W Mô tả
trước đó trong SPIBUF vẫn chưa được đọc, thì giá trị SPISR
bị mất đi và bit SPIOV bật lên 1.
Ghi vào giá trị 0 để xóa bit này
SPIWCOL [1] R/W Xung đột dữ liệu trong quá trình phát.
0: Không bị xung đột
1: Bị xung đột, khi ghi dữ liệu vào thanh ghi SPIBUF để
phát ra bên ngoài, Nếu quá trình ghi xảy ra khi SPI đang
truyền dữ liệu trước đó thì bit SPIWCOL sẽ bật lên 1. Dữ
liệu trong SPIBUF sẽ bị SPISR ghi đè lên khi truyền xong 1
byte. Nên ghi dữ liệu vào SPIBUF khi mới chuẩn bị truyền
hoặc kết thúc byte truyền trước đó (SPIBF = 1).
Ghi vào giá trị 0 để xóa bit này
SPIBF [0] R Bit trạng thái của thanh ghi SPIBUF
0: Chưa nhận xong 1 byte
1: Nhận xong 1 byte
Bit này được xóa khi đọc thanh ghi SPIBUF
Chú ý:
Khi xung đột dữ liệu xảy ra thì dữ liệu phát đi có thể bị sai.
16.3. Hoạt động của SPI
Khi sử dụng ngoại vi SPI, người sử dụng cần chú ý đến các điểm như sau khi cấu hình:
SCK: Nếu ở chế độ master thì SCK là ngõ ra (SPIMS = 0) Nếu ở chế độ slave thì SCK
là ngõ vào (SPIMS = 1).
CKP: Trạng thái nghỉ của SCK
CKE: Cạnh nhận dữ liệu
MODE : Nếu ở chế độ master thì MODE sử dụng để cấu hình tần số SCK. Nếu ở chế độ
slave thì MODE sử dụng để cấu hình chế độ SSx.
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 102
SPISR
Truyền dữ liệu của SPI
SPISR
SPIBUF SBIBUF
MASTER
CONTROL
SLAVE
CONTROL
SDI
SDI
SDO
SDO
SCK
SSx
MASTER SLAVE
SCK
GPIO
Hình16-2: Sơ đồ kết nối của SPI
Các trường hợp truyền nhận dữ liệu:
Master gửi dữ liệu thật – Slave gửi dữ liệu thật
Master gửi dữ liệu thật – Slave gửi dữ liệu giả
Master gửi dữ liệu giả – Slave gửi dữ liệu thật
Dữ liệu thật là dữ liệu muốn truyền. Dữ liệu giả là dữ liệu không được quan tâm.
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0SDI/SDO
SCK
(CKP=0, CKE=0)
SCK
(CKP=0, CKE=1)
SCK
(CKP=1, CKE=1)
SPIIF
SSx
SCK
(CKP=1, CKE=0)
Hình 16-3: Các chế độ truyền dữ liệu của SPI
Chú ý:
Nếu ngắt SPI được cho phép (SPIIE=1) thì cờ ngắt sẽ xảy ra khi SPI phát/nhận xong 8-bit.
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 103
16.4. Các bước cấu hình SPI
16.4.1. Cấu hình SPI ở chế độ master
1. Cấu hình thanh ghi SPICON.
Chế độ master – SPIMS (SPICON [2] ) = 0.
Chế độ SCK – SPICKP: SPICKE (SPICON [4:3]).
Tốc độ truyền – SPIMODE [1:0] (SPICON [1:0]).
2. Cấu hình ngắt và độ ưu tiên ngắt.
SPIIE (IE2 [6]), cho phép cờ ngắt SPIIF.
Cấu hình SPIIP (IP2 [6]) để chọn mức ưu tiên ngắt.
3. Cấu hình các chân giao tiếp
PortC[5] /SDI là ngõ vào
PortC[6] /SDO và PortC[4] /SCK là ngõ ra.
4. Bật SPION.
SPION (SPICON [7]) = 1.
5. Sử dụng một chân GPIO và kéo xuống zero để cho phép SPI slave.
6. Ghi dữ liệu muốn gửi vào SPIBUF
7. Kiểm tra bit trạng thái SPIBF
SPIBUF = 0: Chưa truyền xong 1 byte
SPIBUF = 1: Truyền xong 1 byte
8. Khi SPIBUF = 1, đọc thanh ghi SPIBUF để xóa bit SPIBUF.
9. Quay lại bước 6 để tiếp tục quá trình truyền nhận.
Chú ý:
Chỉ ghi dữ liệu vào SPIBUF khi mà slave đã sẵn sàng nhận dữ liệu.
16.4.2. Cấu hình SPI ở chế độ slave
1. Cấu hình thanh ghi SPICON.
Chế độ slave – SPIMS (SPICON [2] ) = 1.
Chế độ SCK – SPICKP: SPICKE (SPICON [4:3]).
Chế độ điều khiển SSx – SPIMODE [1:0] (SPICON [1:0]).
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 104
2. Cấu hình ngắt và độ ưu tiên ngắt.
SPIIE (IE2 [6] = 1), cho phép cờ ngắt SPIIF.
Cấu hình SPIIP (IP2 [6]) để chọn mức ưu tiên ngắt.
3. Cấu hình các chân giao tiếp
PortC[5] /SDI và PortC[4] /SCK là ngõ vào
PortC[7] /SSx là ngõ vào nếu sử dụng chân lựa chọn slave
PortC[6] /SDO là ngõ ra
4. Bật SPION.
SPION (SPICON [7]) = 1.
5. Ghi dữ liệu muốn gửi vào SPIBUF
6. Kiểm tra bit trạng thái SPIBF
SPIBUF = 0: Chưa truyền xong 1 byte
SPIBUF = 1: Truyền xong 1 byte
7. Khi SPIBUF = 1, đọc thanh ghi SPIBUF để xóa bit SPIBUF.
8. Quay lại bước 5 để tiếp tục quá trình phát và nhận. Nếu chỉ có quá trình nhận thì quay lại
bước thứ 6.
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0SDI/
SDO
SCK
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
byte 1 byte 2TDC
Hình 16-4: Dạng sóng của SPI slave (CKP = 0, CKE = 1)
Chú ý:
Tần số SCK nhỏ hơn một nửa của clock hệ thống (SCK < FOSC / 2).
TDC lớn hơn 4 lần chu kỳ clock hệ thống. Nếu tần số SCK nhỏ hơn 4 lần clock hệ thống
(SCK < FOSC / 4) thì TDC không cần quan tâm.
Khi sử dụng SSx và SSx bị kéo lên cao khi đang truyền một byte, thì dữ liệu đó sẽ bị mất đi và
không làm thay đổi các bit trạng thái của SPI
SPI
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 105
bit 7 bit 6 bit 5SDI/SDO
SCK
(CKP=0, CKE=0)
SCK
(CKP=0, CKE=1)
SCK
(CKP=1, CKE=1)
SPIIF
SSx
SCK
(CKP=1, CKE=0)
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Hình 16-5: Đồng bộ tín hiệu SPI SSx
Chú ý:
Trong quá trình truyền nhận dữ liệu không được thay đổi chế độ hoạt động (ghi dữ liệu vào thanh
ghi SPICON khi SPI đang truyền nhận dữ liệu).
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 106
17. 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
Khối I2C có thể hoạt động ở 2 chế độ tốc độ:
Standard mode (100kb/s): tần số xung clock tối thiểu là 1 MHz
Fast mode (400kb/s): tần số xung clock tối thiểu là 4 MHz
Hai chân tín hiệu sử dụng cho I2C:
SCL
SDA
17.1. Thanh ghi của I2C
Ngoại vi I2C có 6 thanh ghi tất cả. Chúng được dùng chung cho cả Master và Slave
17.1.1. I2CCON1
17.1.1.1. Chế độ Master
Bảng 17-1: Mô tả thanh ghi I2CCON1 ở chế độ Master
Tên Bit R/W Mô tả
I2CON [7] R/W Dùng để tắt/mở I2C (sử dụng
chung cho Master và Slave)
0: Tắt I2C
1: Mở I2C
CBI [6:4] R/W Bit cấu hình thời gian kiểm tra
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 107
Tên Bit R/W Mô tả
IDLE (xem 17.3.5 Định thời của
sự kiện Start)
Không sử dụng [3]
I2CMS [2] R/W Lựa chọn chế độ hoạt động của
I2C:
1: Master
0: Slave
ISSE [1] R/W Bit cho phép tạo ngắt khi tạo sự
kiện Start, Repeat Start, Stop:
1: cho phép
0: không cho phép
Không sử dụng [0]
17.1.1.2. Chế độ Slave
Bảng 17-2: Mô tả thanh ghi I2CCON1 ở chế độ Slave
Tên Bit R/W Mô tả
I2CON [7] R/W
Tắt/bật khối I2C (dùng chung cho Master và Slave)
0: tắt khối I2C
1: bật khối I2C
Không sử dụng [6:4] R Dùng cho chế độ Master
GCEN [3] R/W
Cho phép nhận general call
0: bỏ qua general call
1: nhận general call
I2CMS [2] R/W
Chế độ của khối I2C là Master hay Slave.
0: I2C slave
1: I2C master
ISSE [1] R/W
Cho phép ngắt với bit start và stop
0: không tạo ra ngắt
1: có tạo ra ngắt
AMOD [0] R/W Lựa chọn độ dài địa chỉ của Slave
0 = chế độ 7-bit địa chỉ
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 108
Tên Bit R/W Mô tả
1 = chế độ 10-bit địa chỉ
17.1.2. I2CCON2
17.1.2.1. Chế độ Master
Tên Bit R/W Mô tả
Không sử dụng [7]
ACKRX [6] R/W Bit ACK/NAK nhận được từ slave
0: ACK
1: NAK
ACKTX [5] ACK/NAK cần truyền đến slave
0: ACK
1: NAK
ACKEN [4] Bit cho phép truyền ACK/NAK
đến slave
1: cho phép
0: không cho phép
RCEN [3] R/W Bit cho phép nhận dữ liệu
1: cho phép
0: không cho phép
PEN [2] R/W Bit cho phép tạo sự kiện Stop:
1: cho phép
0: không cho phép
RSEN [1] R/W Bit cho phép tạo sự kiện Repeat
Start:
1: cho phép
0: không cho phép
SEN [0] R/W Bit cho phép tạo sự kiện Repeat
Start:
1: cho phép
0: không cho phép
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 109
17.1.2.2. Chế độ Slave
Tên Bit R/W Mô tả
CKS [7] R/W
Kéo dài tín hiệu SCL (chỉ chế độ Slave) (xem mục 17.5
Kéo dài xung clock)
0: Giữ SCL mức thấp (kéo dài SCL), dùng để
đảm bảo thời gian cài đặt dữ liệu
1: Thả nổi tín hiệu SCL
Không sử dụng [6] R Dùng cho chế độ Master
MSK [5:2] R/W
mặt nạ cho địa chỉ của Slave
0: không che các bit tương ứng trong thanh ghi
CNTL/ADDRL
1: che các bit tương ứng trong thanh ghi
CNTL/ADDRL
MSK [1] R/W
bit mặt nạ trọng số thấp nhất
Trong chế độ 7-bit địa chỉ:
0: không che bit địa chỉ 1 CNTL/ADDRL[1]
1: che bit địa chỉ 1 CNTL/ADDRL[1]
Trong chế độ 10-bit địa chỉ:
0: không che bit địa chỉ 0 và 1
CNTL/ADDRL[1:0]
1: che bit địa chỉ 0 và 1 CNTL/ADDRL[1:0]
SEN [0] R/W
cho phép kéo dài đường tín hiệu clock SCL
0: không cho phép
1: cho phép kéo dài xung clock SCL
17.1.3. I2CSTA
17.1.3.1. Chế độ Master
Tên Bit R/W Mô tả
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 110
Tên Bit R/W Mô tả
Không sử dụng [7]
P [6] R Bit cho biết quá trình tạo sự kiện
Stop hoàn thành. Tự động xóa khi
tắt I2C.
0: không tạo sự kiện Stop
1: hoàn thành sự kiện Stop
S [5] R Bit cho biết quá trình tạo sự kiện
Start hoặc Repeat Start hoàn thành.
Tự động xóa khi tắt I2C.
0: không tạo sự kiện Start
hoặc Repeat Start
1: hoàn thành sự kiện Start
hoặc Repeat Start
R/ W [4] R Bit cho biết có phải I2C đang trong
quá trình nhận hay không. Tự động
xóa khi tắt I2C.
0: không ở quá trình nhận
1: đang ở quá trình nhận
Bít dự trữ [3] R
I2COV [2] R/W Bit báo tràn bộ đệm. Tự động xóa
khi tắt I2C.
0: không tràn bộ đệm
1: tràn bộ đệm
Chú ý:
Chế độ truyền: không sử dụng
Chế độ nhận: Trước đó I2C đã
nhận 1 byte dữ liệu nhưng chưa
được đọc ra. Nếu I2C tiếp tục nhận
thêm 1 byte dữ liệu nữa, bộ đệm sẽ
bị tràn. Điều này sẽ làm cho bit
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 111
Tên Bit R/W Mô tả
I2COV bật lên 1 và giá trị bộ đệm
I2CBUF sẽ được giữ nguyên.
I2CWCOL [1] R/W Bit báo xung đột khi ghi vào bộ
đệm. Tự động xóa khi tắt I2C.
0: không xảy ra xung đột
1: có xảy ra xung đột
I2CBF [0] R Bit báo bộ đệm đang chứa dữ liệu
có nghĩa. Tự động xóa khi tắt I2C.
0: dữ liệu trong bộ đệm
không có nghĩa
1: dữ liệu trong bộ đệm có
nghĩa
17.1.3.2. Chế độ Slave
Tên Bit R/W Mô tả
AD / [7] R
Cho bit là nhận dữ liệu / địa chỉ
0: cho biết byte gửi hoặc nhận cuối là địa chỉ
1: cho biết byte gửi hoặc nhận cuối là dữ liệu
P [6] R
Bit Stop
0: bit Stop không nhận cuối cùng
1: bit Stop được nhận cuối cùng
S [5] R
Bit Start
0: bit Start không nhận cuối cùng
1: bit Start được nhận cuối cùng
WR / [4] R/W
Cho biết chiều nhận là đọc/ghi
0: ghi
1:đọc
Bit dữ trữ [3] Không thực hiện
Đọc ra bằng 0
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 112
Tên Bit R/W Mô tả
I2COV [2] R/W
Bộ đệm của I2C bị tràn
0: bộ đệm không tràn
1: một byte mới vừa nhận trong khi bộ đệm đã
đầy (giữ nguyên dữ liệu cũ)
I2CWCOL [1]
Ghi đến bộ đệm I2C bị xung đột
0 = không xung đột
1 = thanh ghi I2CBUF được ghi vào trong khi nó
đang phát nội dung trước đó đi (phải được xóa
bởi người sử dụng)
I2CBF [0]
Cờ bào đầy cho bộ đệm I2C
0: bộ đệm không đầy
1: khi nhận một byte và ghi tới bộ đệm (khối I2C
bật) thì bit này được gán lên 1. Bit này tự động
bị xóa khi phát xong một byte dữ liệu hoặc thực
hiện đọc đến thanh ghi bộ đệm (ICBUF).
17.1.4. CNTH/ADDRH và CNTL/ADDRL
Những thanh ghi này dùng chung cho chế độ Master và Slave
17.1.4.1. Chế độ Master
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
CNTH/ADDRH
bit 7 bit 0
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
CNTL/ADDRL
bit 7 bit 0
Tên Bit R/W Mô tả
CNTH [7:0] R/W Giá trị dùng để cấu hình thời gian
xung SCL ở mức cao
Tên Bit R/W Mô tả
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 113
Tên Bit R/W Mô tả
CNTL [7:0] R/W Giá trị dùng để cấu hình thời gian
xung SCL ở mức thấp
Người sử dụng ghi giá trị mong muốn vào hai thanh ghi này để cấu hình tốc độ Baud của I2C.
Chế độ Standard: (100Kb/s)
a. Thời gian tối thiểu xung SCL ở mức thấp = 4.7 us
b. Thời gian tối thiểu xung SCL ở mức cao = 4.0 us
Do đó, Giá trị nhỏ nhất của CNTL = 4.7us *(tần số xung clock)Mhz
Giá trị nhỏ nhất của CNTH = 4.0us * (tần số xung clock)Mhz
Ví dụ, tần số xung clock = 10 Mhz
Giá trị nhỏ nhất của CNTL = 4.7 * 10 = 47
Giá trị nhỏ nhất của CNTH = 4.0 * 10 = 40
Chế độ Fast: (400Kb/s)
c. Thời gian tối thiểu xung SCL ở mức thấp = 1.3 us
d. Thời gian tối thiểu xung SCL ở mức cao = 0.6 us
Do đó, Giá trị nhỏ nhất của CNTL = 1.3us *( tần số xung clock)Mhz
Giá trị nhỏ nhất của CNTH = 0.6us * (tần số xung clock)Mhz
Ví dụ, tần số xung clock = 10 Mhz
Giá trị nhỏ nhất của CNTL = 1.3 * 10 = 13
Giá trị nhỏ nhất của CNTH = 0.6 * 10 = 6
17.1.4.2. Chế độ Slave
Thanh ghi ADDRH là byte địa chỉ cao của slave I2C. Nó được dùng trong chế độ 10-bit địa chỉ.
Trong chế độ 7-bit địa chỉ thanh ghi này không cần quan tâm.
Thanh ghi ADDRL là byte địa chỉ thấp của slave I2C. Nội dung của nó được so sánh với byte địa
chỉ thấp nhận được từ master I2C.
17.1.5. I2CBUF
Tên Bit R/W Mô tả
I2CBUF [7:0] R/W Dùng chung cho cả Master và Slave
Địa chỉ / dữ liệu nhận/phát
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 114
Khi phát dữ liệu, người sử dụng phải ghi địa chỉ hoặc dữ liệu cần phát đến bus I2C. Sau khi ghi
đến thanh ghi I2CBUF (chỉ khi khối I2C bật), bộ đệm xem như đã đầy và bit I2CBF được gán lên
1.
Khi nhận dữ liệu, các bit dữ liệu trên đường tín hiệu SDA sẽ được dịch vào thanh ghi dịch theo
đúng trình tự. Đến khi việc nhận hoàn tất, dữ liệu từ thanh ghi dịch sẽ được cập nhật vào thanh
ghi I2CBUF. Tại thời điểm này, thanh ghi I2CBUF đang chứa một byte dữ liệu hợp và bit I2CBF
được gán lên 1. Một yêu cầu đọc đến thanh ghi I2CBUF sẽ xóa cờ I2CBF. Người sử dụng phải
đọc thanh ghi I2CBUF khi nó đầy, nếu không lần nhận byte dữ liệu tiếp sẽ gây ra tràn (cờ I2COV
được gán lên 1). Trong trường hợp này, dữ liệu nhận từ lần trước sẽ bị mất.
17.2. Hoạt động
Khối I2C được bật bằng cách gán bit I2CON lên 1 (I2CCON1[7]), và người sử dụng sẽ lập trình
giá trị thanh ghi I2CCON1 để cấu hình khối I2C:
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
Khi khối I2C được bật, các chân tín hiệu PORT4 và PORT5 sẽ được sử dụng là 2 chân SCL và
SDA của chuẩn bus I2C. Để đảm bảo khối hoạt động đúng, điện trở kéo lên phải được gắn vào
các chân SCL và SDA ở bên ngoài chip.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 115
SDA
SCL
Rp Rp điện trở kéo lên
+VDD
SCLK
SCLK1
OUT
SCLK
IN
DATA
DATA1
OUT
DATA
IN
SCLK
SCLK1
OUT
SCLK
IN
DATA
DATA1
OUT
DATA
IN
THIẾT BỊ 1 THIẾT BỊ 2
Hình 17-1: Kết nối các thiết bị đến bus I2C
17.3. Chế độ Master
Người dùng có thể cấu hình I2C ở chế độ Master bằng cách set các bit I2CON, I2CMS trong
thanh ghi I2CCON lên 1. Ngoài ra, người dùng còn có thể set hoặc xóa bit ISSE (I2CCON1[1])
để cho phép hoặc cấm ngắt khi tạo ra các bit start/restart và stop. Các sự kiện gây ra ngắt I2CIF
(IF2[3]) trong chế độ Master như sau:
Sự kiện Start (nếu cho phép)
Sự kiện Stop (nếu cho phép)
Sự kiện Repeat Start (nếu cho phép)
Khi truyền: sau khi nhận xong ACK/NAK
Khi nhận: sau khi nhận xong một byte dữ liệu
Trong chế độ Master, I2C có hai loại hoạt động là Master truyền và Master nhận:
17.3.1. Master Truyền
a) Truyền theo kiểu địa chỉ 7-bit
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 116
truyền từ master
truyền từ slave
S SLAVE ADDR R/W
‘0’-write
ACK DATA
7 bits
(n bytes + ack)
ACK/
NACKSLAVE ADDR
Sr ACK DATA
(n bytes + ack)
ACK/
NACK
P
LSBMSB
R/W
‘0’-write
Hình 17-2: Khung truyền với địa chỉ 7-bit ở chế độ Master truyền
Để cấu hình I2C hoạt động ở chế độ Master truyền với địa chỉ 7-bit, người sử dụng nên làm theo
các bước sau:
1. Tắt ngoại vi I2C bằng cách xóa bit I2CON
2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và
CNTL/ADDRL (xem 17.1.4 CNTH/ADDRH và CNTL/ADDRL).
3. Gán bit I2CMS lên 1 chọn chế độ I2C master
4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc)
5. Gán bit SEN để tạo sự kiện Start
6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị
1’b0 vào bit thấp nhất của thanh ghi I2CBUF.
Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ
được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ
tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX
(I2CCON2[6]).
7. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng phải nạp dữ liệu 8-bit vào
thanh ghi I2CBUF để truyền cho slave.
Sau khi toàn bộ dữ liệu trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa.
Và, I2C sẽ nhận ACK/NAK từ slave và lưu vào bit ACKRX (I2CCON2[6]).
8. Sau khi nhận xong ACK/NACK, cờ ngắt I2CIF sẽ bật lên 1. Người sử dụng có thể kiểm tra
xem bit vừa nhận là ACK (0) hay NAK (1) để lựa quyết định sẽ làm gì tiếp theo.
Nếu nhận được ACK, người sử dụng có thể thực hiện 1 trong 3 việc sau:
Tiếp tục quá trình truyền bằng cách ghi dữ liệu vào thanh ghi I2CBUF
Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.
Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.
Nếu nhận được NAK, người sử dụng có thể thực hiện 1 trong 2 việc sau:
Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.
Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 117
Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt
đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được.
Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép.
b) Truyền theo kiểu địa chỉ 10-bit
truyền từ master
truyền từ slave
S1st BYTE SLAVE
ADDRR/W
‘0’-write
ACK 2nd BYTE SLAVE ADDR ACK DATAACK/
NACK
DATA
(n bytes + ack)
ACK/
NACK
P
1 1 1 1 0 X X 0
Sr1st BYTE SLAVE
ADDR
1 1 1 1 0 X X
ACK
(n bytes + ack)
R/W
‘0’-write
2nd BYTE SLAVE ADDR ACK
Hình 17-3: Khung truyền với địa chỉ 10-bit ở chế độ Master truyền
Để cấu hình I2C hoạt động ở chế độ Master truyền với địa chỉ 10-bit, người sử dụng nên làm
theo các bước sau:
1. Tắt ngoại vi I2C bằng cách xóa bit I2CON
2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và
CNTL/ADDRL (xem 17.1.4 CNTH/ADDRH và CNTL/ADDRL).
3. Gán bit I2CMS lên 1 chọn chế độ I2C master
4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc)
5. Gán bit SEN để tạo sự kiện Start
6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị
1’b0 vào bit thấp nhất của thanh ghi I2CBUF.
Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ
được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ
tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX
(I2CCON2[6]).
7. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng phải nạp 8 bit địa chỉ thứ
còn lại vào thanh ghi I2CBUF để truyền cho slave.
Sau khi toàn bộ địa chỉ trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa.
Và, I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]).
8. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng nạp dữ liệu 8-bit vào
thanh ghi I2CBUF để truyền cho slave.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 118
Sau khi toàn bộ dữ liệu trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa.
Và, I2C sẽ nhận ACK/NAK từ slave và lưu vào bit ACKRX (I2CCON2[6]).
9. Sau khi nhận xong ACK/NACK, cờ ngắt I2CIF sẽ bật lên 1. Người sử dụng có thể kiểm tra
xem bit vừa nhận là ACK (0) hay NAK (1) để lựa quyết định sẽ làm gì tiếp theo.
Nếu nhận được ACK, người sử dụng có thể thực hiện 1 trong 3 việc sau:
Tiếp tục quá trình truyền bằng cách ghi dữ liệu vào thanh ghi I2CBUF
Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.
Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.
Nếu nhận được NAK, người sử dụng có thể thực hiện 1 trong 2 việc sau:
Khởi động lại quá trình truyền bằng cách gán bit RSEN lên 1.
Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.
Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt
đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được.
Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép.
17.3.2. Master Nhận
a) Nhận theo kiểu địa chỉ 7-bit
S SLAVE ADDR R/W
‘1’- read
ACK DATA
7 bits
(n bytes + ack)
ACK/
NACKSLAVE ADDR
Sr ACK DATA
(n bytes + ack)
ACK/
NACK
P
LSBMSB
R/W
‘1’-readtruyền từ master
truyền từ slave
Hình 17-4: Khung truyền với địa chỉ 7-bit ở chế độ Master nhận
Để cấu hình I2C hoạt động ở chế độ Master nhận với địa chỉ 7-bit, người sử dụng nên làm theo
các bước sau:
1. Tắt ngoại vi I2C bằng cách xóa bit I2CON
2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và
CNTL/ADDRL (xem 17.1.4 CNTH/ADDRH và CNTL/ADDRL)
3. Gán bit I2CMS lên 1 chọn chế độ I2C master
4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc)
5. Gán bit SEN để tạo sự kiện Start
6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị
1’b1 vào bit thấp nhất của thanh ghi I2CBUF.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 119
Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ
được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ
tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX
(I2CCON2[6]). Khi ACK đã nhận xong, cờ ngắt I2CIF sẽ bật lên và bước tiếp theo phải được
thực hiện. Nếu không nhận được ACK, người sử dụng có thể khởi động lại hoặc kết thúc quá
trình.
7. Gán bit RCEN bit (I2CCON2[3]) lên 1 để cho phép I2C nhận dữ liệu từ Slave (bước này có
thể thực hiện ngay sau bước 5 mà không cần đợi cờ I2CIF).
Khi 8-bit dữ liệu nhận từ slave đã có trong thanh ghi I2CBUF, cờ I2CBF tự động bật lên 1. Ngay
lúc này, cờ I2CIF cũng tự động bật lên và bit RCEN tự động bị xóa bằng phần cứng.
8. Khi cờ I2CIF bật lên, người sử dụng đọc thanh ghi I2CBUF để có được dữ liệu mong muốn.
Việc đọc này sẽ làm cho bit I2CBF xóa về 0.
9. Người sử dụng có thể gán hoặc xóa bit ACKTX để lựa chọn NAK hay là ACK sẽ được
truyền đi ở bước tiếp theo. Nếu bit ACKTX bằng 0, ACK sẽ được truyền đi. Ngược lại, I2C
sẽ truyền NAK.
10. Sau đó, người sử dụng gán bit ACKEN lên 1 để cho phép ACK/NAK đã lựa chọn ở bước 9
có thể truyền lên bus.
11. Tiếp theo, người sử dụng có thể thực hiện một trong các bước sau:
Nếu ACK được truyền đi, bước 7, 8, 9, 10, 11 có thể được thực hiện lại để tiếp tục quá trinh
nhận.
Nếu NAK được truyền đi, người sử dụng có thể làm những việc sau:
Khởi động lại quá trình bằng cách gán bit RSEN lên 1
Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.
Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới
sẽ bắt đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được.
Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho
phép.
b) Nhận theo kiểu địa chỉ 10-bit
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 120
truyền từ master
truyền từ slave
S1st BYTE SLAVE
ADDRR/W ACK 2nd BYTE SLAVE ADDR ACK DATA
ACK/
NACKP
1 1 1 1 0 X X ‘0’
Sr1st BYTE SLAVE
ADDR
1 1 1 1 0 X X
ACK
(n bytes + ack)
R/W
‘1’-read
‘1’
‘0’-write
Hình 17-5: Khung truyền với địa chỉ 10-bit ở chế độ Master nhận
Để cấu hình I2C hoạt động ở chế độ Master truyền với địa chỉ 10-bit, người sử dụng nên làm
theo các bước sau:
1. Tắt ngoại vi I2C bằng cách xóa bit I2CON
2. Cấu hình tốc độ Baud bằng cách ghi giá trị mong muốn vào các thanh CNTH/ADDRH và
CNTL/ADDRL (xem 17.1.4 CNTH/ADDRH và CNTL/ADDRL).
3. Gán bit I2CMS lên 1 chọn chế độ I2C master
4. Cho phép I2C hoạt động bằng cách gán bit I2CON (bước 3 và 4 có thể thực hiện cùng lúc)
5. Gán bit SEN để tạo sự kiện Start
6. Người sử dụng ghi byte địa chỉ đầu tiên của I2C Slave cần truyền vào các bit cao và giá trị
1’b0 vào bit thấp nhất của thanh ghi I2CBUF.
Sau khi thực hiện xong bước 6, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ
được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ
tự động xóa bằng phần cứng. Tiếp theo I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX
(I2CCON2[6]).
7. Khi I2C nhận xong ACK, cờ ngắt I2CIF sẽ bật lên. Người sử dụng phải nạp 8 bit địa chỉ thứ
còn lại vào thanh ghi I2CBUF để truyền cho slave.
Sau khi toàn bộ địa chỉ trong thanh ghi I2CBUF được truyền lên bus, bit I2CBF sẽ tự động xóa.
Và, I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX (I2CCON2[6]).
8. Sau khi đã nhận xong ACK, người sử dụng gán bit RSEN lên 1 để tạo sự kiện Repeat Start.
9. Đến khi cờ I2CIF bật lên, người sử dụng ghi byte địa chỉ đầu tiên của slave vào các bit cao và
giá trị 1 vào bit thấp nhất của thanh ghi I2CBUF.
Sau khi thực hiện xong bước 9, bit I2CBF sẽ bật lên. Giá trị vừa ghi vào thanh ghi I2CBUF sẽ
được truyền lên bus thông qua chân SDA. Khi toàn bộ 8 bit này được truyền xong, cờ I2CBF sẽ
tự động xóa bằng phần cứng. Tiếp theo, I2C sẽ nhận ACK từ slave và lưu vào bit ACKRX
(I2CCON2[6]).
10. Sau khi ACK đã nhận xong, cờ I2CIF bật lên, người sử dụng gán bit RCEN (I2CCON2[3])
để cho phép I2C nhận dữ liệu từ Slave.
Khi 8-bit dữ liệu nhận từ slave đã có trong thanh ghi I2CBUF, cờ I2CBF tự động bật lên 1. Ngay
lúc này, cờ I2CIF cũng tự động bật lên và bit RCEN tự động bị xóa bằng phần cứng.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 121
11. Khi cờ I2CIF bật lên, người sử dụng đọc thanh ghi I2CBUF để có được dữ liệu mong muốn.
Việc đọc này sẽ làm cho bit I2CBF xóa về 0.
12. Người sử dụng có thể gán hoặc xóa bit ACKTX để lựa chọn NAK hay là ACK sẽ được
truyền đi ở bước tiếp theo. Nếu bit ACKTX bằng 0, ACK sẽ được truyền đi. Ngược lại, I2C
sẽ truyền NAK.
13. Sau đó, người sử dụng gán bit ACKEN lên 1 để cho phép ACK/NAK đã lựa chọn ở bước 12
có thể truyền lên bus
14. Tiếp theo, người sử dụng có thể thực hiện một trong các bước sau:
Nếu ACK được truyền đi, bước 10, 11, 12, 13, 14 có thể được thực hiện lại để tiếp tục quá
trinh nhận.
Nếu NAK được truyền đi, người sử dụng có thể làm những việc sau:
Khởi động lại quá trình bằng cách gán bit RSEN lên 1
Kết thúc quá trình truyền bằng cách gán bit PEN lên 1.
Khi sự kiện Repeat Start xảy ra, bit S (I2CSTA[5]) sẽ bật lên 1, và quá trình truyền mới sẽ bắt
đầu. Quá trình mới này, có thể theo kiểu địa chỉ 7-bit hay 10-bit đều được.
Khi sự kiện Stop xảy ra, bit P (I2CSTA[6]). Cờ ngắt I2CIF sẽ bật lên 1 nếu được cho phép.
17.3.3. Đồng bộ clock
Mỗi master đều tạo một clock trên chân SCL riêng. Mặt khác, đường dữ liệu SDA chỉ có nghĩa
khi đường SCL ở mức cao. Do đó, đường clock cần phải được đồng bộ với nhau. Việc đồng bộ
clock thực hiện bằng cách wired-AND các đường SCL với nhau (xem Hình 17-6).
Hình 17-6: Đồng bộ clock
17.3.4. Phân xử
Một master chỉ có thể thực hiện quá trình truyền nhận khi bus rảnh. Tuy nhiên, hai hay nhiều
master có thể thực hiện sự kiện start cùng lúc. Khi đó, quá trình phân xử sẽ xảy ra trên đường
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 122
SDA trong lúc đường SCL ở mức cao. Tại thời điểm đó, nếu có một master truyền bit 1 và một
master khác truyền bit 0 thì master nào truyền bit 1 sẽ bị mất phân xử. Master nào bị mất phân xử
sẽ về trạng thái IDLE.
Hình 17-7: Phân xử
17.3.5. Định thời của sự kiện Start
Để tạo sự kiện Start, người sử dụng phải gán bit cho phép Start (SEN) lên 1. Khi cả hai SCL và
SDA cùng ở mức cao trong khoảng thời gian bằng N lần thời gian SCL ở mức thấp (L: low
period), sự kiện Start sẽ được thực hiện. Trong SG8V1, giá trị N có thể được cấu hình thông qua
các bit CBI[2:0] trong thanh I2CCON1.
CBI[2:0] N
0 1
1 2
2 4
3 6
4 8
5 10
6 12
7 14
Chú thích:
- Các bit này chỉ sử dụng trong hệ thống có nhiều master. Vì khi I2C bắt đầu hoạt động,
người sử dụng không biết được có một master nào khác đang truy xuất bus không.
Người sử dụng dùng các bit này để kéo dài thời gian kiểm tra IDLE trước khi thực
hiện sự kiện Start.
- Nếu hệ thống chỉ có một master, giá trị này nên là 0.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 123
Khi sự kiện Start được tạo xong, bit S sẽ bật lên 1 và bit SEN tự động xóa về 0. Việc ghi vào
thanh ghi I2CBUF sẽ làm cho cờ I2CBF bật lên. Khi đó, quá trình truyền sẽ bắt đầu.
Chú ý:
Để đảm bảo I2CBF bằng 0, người sử dụng nên xóa bit này trước khi tạo sự kiện Start. Nếu
không, sau khi quá trình Start hoàn thành, nội dung thanh ghi I2CBUF sẽ được truyền lên bus.
Khi đó, người sử dụng phải đảm bảo chắc rằng đây chính là nội dung cần truyền.
H
SCL
SDA
N*L
SDA=1
SCL=1
SEN=1L/2
H
1st bit
L
2nd bit
H : High period
L : Low period
S set bằng phần cưng
SEN xóa bằng phần cưng
I2CIF bật lên 1 nếu cho phép
Hình 17-8: Định thời của quá trình tạo sự kiện Start
17.3.6. Định thời của sự kiện Repeat Start
Để tạo sự kiện Repeat Start, người sử dụng phải gán bit RSEN lên 1. Sau khi hoàn thành, bit S sẽ
bật lên 1 và bit RSEN tự động xóa về 0. Tại thời điểm này, cờ I2CIF cũng sẽ bật lên nếu cho
phép.
Chú ý:
Trong hệ thống có nhiều master, nếu muốn tạo sự kiện Repeat Start, người sử dụng không
được ghi dữ liệu mới vào thanh ghi I2CBUF. Vì một dữ liệu có nghĩa tồn tại trong thanh ghi
này sẽ làm cho quá trình truyền tiếp tục diễn ra. Điều nay làm cho việc tạo Repeat Start
không thể thực hiện được.
Để đảm bảo I2CBF bằng 0, người sử dụng nên xóa bit này trước khi tạo sự kiện Repeat Start.
Nếu không, sau khi quá trình Repeat Start hoàn thành, nội dung thanh ghi I2CBUF sẽ được
truyền lên bus. Khi đó, người sử dụng phải đảm bảo chắc rằng đây chính là nội dung cần
truyền.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 124
H : High period
L : Low period
H
SDA
L
SCL=0
RSEN=1L/2
H
1st bit
L
2nd bit
L
SCL
S set bằng phần cưng
RSEN xóa bằng phần cưng
I2CIF bật lên 1 nếu cho phép
Hình 17-9: Định thời của quá trình tạo sự kiện Repeat Start
17.3.7. Định thời của sự kiện Stop
Để tạo sự kiện Stop, người sử dụng phải gán bit PEN lên 1. Sau khi hoàn thành, bit P sẽ bật lên 1
và bit PEN tự động xóa về 0. Tại thời điểm này, cờ I2CIF cũng sẽ bật lên. Sau khi tạo xong Stop,
bus sẽ vào trạng thái IDLE.
PEN=1
SDA
SCL
L H
P set bằng phần cưng
PEN xóa bằng phần cưng
I2CIF bật lên 1 nếu cho phép
Hình 17-10: Định thời của quá trình tạo sự kiện Stop
17.3.8. Xung đột bus
Khi xảy ra sự kiện xung đột bus. Cờ báo lỗi xung đột I2CBCIF sẽ bật lên 1.
a) Xung đột bus khi tạo Start
Trường hợp1: Thời gian SCL được giữ ở mức cao ít hơn thời gian qui định.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 125
H
SCL
SDA
1.5L
SDA=1
SCL=1
SEN=1
t<HH : High period
L : Low period
I2CBCIF bật lên 1……..
Hình 17-11: Xung độ bus khi tạo Start (1)
Trường hợp 2:
H
SCL
SDA
1.5L
SDA=1
SCL=1
SEN=1
H : High period
L : Low period
I2CBCIF bật lên 1
Hình 17-12: Xung độ bus khi tạo Start (2)
b) Xung đột bus khi tạo Repeat Start
Trường hợp 1:
SDA
SCL
I2CBCIF bật lên 1
L L H
H : High period
L : Low period
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 126
Hình 17-13: Xung độ bus khi tạo Repeat Start (1)
Trường hợp 2:
SDA
SCL
I2CBCIF bật lên 1
L L H
H : High period
L : Low period
Hình 17-14: Xung độ bus khi tạo Repeat Start (2)
Trường hợp 3:
SDA
SCL
I2CBCIF bật lên 1
L L H
H : High period
L : Low period
Hình 17-15: Xung độ bus khi tạo Repeat Start (3)
c) Xung độ bus khi tạo Stop
PEN=1
SDA
SCL
L H
I2CBCIF bật lên 1
Hình 17-16: Xung độ bus khi tạo Stop
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 127
d) Xung đột bus trong quá trình truyền nhận dữ liệu
Dữ liệu thay đổi khi SCL đang ở mức cao
SDA
SCL
Cờ I2CBCIF bật lên 1
Hình 17-17: Xung đột bus trong quá trình truyền nhận dữ liệu
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 128
17.4. Chế độ Slave
17.4.1. Định địa chỉ Slave
ĐỊA CHỈ SLAVE Bit 0 DIỄN TẢ
0000 000 0 Địa chỉ General call
0000 000 1 Dự trữ cho chuẩn bus khác
0000 001 X Dự trữ cho chuẩn bus khác
0000 010 X Dự trữ cho chuẩn bus khác
0000 011 X Dự trữ cho mục đích sau này
0000 1XX X Dự trữ cho chuẩn bus khác
1111 1XX X Dự trữ cho mục đích sau này
1111 0XX X Định địa chỉ Slave 10-bit
Người sử dụng không cấu hình các địa chỉ dự trữ trong bảng trên cho địa chỉ Slave. Các địa chỉ
này được dùng cho các mục đích riêng trong chuẩn bus I2C.
17.4.2. Mặt nạ địa chỉ
Khi một bit địa chỉ bị mặt nạ, slave I2C sẽ nhận từ 2 địa chỉ bất chấp giá trị của bit bị mặt nạ là
‘0’ hay ‘1’. Người sử dụng có thể cấu hình để mặt nạ hơn 1 bit để nhận từ nhiều địa chỉ hơn, giá
trị tối đa là 31 địa chỉ trong chế độ 7-bit địa chỉ và 63 địa chỉ trong chế độ 10-bit địa chỉ (xem Ví
dụ 17-1).
Slave I2C đối như nhau trong các trường hợp địa có hoặc không có mặt nạ. Trong trường hợp
này, người sử dụng phải kiểm tra nội dung của thanh ghi I2CBUF để biết được chính xác địa chỉ
nào đã nhận được.
Trong chế độ 7-bit, các bit mặt MSK[5:1] tương ứng với các bit trong thanh ghi CNTL/ADDRL.
Nếu tất cả các bit mặt đều được gán lên 1, địa chỉ nhận được từ master I2C chỉ bằng giá trị với 2
bit địa chỉ CNTL/ADDRL[7:6] thì tín hiệu báo đúng địa chỉ Slave sẽ được tạo ra.
Trong chế độ 10-bit địa chỉ, các bit mặt nạ MSK[5:2] tương ứng với các bit trong thanh ghi
CNTL/ADDRL. Bit MSK[1] sẽ mặt nạ cho cùng lúc cả 2 bit thấp của địa chỉ CNTL/ADDRL
[1:0]. Chú ý rằng, trong chế độ 10-bit, 2 bit cao của địa chỉ là 2 bit CNTH/ADDRH[1:0], nhưng
các bit mặt nạ địa chỉ không tác động các bit này, chúng chỉ tác động đến các bit địa chỉ thấp của
thanh ghi CNTL/ADDRL.
Chú ý
MSK[1] mặt nạ 2 bit địa chỉ thấp trong chế độ 10-bit địa chỉ.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 129
Hai bit địa chỉ cao không bị tác động bởi các bit mặt nạ địa chỉ.
Ví dụ 17-1: Mặt nạ địa chỉ
Địa chỉ 7-bit:
CNTL/ADDRL[6:0] = A0h (1010000) (CNTL/ADDRL[0] xem như là có giá trị ‘0’)
MSK[5:1] = 00111
Các địa chỉ có thể nhận được: A0h, A2h, A4h, A6h, A8h, AAh, ACh và AEh.
Địa chỉ 10-bit:
CNTL/ADDRL[7:0] = A0h (10100000) (2 bit địa chỉ được bỏ qua vì chúng không bị tác
động bởi các bit mặt nạ)
MSK[5:1] = 00111
Các địa chỉ có thể nhận được: A0h, A1h, A2h, A3h, A4h, A5h, A6h, A7h, A8h, A9h, AAh,
ABh, ACh, ADh, AEh and AFh.
17.4.3. Địa chỉ 7-bit
S SLAVE ADDR R/W
‘1’- read
ACK DATA
7 bits
(n bytes + ack)
ACK/
NACKSLAVE ADDR
Sr ACK DATA
(n bytes + ack)
ACK/
NACK
P
MSBLSB
R/W
‘0’-writecủa master
của slave
Hình 17-18: Địa chỉ 7-bit
17.4.3.1. Slave nhận chế độ 7-bit địa chỉ
Người sử dụng có thể cấu hình khối I2C hoạt động như một bộ nhận chế độ 7-bit địa chỉ thông
qua các bước sau:
1. Tắt khối I2C bằng cách ghi 0 tới bit I2CON
2. Xóa bit I2CMS để cấu hình khối như là Slave
3. Xóa bit AMOD = 0 để chọn chế độ 7-bit địa chỉ (ISSE = 1 để cho phép phát ngắt đối với các
bit Start hoặc Stop)
4. Ghi địa chỉ Slave tới thanh ghi CNTL/ADDRL
5. Gán bit I2CON =1 để bật khối I2C
Sau bước 5, Slave sẽ đợi Start bit để bắt đầu. Sau Start bit thì 8-bit địa chỉ sẽ được dịch vào từ
Master. Nếu địa chỉ này trùng với địa chỉ Slave trong thanh ghi ADDRL, Slave sẽ trả về ACK tự
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 130
động tại cạnh xuống thứ 8 để thông báo với Master rằng Slave đã được định địa chỉ. Đối với
Slave nhận, sau bước này thì bit I2CBF sẽ được gán lên 1.
Thêm vào đó, tại cạnh xuống thứ 9, bit I2CIF sẽ được gán lên 1. Đồng thời, nếu bit SEN = 1, bit
CKS sẽ tự động được xóa bởi phần cứng, đường tín hiệu SCL sẽ bị kéo xuống mức thấp (kéo dài
clock). Người sử dụng phải gán bit CKS = 1 lại trong chương trình ngắt để tiếp tục quá trình
truyền.
6. Sau khi byte dữ liệu đã nhận xong, người sử dụng phải đọc nội dung của thanh ghi I2CBUF
để xóa bit cờ I2CBF. Nếu không, khi byte tiếp theo được nhận, cờ tràn I2COV sẽ bật lên và
quá trình truyền sẽ bị kết thúc.
Sau bước này, ACK sẽ được tự động gửi đến Master. Sau đó, Slave I2C sẽ tiếp tục nhận một byte
dữ liệu mới. Nếu bit I2COV = 1, một NACK sẽ được gửi, Slave sẽ trở về trạng thái và chờ nhận
bit Stop từ Master.
17.4.3.2. Slave phát chế độ 7-bit địa chỉ
Người sử dụng có thể cấu hình khối I2C hoạt động như là một Slave phát chế độ 7-bit địa chỉ
thông qua các bước sau:
Các bước cấu hình từ 1 → 5 thì tương tự như là Slave nhận chế độ 7-bit địa chỉ.
Trong chế độ Slave phát 7-bit địa chỉ, sau bước 5, Slave sẽ đáp ứng tương tự như là Slave nhận.
Tuy nhiên, các điểm khác so với Slave nhận là:
Bit I2CBF không được gán 1
Bit CKS luôn luôn được xóa bởi phần cứng (không cần SEN=1 như Slave nhận), tín hiệu
SCL sẽ bị kéo xuống mức thấp (kéo dài clock). Người sử dụng phải luôn luôn gán CKS lên 1
trong chương trình ngắt để tiếp tục lần truyền hiện tại.
6. Một byte được ghi đến thanh ghi ICBUF để phát dữ liệu, mỗi bit sẽ được dịch ra ngoài thông
qua chân tín hiệu SDA. Người sử dụng phải gán bit CKS lên 1, điều này sẽ làm cho chân
SCL được thả nổi để có thể tạo ra xung clock, Slave khi nhận được xung clock từ Master sẽ
tiếp tục làm việc. Nếu VĐK không thể phục vụ việc ghi dữ liệu liên tục đến thì Slave sẽ bị
nằm trong trạng thái chờ được cung cấp dữ liệu.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 131
Sau bước 6, nếu Slave nhận ACK, nó sẽ tiếp tục dịch 8-bit dữ liệu trên bus I2C. Ngược lại,
nếu nhận một NACK, Slave sẽ đi vào trạng thái IDLE sau khi phát hiện được điều kiện Stop
trong trường hợp này.
17.4.4. Chế độ 10-bit địa chỉ
from master
from slave
S1st BYTE SLAVE
ADDRR/W
‘0’-write
ACK 2nd BYTE SLAVE ADDR ACK DATAACK/
NACK
DATA
(n bytes + ack)
ACK/
NACK
P
1 1 1 1 0 X X 0
Sr1st BYTE SLAVE
ADDR
1 1 1 1 0 X X
ACK
(n bytes + ack)
R/W
‘1’-read
Hình 17-19: Định địa chỉ chế độ 10 bit
17.4.4.1. Slave nhận chế độ 10-bit địa chỉ
Người sử dụng có thể cấu hình khối I2C làm việc như 1 Slave nhận 10-bit địa chỉ qua thông qua
các bước sau:
1. Tắt khối I2C bằng cách ghi 0 tới bit I2CON
2. Xóa bit I2CMS để cấu hình khối như là Slave
3. Gán bit AMOD = 1 để chọn chế độ 10-bit địa chỉ (ISSE = 1 để cho phép phát ngắt đối với các
bit Start hoặc Stop)
4. Ghi các bit cao của địa chỉ Slave vào thanh ghi CNTH/ADDRH
5. Ghi địa các bit thấp của địa chỉ Slave vào thanh ghi CNTL/ADDRL
6. Gán bit I2CON để bật khối I2C
7. Nhận byte cao và thấp của địa chỉ từ Master và nhận biết chiều truyền dữ liệu là 0 (bit 1 của
địa chỉ cao). Nếu địa chỉ đúng, các bit BF và IF được gán lên 1, thanh ghi I2CBUF được cập
nhật với giá trị của địa chỉ byte thấp.
Tương tự như chế độc Slave nhận 7-bit địa chỉ, nếu SEN bit được gán lên 1, bit CKS sẽ tự động
xóa bởi phần cứng, tín hiệu SCL sẽ bị giữ mức thấp (kéo dài xung clock). Người sử dụng phải
gán CKS trong chương trình phục vụ ngắt để tiếp tục lần truyền hiện tại.
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 132
8. Tại thời điểm này, trạng thái là nhận dữ liệu. Người sử dụng phải đọc thanh ghi I2CBUF để
xóa cờ đầy I2CBF sau khi Slave đã nhận xong 1 byte dữ liệu đầy đủ.
17.4.4.2. Slave phát chế độ 10-bit địa chỉ
Người sử dụng có thể cấu hình khối I2C hoạt động như Slave phát chế độ 10-bit địa chỉ bằng các
bước sau:
Các bước 1 → 7 thì giống như khi cấu hình Slave nhận chế độ 10-bit địa chỉ.
8. Bước này sẽ nhận điều kiện Repeated Start và byte địa chỉ từ Master và nhận biết chiều
truyền là 1 (bit thứ [1] = 1). Nếu địa chỉ trùng, cờ I2CIF sẽ được gán lên 1, nội dung của
thanh ghi I2CBUF sẽ được cập nhật với byte địa chỉ thấp.
Tương tự như Slave phát chế độ 7-bit địa chỉ:
Cờ I2CBF không được gán lên
Bit CKS thì luôn luôn được xóa bởi phần cứng, đường tín hiệu SCL sẽ bị kéo xuống mức
thấp (kéo dài xung clock). Người sử dụng phải luôn luôn gán CKS lên lại trong chương
trình ngắt tiếp tục truyền dữ liệu.
9. Trong chương trình ngắt, người sử dụng ghi tới thanh ghi I2CBUF để truyền dữ liệu đến
Master và xóa cờ I2CIF.
10. Sau khi phát xong byte dữ liệu, cờ I2CIF sẽ được gán 1, luồng chương trình sẽ tiếp tục lặp lại
việc phát dữ liệu cho đến khi phát hiện được điều kiện Stop từ Master.
17.5. Kéo dài xung clock
Trong chế độ Slave phát, tại cạnh xuống thứ 9 của xung clock SCL, bit CKS trong thanh ghi
I2CCON2 luôn luôn bị xóa để kéo tín hiệu SCL tại ngõ ra xuống mức thấp. Người sử dụng phải
gán bit này lên 1 lại trong chương trình ngắt trước khi có thể nhận được một dữ liệu mới.
Việc giữ chân tín hiệu SCL mức thấp sẽ giúp cho hệ thống có đủ thời gian để vào chương trình
phục vụ ngắt và đọc nội dung của thanh ghi I2CBUF trước khi Master bắt đầu một quá trình
truyền một dữ liệu khác.
Trong chế độ Slave nhận, nếu bit SEN trong thanh ghi I2CCON2 là 1, bit CKS sẽ bị xóa tại cạnh
xuống xung clock thứ 9 một cách tự động. Ngược lại, Slave tiếp tục nhận byte dữ liệu mới từ
Master (không có kéo SCL xuống mức thấp).
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 133
17.6. Địa chỉ General Call
Khối Slave I2C có thể đáp ứng tới địa chỉ General Call (tất cả các bit địa chỉ = 0) khi bit GCEN
trong thanh ghi I2CCON1 = 1. Nếu địa đúng là địa chỉ General Call, thanh ghi dịch sẽ truyền các
bit nhận được đến thanh ghi I2CBUF, vờ I2CBF (bit thứ [8]) sẽ được gán lên 1 và tại cạnh xuống
xung clock thứ 9 (sau bit ACK) cờ ngắt I2CIF sẽ được gán lên 1.
Nếu bit GCEN được gán lên 1 trong chế độ 10-bit địa chỉ, thì khi nhận được địa chỉ General Call,
byte địa chỉ thấp sẽ không cần thiết nữa, sau khi nhận địa chỉ thì Slave sẽ chuyển sang
truyền/nhận byte dữ liệu đầu tiên.
Đối với địa chỉ General Call thì chế độ 7-bit hay 10-bit địa chỉ thì hoạt động giống nhau.
17.7. Dạng sóng
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 134
17.7.1. Dạng sóng I2C Master phát (chế độ 7-bit hoặc 10-bit địa chỉ)
SC
L1
23
45
67
89
12
34
56
78
9
SD
A
ghi SE
N=
1
I2CIF
SE
N=
0,
S=
1ghi địa chỉ S
lave tới I2C
BU
F
I2CB
F
cờ I2C
IF xóa bở
i phần mềm
A7
A6
A5
A4
A3
A2
A1
R/W
=0
AC
K from
Slave
chân SC
L kéo xuống thấp trong khi CP
U
đáp ứng cho ngắt I2C
IF
địa chỉ Slave
Dữ
liệu hoặc byte địa chỉ 2 của chế độ 10 bit
cờ I2C
IF xóa bở
i phần mềm
ghi I2CB
UF
here
D7
D6
D5
D4
D3
D2
D1
D0
NA
CK
ghi PE
N=
1A
CK
RX
is cleared
cờ I2C
IF xóa bở
i
phần mềm
PE
N=
0,
S=
0,P=
1
SE
NS
PE
NP
Hình 17-20: Dạng sóng I2C Master phát
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 135
17.7.2. Dạng sóng I2C Master nhận (chế độ 7-bit địa chỉ)
SC
L1
23
45
67
89
12
34
56
78
9
SD
A
gh
i SE
N=
1
I2C
IF
SE
N=
0,
S=
1g
hi đ
ịa ch
ỉ Sla
ve tớ
i I2C
BU
F
I2C
BF
cờ I2
CIF
xóa
bở
i ph
ần
mề
m
R/W
=1
AC
K từ
Sla
ve
châ
n S
CL
kéo
xuố
ng
thấ
p tro
ng
khi C
PU
đá
p ứ
ng
cho
ng
ắt I2
CIF
Địa
chỉ S
lave
dữ
liệu
nh
ận
từ S
lave
cờ I2
CIF
xóa
bở
i ph
ần
mề
m
D7
D6
D5
D4
D3
D2
D1
D0
AC
K/
NA
CK
gh
i PE
N=
1 n
ếu
ng
ườ
i dù
ng
mu
ốn
ng
ừn
g tru
yền
dữ
liệu
AC
KR
X b
ị xóa
Cờ
I2C
IF xó
a b
ởi p
hầ
n m
ềm
PE
N=
0,
S=
0,P
=1
SE
N
S
PE
N
P
gh
i RC
EN
=1
gh
i xác n
hậ
n đ
ến
AC
KT
X (A
CK
chỉ là
ví dụ
),
sau
đó
gh
i AC
KE
N=
1
cờ I2
CB
F đ
ượ
c gá
n kh
i
mộ
t byte
nh
ận
xon
g
cờ I2
CB
F b
ị xóa
khi
đọ
c tha
nh
gh
i I2C
BU
F
kéo
châ
n S
CL
mứ
c thấ
p
A7
A6
A5
A4
A3
A2
A1
Hình 17-21: Dạng sóng I2C Master nhận
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 136
17.7.3. Dạng sóng I2C Slave nhận chế độ 7-bit địa chỉ
SC
L1
23
45
67
89
12
34
56
78
SD
A
I2C
IF
I2C
BF
A7
A6
A5
A4
A3
A2
A1
R/W
=0 ph
át A
CK
tới
ma
ster
Nh
ận
địa
chỉ
dữ
liệu
nh
ận
từ m
aste
r
cờ I2
CIF
xóa
bở
i ph
ần
mề
m
D7
D6
D5
D4
D3
D2
D1
D0
I2C
OV
tha
nh
gh
i I2C
BU
F đ
ượ
c
đọ
c
12
34
56
78
dữ
liệu
nh
ận
từ m
aste
r
D7
D6
D5
D4
D3
D2
D1
D0
99
ph
át A
CK
tới
ma
ster
ph
át N
AC
K tớ
i
ma
ster
PS
(CK
S d
oe
s no
t clea
r to ‘1
’ wh
en
SE
N =
0)
Hình 17-22: Dạng sóng I2C Slave nhận chế độ 7-bit địa chỉ
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 137
17.7.4. Dạng sóng I2C Slave phát chế độ 7-bit địa chỉ
SC
L1
23
45
67
89
12
34
56
78
SD
A
I2C
IF
I2C
BF
Nh
ận
địa
chỉ
dữ
liệu
ph
át đ
ến
ma
ster
I2C
IF đ
ượ
c xóa
bở
i ph
ần
mề
m
I2C
OV
tha
nh
gh
i I2C
BU
F đ
ượ
c gh
i bở
i
ph
ần
mề
m
CK
S
dữ
liệu
ph
át đ
ến
ma
ster
9
AC
K từ
ma
ster
NA
CK
từ m
aste
r
SE
N
Sch
ân
SC
L ké
o xu
ốn
g th
ấp
tron
g kh
i
CP
U đ
áp
ứn
g ch
o n
gắ
t I2C
IF
I2C
IF đ
ượ
c xóa
bở
i ph
ần
mề
m
tha
nh
gh
i I2C
BU
F đ
ượ
c gh
i bở
i
ph
ần
mề
m
CK
S đ
ượ
c gá
n b
ởi p
hầ
n m
ềm
CK
S đ
ượ
c gá
n b
ởi p
hầ
n m
ềm
A7
A6
A5
A4
A3
A2
A1
ph
át A
CK
tới
ma
ster
R/W
=1
12
34
56
78
9P
D7
D6
D5
D4
D3
D2
D1
D0
D7
D6
D5
D4
D3
D2
D1
D0
(SE
N b
it do
esn
’t care
in S
lave
-tran
smitte
r mo
de
)
Hình 17-23: Dạng sóng I2C Slave phát chế độ 7-bit địa chỉ
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 138
17.7.5. Dạng sóng I2C Slave nhận chế độ 10-bit địa chỉ
SC
L1
23
45
67
89
12
34
56
78
SD
A
I2C
IF
I2C
BF
11
11
0A
9A
8R
/W=
0
ph
át A
CK
tới
ma
ster
Nh
ận
byte
địa
chỉ đ
ầu
cờ I2
CIF
xóa
bở
i ph
ần
mề
m
CK
S
9
ph
át A
CK
tới
ma
ster
S
I2C
OV
Nh
ận
byte
địa
chỉ th
ứ h
ai
A7
A6
A5
A4
A3
A2
A1
A0
SC
Lg
iữ m
ức th
ấp
khi b
it SE
N =
1
12
34
56
78
dữ
liệu
nh
ận
từ m
aste
r
cờ I2
CIF
xóa
bở
i ph
ần
mề
m
D7
D6
D5
D4
D3
D2
D1
D0
tha
nh
gh
i I2C
BU
F đ
ượ
c đọ
c
12
34
56
78
dữ
liệu
nh
ận
từ m
aste
r
D7
D6
D5
D4
D3
D2
D1
D0
99
ph
át A
CK
tới
ma
ster
Np
há
t AC
K tớ
i
ma
ster
P
SC
Lg
iữ m
ức th
ấp
khi b
it SE
N =
1
CK
S đ
ượ
c gá
n b
ởi p
hầ
n m
ềm
CK
S đ
ượ
c xóa
tự đ
ộn
g tro
ng
ph
ần
cứn
g
CK
S đ
ượ
c gá
n b
ởi p
hầ
n m
ềm
CK
S đ
ượ
c xóa
tự đ
ộn
g tro
ng
ph
ần
cứn
g
Hình 17-24: Dạng sóng I2C Slave nhận chế độ 10-bit địa chỉ
I2C
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 139
17.7.6. Dạng sóng I2C Slave phát chế độ 10-bit địa chỉ
SC
L1
23
45
67
89
12
34
56
78
SD
A
I2C
IF
I2C
BF
11
11
0A
9A
8R
/W=
0 ph
át A
CK
tới
ma
ster
Nh
ận
byte
địa
chỉ đ
ầu
Nh
ận
byte
địa
chỉ th
ứ h
ai
A7
A6
A5
A4
A3
A2
A1
A0
CK
S
12
34
56
78
11
11
0A
9A
8
99
ph
át A
CK
tới
ma
ster
ph
át A
CK
tới m
aste
r
S
cờ I2
CIF
xóa
bở
i ph
ần
mề
m
R/W
=1
Đọ
c tha
nh
gh
i I2C
BU
F đ
ể xó
a cờ
I2C
BF
12
34
56
78
dữ
liệu
ph
át đ
ến
ma
ster
D7
D6
D5
D4
D3
D2
D1
D0
9
NA
CK
từ m
aste
r
P
I2C
IF đ
ượ
c xóa
bở
i ph
ần
mề
m
tha
nh
gh
i I2C
BU
F đ
ượ
c gh
i bở
i ph
ần
mề
m
SC
L h
eld
low
un
til CK
S is cle
are
d
CK
S đ
ượ
c gá
n b
ởi p
hầ
n m
ềm
CK
S đ
ượ
c xóa
tự đ
ộn
g tro
ng
ph
ần
cứn
g
Nh
ận
byte
địa
chỉ đ
ầu
Sr
Hình 17-25: Dạng sóng I2C Slave phát chế độ 10-bit địa chỉ
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 140
18. Ngoại vi UART
18.1. Tổng quan về ngoại vi UART
SG8V1 có ba ngoại vi UART cho các ứng dụng truyền nhận dữ liệu song công nối tiếp bất đồng
bộ. Cả ba ngoại vi UART đều có cấu trúc, cách cấu hình và hoạt động tương tự nhau. Chúng chỉ
khác nhau về địa chỉ các thanh ghi sử dụng và vị trí các chân tín hiệu trên chip.
Một khung dữ liệu được truyền/nhận bao gồm 10 hoặc 11 bit:
1 bit Start báo bắt đầu khung truyền
8-bit dữ liệu
1 bit Parity để kiểm tra lỗi dữ liệu nếu có
1 bit Stop báo kết thúc khung truyền
Chú ý:
Việc tính toán bit kiểm tra Parity không được hỗ trợ bởi phần cứng nhưng người sử dụng có thể
thiết lập bằng phần mềm trong quá trình sử dụng.
ba thành phần chính của ngoại vi UART là:
Bộ tạo tốc độ Baud (tốc độ truyền dữ liệu)
Bộ truyền bất đồng bộ
Bộ nhận bất đồng bộ
Bộ truyền
Bộ nhận
Bộ tạo tốc độ
Baud - BRG
tx
rx
Giao tiếp nội
Hình 18-1: Các thành phần chính của ngoại vi UART
18.2. Các thanh ghi liên quan đến ngoại vi UART
Mỗi UART có 5 thanh ghi riêng biệt là:
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 141
UxSTA: Thanh ghi trạng thái của ngoại vi UART thứ x
UxCON: Thanh ghi cấu hình hoạt động của ngoại vi UART thứ x
UxBRL: Thanh ghi thiết lập tốc độ Baud của ngoại vi UART thứ x
UxTXREG: Thanh ghi lưu dữ liệu truyền của ngoại vi UART thứ x
UxRXREG: Thanh ghi lưu dữ liệu nhận của ngoại vi UART thứ x
(với x là 1, 2 hoặc 3)
cùng với 3 thanh ghi ngắt dùng chung là
IE2: Thanh ghi cho phép các ngắt
IP2: Thanh ghi thiết lập ưu tiên ngắt
IF2: Thanh ghi trạng thái ngắt
18.2.1. Thanh ghi trạng thái của ngoại vi UART thứ x (UxSTA)
Tên Bit R/W Mô tả
UxON [7] R/W Bit bật/tắt UART thứ x
0 : Ngoại vi UART bị tắt
và không thể hoạt động
1 : Ngoại vi UART được
phép hoạt động.
Bit dự trữ [6] R Không sử dụng
Giá trị đọc ra là 0
UxTXEMP [5] R Bit báo trạng thái rỗng của bộ đệm
truyền
0 : Bộ truyền đang hoạt
động và thanh ghi lưu dữ
liệu truyền đang có dữ liệu
1 : Thanh ghi lưu dữ liệu
truyền đang rỗng và có thể
ghi dữ liệu mới
Bit dự trữ [4] R Không sử dụng
Giá trị đọc ra là 0
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 142
Tên Bit R/W Mô tả
UxTX9D [3] R/W Bit dữ liệu truyền thứ 9
Đây chính là Parity bit
RXFE [2] R Bit báo lỗi khung dữ liệu nhận
0 : Khung hiện tại không
bị lỗi
1 : Khung hiện tại bị lỗi.
Chú ý: Giá trị bit này có thể bị
thay đổi khi đọc thanh ghi
UxRXREG hoặc ngoại vi UART
nhận một khung dữ liệu mới.
RXOV [1] R Bit báo lỗi tràn bộ đệm nhận
0 : Không có lỗi tràn bộ
đệm nhận
1 : Lỗi tràn bộ đệm nhận
(có thể xóa bằng cách xóa
bit RXEN hoặc bit UxON)
UxRX9D [0] R Bit dữ liệu thứ 9 của khung dữ
liệu nhận hiện tại
Đấy chính là Parity bit.
18.2.2. Thanh ghi điều khiển của UART thứ x
Tên Bit R/W Mô tả
UxTXEN [7] R/W Bit cho phép bộ truyền hoạt động
0 : Tắt bộ truyền UART
1 : Bật bộ truyền UART
UxTX9EN [6] R/W Bit cho phép truyền khung dữ liệu
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 143
Tên Bit R/W Mô tả
9 bit (8-bit dữ liệu và 1 bit parity)
0 : Tắt chế độ truyền
khung dữ liệu 9 bit
1 : Bật chế độ truyền
khung dữ liệu 9 bit
UxRXEN [5] R/W Bit cho phép bộ nhận hoạt động
0 : Tắt bộ nhận UART
1 : Bật bộ nhận UART
UxRX9EN [4] R/W Bit cho phép nhận khung dữ liệu 9
bit (8-bit dữ liệu và 1 bit parity)
0 : Tắt chế độ nhận khung
dữ liệu 9 bit
1 : Bật chế độ nhận khung
dữ liệu 9 bit
UxBRH [3:0] R/W Các bit cao của giá trị thiết lập tốc
độ Baud.
Chú ý: Giá trị để tính tốc độ Baud
được lưu trong 12 bit bao gồm 4
bit UxBRH và 8-bit trong thanh
ghi UxBRL
18.2.3. Thanh ghi tốc độ baud của UART thứ x (UxBRL)
Tên Bit R/W Mô tả
UxBRL [7:0] R/W Các bit thấp của giá trị thiết lập
tốc độ Baud.
Chú ý: Giá trị để tính tốc độ Baud
được lưu trong 12 bit bao gồm 4
bit UxBRH và 8-bit trong thanh
ghi UxBRL
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 144
18.2.4. Thanh ghi lưu dữ liệu truyền của UART thứ x (UxTXREG)
Tên Bit R/W Mô tả
UxTXREG [7:0] R/W 8-bit dữ liệu của khung truyền
18.2.5. Thanh ghi lưu dữ liệu nhận của UART thứ x (UxRXREG)
Tên Bit R/W Mô tả
UxRXREG [7:0] R/W 8-bit dữ liệu của khung nhận
18.2.6. Thanh ghi cho phép ngắt thứ 2 (IE2)
Tên Bit R/W Mô tả
CCIE [7] R/W Dùng cho ngoại vi Timer1
SPIIE [6] R/W Dùng cho ngoại vi SPI
U3RCIE [5] R/W Bit cho phép ngắt nhận trên
UART 3
0 : Không cho phép ngắt
nhận trên UART 3
1 : cho phép ngắt nhận trên
UART 3
U3TXIE [4] R/W Bit cho phép ngắt truyền trên
UART 3
0 : Không cho phép ngắt
truyền trên UART 3
1 : Cho phép ngắt truyền
trên UART 3
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 145
Tên Bit R/W Mô tả
U2RCIE [3] R/W Bit cho phép ngắt nhận trên
UART 2
0 : Không cho phép ngắt
nhận trên UART 2
1 : cho phép ngắt nhận trên
UART 2
U2TXIE [2] R/W Bit cho phép ngắt truyền trên
UART 2
0 : Không cho phép ngắt
truyền trên UART 2
1 : Cho phép ngắt truyền
trên UART 2
U1RCIE [1] R/W Bit cho phép ngắt nhận trên
UART 1
0 : Không cho phép ngắt
nhận trên UART 1
1 : cho phép ngắt nhận trên
UART 1
U1TXIE [0] R/W Bit cho phép ngắt truyền trên
UART 1
0 : Không cho phép ngắt
truyền trên UART 1
1 : Cho phép ngắt truyền
trên UART 1
18.2.7. Thanh ghi thiết lập ưu tiên ngắt thứ 2 (IP2)
Tên Bit R/W Mô tả
CCIP [7] R/W Dùng cho ngoại vi Timer1
SPIIP [6] R/W Dùng cho ngoại vi SPI
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 146
Tên Bit R/W Mô tả
U3RCIP [5] R/W Bit thiết lập độ ưu tiên ngắt nhận
trên UART 3
0 : Độ ưu tiên thấp
1 : Độ ưu tiên cao
U3TXIP [4] R/W Bit thiết lập độ ưu tiên ngắt truyền
trên UART 3
0 : Độ ưu tiên thấp
1 : Độ ưu tiên cao
U2RCIP [3] R/W Bit thiết lập độ ưu tiên ngắt nhận
trên UART 2
0 : Độ ưu tiên thấp
1 : Độ ưu tiên cao
U2TXIP [2] R/W Bit thiết lập độ ưu tiên ngắt truyền
trên UART 2
0 : Độ ưu tiên thấp
1 : Độ ưu tiên cao
U1RCIP [1] R/W Bit thiết lập độ ưu tiên ngắt nhận
trên UART 1
0 : Độ ưu tiên thấp
1 : Độ ưu tiên cao
U1TXIP [0] R/W Bit thiết lập độ ưu tiên ngắt truyền
trên UART 1
0 : Độ ưu tiên thấp
1 : Độ ưu tiên cao
18.2.8. Thanh ghi trạng thái ngắt thứ 2 (IF2)
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 147
Tên Bit R/W Mô tả
CCIF [7] R Dùng cho ngoại vi Timer1
SPIIF [6] R Dùng cho ngoại vi SPI
U3RCIF [5] R Bit lưu cờ ngắt của UART3 khi
nhận dữ liệu
0: FIFO nhận của UART3
rỗng
1: FIFO nhận của UART3
có dữ liệu (tự động xóa
khi FIFO nhận của
UART3 rỗng)
U3TXIF [4] R Bit báo trạng thái ngắt truyền
UART 3
0 : Không có ngắt
1 : Có ngắt đang xảy ra
U2RCIF [3] R Bit lưu cờ ngắt của UART2 khi
nhận dữ liệu
0: FIFO nhận của UART2
rỗng
1: FIFO nhận của UART2
có dữ liệu (tự động xóa
khi FIFO nhận của
UART2 rỗng)
U2TXIF [2] R Bit báo trạng thái ngắt truyền
UART 2
0 : Không có ngắt
1 : Có ngắt đang xảy ra
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 148
Tên Bit R/W Mô tả
U1RCIF [1] R Bit lưu cờ ngắt của UART1 khi
nhận dữ liệu
0: FIFO nhận của UART1
rỗng
1: FIFO nhận của UART1
có dữ liệu (tự động xóa
khi FIFO nhận của
UART1 rỗng)
U1TXIF [0] R Bit báo trạng thái ngắt truyền
UART 1
0 : Không có ngắt
1 : Có ngắt đang xảy ra
18.2.9. Thanh ghi cấu hình chiều dữ liệu cho Port C (DIRC)
Tên Bit R/W Mô tả
DIRC [7:2] R/W Sử dụng cho các chức năng và
ngoại vi khác
DIRC [1] R/W Cấu hình chiều dữ liệu cho
PORTC[1]
0 : Ngõ vào dữ liệu thông
thường
1 : Ngõ ra dữ liệu hoặc
đường truyền dữ liệu nối
tiếp của UART 1
DIRC [0] R/W Cấu hình chiều dữ liệu cho
PORTC[0]
0 : Ngõ vào dữ liệu thông
thường hoặc đường nhận
dữ liệu nối tiếp của UART
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 149
Tên Bit R/W Mô tả
1
1 : Ngõ ra dữ liệu thông
thường
18.2.10. Thanh ghi cấu hình chiều dữ liệu cho Port B (DIRB)
Tên Bit R/W Mô tả
DIRB [7:4] R/W Sử dụng cho các chức năng
xuất/nhập dữ liệu và ngoại vi khác
DIRB [3] R/W Cấu hình chiều dữ liệu cho
PORTB[3]
0 : Ngõ vào dữ liệu thông
thường
1 : Ngõ ra dữ liệu hoặc
đường truyền dữ liệu nối
tiếp của UART 2
DIRB [2] R/W Cấu hình chiều dữ liệu cho
PORTB[2]
0 : Ngõ vào dữ liệu thông
thường hoặc đường nhận
dữ liệu nối tiếp của UART
2
1 : Ngõ ra dữ liệu thông
thường
DIRB [1] R/W Cấu hình chiều dữ liệu cho
PORTB[1]
0 : Ngõ vào dữ liệu thông
thường
1 : Ngõ ra dữ liệu hoặc
đường truyền dữ liệu nối
tiếp của UART 3
DIRB [0] R/W Cấu hình chiều dữ liệu cho
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 150
Tên Bit R/W Mô tả
PORTB[0]
0 : Ngõ vào dữ liệu thông
thường hoặc đường nhận
dữ liệu nối tiếp của UART
3
1 : Ngõ ra dữ liệu thông
thường
18.3. Bộ tạo tốc độ Baud (BRG)
Mỗi UART có một bộ tạo tốc độ Baud riêng. Mỗi bộ tạo tốc độ Baud sử dụng 12 bit (4 bit cuối
của thanh ghi UxCON và 8-bit của thanh ghi UxBRL) để thiết lập tốc độ Baud cho việc truyền và
nhận dữ liệu.
Chú ý:
BRG sử dụng 4 bit của thanh ghi UxCON và 8 của thanh ghi UxBRL.
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 151
18.3.1. Tính toán tốc độ Baud
18.3.1.1. Công thức tính
Tốc độ Baud được tính theo công thức sau:
)1(16
N
ff OSC
baud
Trong đó:
baudf : Tần số tốc độ Baud
OSCf : Tần số xung clock hệ thống
N: Giá trị được thiết lập trong 4 bit cuối trong thanh ghi UxCON (4 last bits) và thanh ghi
UxBRL
Với mỗi tốc độ Baud yêu cầu, chúng ta sẽ tính được một giá trị N tương ứng từ công thức trên
nhưng giá trị N này thường là số lẻ nên ta phải làm tròn đến giá trị gần nhất có thể để nạp vào 4
bit cuối thanh ghi UxCON và thanh ghi UxBRL. Như vậy, tốc độ Baud thực tế và tốc độ Baud
mong muốn có một sai số nhất định. Sai số này sẽ tạo nên tỷ lệ lỗi khi truyền bằng giao thức
UART. Để tính tỷ lệ lỗi, chúng ta sử dụng công thức sau:
Error = (Tốc độ Baud thực tế - Tốc độ Baud mong muốn)/Tốc độ Baud mong muốn
18.3.1.2. Ví dụ về tính tốc độ Baud
Giả sử rằng chip sử dụng tần số OSCf = 14 MHz; Tốc độ Baud mong muốn là 2400 bps.
Hệ số N tính trên lý thuyết:
583.3631162400
140000001
16
RateBaudDesired
fN OSC
Chọn giá trị nguyên gần nhất:
364int egerN
Giá trị nạp vào các bit UxBRH và UxBRL:
UxBRH = XXXX 0001 (Chỉ sử dụng 4 bit cuối của thanh ghi UxCON)
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 152
UxBRL = 0110 1100
Tốc độ Baud trên thực tế là:
2397)1364(16
14000000
)1(16 int
eger
OSCactual
N
ff
Tỷ lệ lỗi là:
%125.02400
|24002397|
Error
Tốc độ
baud
mong
muốn
Fosc = 4 MHz Fosc = 6 MHz Fosc = 8 MHz Fosc = 10 MHz
Tốc độ
thực tế Error
N
Tốc độ
thực tế Error
N
Tốc độ
thực tế Error
N
Tốc độ
thực tế Error
N
(Kbps) (Kbps) (%) (Kbps) (%) (Kbps) (%) (Kbps) (%)
0,30 0,30 0,00 832 0,30 0,00 1249 0,30 0 1666 0,3 0 2082
0,60 0,60 0,00 416 0,60 0,00 624 0,60 0 832 0,6 0 1041
1,20 1,20 0,00 207 1,20 0,00 312 1,20 0 416 1,2 0 520
2,40 2,40 0,00 103 2,40 0,00 155 2,40 0 207 2,4 0 259
4,80 4,81 0,21 51 4,81 0,21 77 4,81 0,21 103 4,81 0,21 129
9,60 9,62 0,21 25 9,62 0,21 38 9,62 0,21 51 9,62 0,21 64
14,40 14,71 2,15 16 14,42 0,14 25 14,29 0,76 34 14,53 0,9 42
19,20 19,23 0,16 12 18,75 2,34 19 19,23 0,16 25 18,94 1,35 32
28,80 27,78 3,54 8 28,85 0,17 12 29,41 2,12 16 28,41 1,35 21
38,40 35,71 7,01 6 37,50 2,34 9 38,46 0,16 12 39,06 1,72 15
56,00 62,50 11,61 3 53,57 4,34 6 55,56 0,79 8 56,82 1,46 10
57,60 62,50 8,51 3 53,57 7,00 6 55,56 3,54 8 56,82 1,35 10
115,20 125,00 8,51 1 125,00 8,51 2 125,00 8,51 3 125 8,51 4
128,00 125,00 2,34 1 125,00 2,34 2 125,00 2,34 3 125 2,34 4
Tốc độ baud mong muốn Fosc = 12 MHz Fosc = 12.288 MHz
Tốc độ thực tế Error N
Tốc độ thực tế Error N
(Kbps) (Kbps) (%) (Kbps) (%)
0,30 0,30 0,00 2499 0,30 0,00 2559
0,60 0,60 0,00 1249 0,60 0,00 1279
1,20 1,20 0,00 624 1,20 0,00 639
2,40 2,40 0,00 312 2,40 0,00 319
4,80 4,81 0,21 155 4,80 0,00 159
9,60 9,62 0,21 77 9,60 0,00 79
14,40 14,42 0,14 51 14,49 0,62 52
19,20 19,23 0,16 38 19,20 0,00 39
28,80 28,85 0,17 25 28,44 1,25 26
38,40 37,50 2,34 19 38,40 0,00 19
56,00 57,69 3,02 12 54,86 2,04 13
57,60 57,69 0,16 12 59,08 2,57 12
115,20 107,14 7,00 6 109,71 4,77 6
128,00 125,00 2,34 5 128,00 0,00 5
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 153
Tốc độ baud mong
muốn
Fosc = 13.56 MHz Fosc = 14 MHz Fosc = 14.318 MHz
Tốc độ thực
tế Error
N
Tốc độ thực
tế Error
N
Tốc độ thực
tế Error
N
(Kbps) (Kbps) (%) (Kbps) (%) (Kbps) (%)
0,30 0,30 0,00 2824 0,30 0,00 2916 0,30 0,00 2982
0,60 0,60 0,00 1412 0,60 0,00 1457 0,60 0,00 1490
1,20 1,20 0,00 705 1,20 0,00 728 1,20 0,00 745
2,40 2,40 0,00 352 2,40 0,00 364 2,40 0,00 372
4,80 4,79 0,21 176 4,81 0,21 181 4,81 0,21 185
9,60 9,63 0,31 87 9,62 0,21 90 9,62 0,21 92
14,40 14,36 0,28 58 14,34 0,42 60 14,43 0,21 61
19,20 19,26 0,31 43 19,02 0,94 45 19,04 0,83 46
28,80 29,22 1,46 28 29,17 1,28 29 28,87 0,24 30
38,40 38,52 0,31 21 38,04 0,94 22 38,91 1,33 22
56,00 56,50 0,89 14 54,69 2,34 15 55,93 0,13 15
57,60 56,50 1,91 14 58,33 1,27 14 55,93 2,90 15
115,20 121,07 5,10 6 109,38 5,05 7 111,86 2,90 7
128,00 121,07 5,41 6 125,00 2,34 6 127,84 0,12 6
Tốc độ
baud
mong
muốn
Fosc = 16 MHz Fosc = 18 MHz Fosc = 18.432 MHz Fosc = 20 MHz
Tốc độ
thực tế Error
N
Tốc độ
thực tế Error
N
Tốc độ
thực tế Error
N
Tốc độ
thực tế Error
N
(Kbps) (Kbps) (%) (Kbps) (%) (Kbps) (%) (Kbps) (%)
0,30 0,30 0,00 3332 0,30 0,00 3749 0,30 0 3839 - - -
0,60 0,60 0,00 1666 0,60 0,00 1874 0,60 0 1919 0,6 0 2082
1,20 1,20 0,00 832 1,20 0,00 937 1,20 0 959 1,2 0 1041
2,40 2,40 0,00 416 2,40 0,00 468 2,40 0 479 2,4 0 520
4,80 4,81 0,21 207 4,81 0,21 233 4,80 0 239 4,81 0,21 259
9,60 9,62 0,21 103 9,62 0,21 116 9,60 0 119 9,62 0,21 129
14,40 14,49 0,62 68 14,42 0,14 77 14,40 0 79 14,37 0,21 86
19,20 19,23 0,16 51 19,07 0,68 58 19,20 0 59 19,23 0,16 64
28,80 28,57 0,80 34 28,85 0,17 38 28,80 0 39 29,07 0,94 42
38,40 38,46 0,16 25 38,79 1,02 28 38,40 0 29 37,88 1,35 32
56,00 55,56 0,79 17 56,25 0,45 19 54,86 2,04 20 56,82 1,46 21
57,60 58,82 2,12 16 56,25 2,34 19 57,60 0 19 56,82 1,35 21
115,20 111,11 3,55 8 112,50 2,34 9 115,20 0 9 113,64 1,35 10
128,00 125,00 2,34 7 125,00 2,34 8 128,00 0 8 125 2,34 9
18.3.2. Xung lấy mẫu và xung dịch dữ liệu bên trong UART
BRG sẽ tạo ra xung dịch dữ liệu và xung lấy mẫu thích hợp dựa trên giá trị được thiết lập trong
các bit UxBRH và UxBRL. Hình 18-2 sẽ cho thấy sự khác biệt giữa xung lấy mẫu và xung dịch
dữ liệu trong mỗi UART
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 154
Fosc
Xung truyền
(xung dịch dữ liệu)
N + 1 chu
kỳ
Xung nhận
(Xung lấy mẫu dữ liệu)
16 chu kỳ của xung lấy mẫu
16x(N + 1) chu kỳ
Hình 18-2: Xung lấy mẫu dữ liệu và xung dịch dữ liệu tính theo hệ số N
Một số trường hợp đặc biệt được minh họa trong các hình sau đây:
16 cycles
Fosc
Reception clock
(Sampling clock)
Transmission clock
(Shifting clock)
Hình 18-3: Xung lấy mẫu dữ liệu và xung dịch dữ liệu với N = 0
16 sampling clock’s cycles
Fosc
Reception clock
(Sampling clock)
Transmission clock
(Shifting clock)
Hình 18-4: Xung lấy mẫu dữ liệu và xung dịch dữ liệu với N = 1
18.3.3. Lấy mẫu dữ liệu
UART lấy mẫu dữ liệu tại cạnh lên thứ 8 của xung lấy mẫu, xem Hình 18-5. Đặc biệt, khi cả hai
giá trị UxBRH và UxBRL bằng “0”, xung lấy mẫu luôn là “1” và dữ liệu sẽ lấy mẫu tại cạnh lên
thứ 8 tính theo xung clock hệ thống, xem Hình 18-6.
Xung clock nhận
(Xung clock lấy mẫu)
Dữ liệu ngõ vào
bit start 8 8 8
Start bitBit 0 Bit 1
bit start bit start
Hình 18-5: Lẫy mẫu dữ liệu với N ≠ 0
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 155
Dữ liệu nhận
Xung clock hệ thống
(Fosc)
Xung clock nhận
(Xung clock lấy mẫu)
8
Điểm lấy mẫu
16 chu kỳ xung clock hệ thống
Hình 18-6: Lấy mẫu dữ liệu với N = 0
18.3.4. Dịch dữ liệu
UART phát dữ liệu theo cạnh lên của xung dịch dữ liệu.
Xung truyền
(Xung dịch dữ liệu)
Start bitDữ liệu truyền Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Bit 8 (If any) Stop Bit
Parity Bit
Hình 18-7: Dịch dữ liệu
18.4. Bộ truyền UART
18.4.1. Cấu trúc bộ truyền UART
Các thành phần cơ bản của bộ truyền UART như sau:
Bit UxON (UxSTA [7]) dùng để cấu hình các chân PORTC [1]/TX1, PORTC [0]/RX1;
PORTB [3]/TX2, PORTB [2]/RX2 và PORTB [1]/TX3, PORTB [0]/RX3 cho ngoại vi
UART. Các bit DIRC [1], DIRC [0] và DIRB [3], DIRB [2] sử dụng đề xác định chiều dữ
liệu cho các chân của UART 1 và UART 2. UART 3 có hai chân độc lập nên không có bit
cấu hình chiều dữ liệu.
Sau khi UxON (UxSTA [7]) được thiết lập mức cao, thiết lập bit UxTXEN (UxCON [7])
để cho phép bộ truyền có thể hoạt động.
Thanh ghi dữ liệu truyền (UxTXREG) sử dụng để lưu dữ liệu muốn truyền. Thanh ghi
này có một bit cho biết trạng thái rỗng của thanh ghi. Khi bộ truyền đang hoạt động
(UxON = UxTXEN = 1), nếu ngắt được sử dụng, việc ghi vào thanh ghi UxTXREG sẽ
xóa cờ ngắt UxTXIF và cờ ngắt này sẽ tích cực mức cao khi dữ liệu trong thanh ghi
UxTXREG được truyền đi.
Để sử dụng ngắt truyền, bit UxTXIE phải được thiết lập mức cao. Bit UxTXIP sử dụng để
chọn mức ưu tiên của ngắt.
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 156
Thanh ghi dịch (TSRx) lấy dữ liệu truyền từ thanh ghi UxTXREG để dịch nối tiếp từng
bit dữ liệu ra ngoài. Thanh ghi dịch TSRx có một bit báo trạng thái hoạt động là
UxTXEMP để cho biết khi nào trong thanh ghi có dữ liệu.
Xung clock dịch dữ liệu được tạo từ bộ BRG để điều khiển tốc độ bit.
Hai bit UxTX9EN và UxTX9D sử dụng để thiết lập việc truyền bit kiểm tra Parity.
Chú ý:
Để kiểm tra giá trị truyền gần nhất, người sử dụng có thể đọc giá trị thanh ghi UxTXREG.
Cờ ngắt UxTXIF luôn bằng 0 khi một trong hai bit UxON và UxTXEN bằng 0. Khi cả hai bit
UxON và UxTXEN bằng 1, Cờ ngắt UxTXIF sẽ được thiết lập ngay. Giá trị reset của cờ UxTXIF
là 0.
Thanh ghi dịch TSRx là thanh ghi nội và người sử dụng không thể truy xuất trực tiếp thanh
ghi này.
UxTXREG
Start bit8 data bitParity bit
(UxSTA [4]) UxTX9D
(UxCON [6]) UxTX9EN
PORTC [1]/TX1
hoặc
PORTB [3]/TX2
hoặc
PORTB [1]/TX3
UxON
(UxSTA [7])
BRG
Xung clock
dịch dữ liệu
UxTXEN
(UxCON [7])
UxTXEMP
(UxSTA [5])
Bit trạng
thái
UxTXIE
(IE2 [0] or IE2 [2])
Ngắt
truyền
Bộ cấu hình
chân giao tiếp
Bộ ưu tiên
ngắt
UxTXIP
(IP2 [0] or IP2 [2])
Bit chỉ đọc
Thanh ghi dịch
UxTXEN
(UxCON [7])
UxTXIF
(IF2 [0] or IF2[2])
Bộ giám sát hoạt
động truyền dữ liệu
Hình 18-8: Minh họa cấu trúc cơ bản của bộ truyền UART
18.4.2. Cấu hình sử dụng bộ truyền của ngoại vi UART
Các bước thiết lập bộ truyền ngoại vi UART được liệt kê sau đây:
1. Bật ngoại vi UARTx:
Thiết lập bit UxON (UxSTA [7]) lên mức cao, mức 1.
2. Xác định chiều dữ liệu cho các chân truyền của ngoại vi UART (bước này chỉ dành cho ngoại
vi UART1 và UART2):
Thiết lập bit DIRC [1] để cấu hình chân PORTC [1]/TX1 là ngõ ra.
Thiết lập bit DIRB [3] để cấu hình chân PORTB [3]/TX2 là ngõ ra.
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 157
Thiết lập bit DIRB [1] để cấu hình chân PORTB [1]/TX3 là ngõ ra.
3. Cấu hình tốc độ Baud:
Dựa trên tốc độ Baud mong muốn để ghi giá trị thích hợp cho các bit UxBRH (UxCON
[3:0]) và UxBRL. Việc tính toán tốc độ Baud xem ở mục18.3.1.
4. Cho phép ngắt truyền (nếu muốn sử dụng ngắt):
Thiết lập bit cho phép ngắt UxTXIE
o UART 1 là bit U1TXIE (IE2 [0])
o UART 2 là bit U2TXIE (IE2 [2])
o UART 3 là bit U3TXIE (IE2 [4])
Thiết lập mức ưu tiên cho ngắt thông qua bit UxTXIP
o UART 1 là bit U1TXIP (IP2 [0])
o UART 2 là bit U2TXIP (IP2 [2])
o UART 3 là bit U3TXIP (IP2 [4])
5. Cho phép bộ truyền hoạt động
Sau khi cấu hình các thông số hoạt động thì bit UxTXEN (UxCON [7]) cần được tích cực
để cho phép bộ truyền có thể hoạt động.
6. Chọn chế độ truyền
Thiết lập bit UxTX9EN (UxCON [6]) nếu muốn truyền khung dữ liệu 9 bit (8-bit dữ liệu
và 1 bit Parity).
7. Truyền dữ liệu:
Ghi giá trị bit thứ 9 (bit kiểm tra Parity) của khung dữ liệu muốn truyền vào UxTX9D
(UxSTA [4]) nếu chế độ truyền 9 bit được cho phép ở bước 6.
Ghi dữ liệu muốn truyền vào thanh ghi UxTXREG.
Nếu muốn truyền nhiều khung dữ liệu thì phải sử dụng ngắt hoặc giám sát cờ ngắt và các bit
trạng thái như bước sau:
8. Kiểm tra cờ ngắt UxTXIF:
Giám sát cờ ngắt để đảm bảo rằng thanh ghi dữ liệu UxTXREG rỗng.
Nếu thanh ghi UxTXREG rỗng thì thực hiện lại bước thứ 7.
Chú ý:
Nếu TX1, TX2 hay TX3 được kết nối đến các linh kiện khác, phải thiết lập PORTC [1],
PORTB [3] hoặc PORTB [1] trước khi UARTx được bật.
Nếu sử dụng ngắt, bit UxTXIE phải được thiết lập trước khi bit UxTXEN tích cực.
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 158
Nếu truyền ở chế độ 9 bit, bit thứ 9 phải được ghi trước khi ghi 8-bit dữ liệu vào thanh ghi
UxTXREG.
Bit UxTXIF phải được kiểm tra để đảm bảo thanh ghi UxTXREG rỗng trước khi ghi dữ liệu
truyền mới. Nếu không, dữ liệu chưa được truyền trong thanh ghi UxTXREG sẽ bị ghi đè bởi
dữ liệu mới.
Xung clock truyền
(Xung clock dịch dữ liệu)
Start bitDữ liệu truyền
Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Bit 8 (nếu có) Stop Bit
Parity Bit
Ghi vào thanh ghi
dữ liệu truyền
Cờ ngắt UxTXIF
Bit trạng thái TXEMP
2 chu kỳ xung
clock hệ thống
Hình 18-9: Truyền một khung dữ liệu
Start bit Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Bit 8 (nếu có) Stop Bit
Parity Bit
2 chu kỳ xung
clock hệ thống
Start bit Bit 0 Bit 1
Nếu ghi vào thanh ghi truyền trong khoảng thời
gian này thì Dữ liệu 2 sẽ bị ghi đè bởi giá trị mới
Dữ liệu 1 Dữ liệu 2 Dữ liệu 3
Xung clock truyền
(Xung clock dịch dữ liệu)
Dữ liệu truyền
Ghi vào thanh ghi
dữ liệu truyền
Cờ ngắt UxTXIF
Bit trạng thái TXEMP
Hình 18-10: Truyền liên tục
18.5. Bộ nhận UART
18.5.1. Cấu trúc bộ nhận UART
Các thành phần cơ bản của bộ nhận UART như sau:
Bit UxON (UxSTA [7]) dùng để cấu hình các chân giao tiếp của ngoại vi UART như
PORTC [1]/TX1, PORTC [0]/RX1; PORTB [3]/TX2, PORT [2]/RX2 và PORTB
[1]/TX3, PORTB [0]/RX3.
Sau khi bit UxON (UxSTA [7]) được thiết lập mức cao (mức 1), Bit UxRXEN (UxCON
[5]) được thiết lập để cho phép bộ nhận có thể hoạt động.
Bộ lấy mẫu thực hiện lấy mẫu dữ liệu trên chân RXx với tốc độ lẫy mẫu được tính bởi bộ
BRG.
Thanh ghi dịch lưu dữ liệu tạm thời trong quá trinh lấy mẫu.
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 159
FIFO hai tầng. Sau khi một khung dữ liệu được nhận đầy đủ thì dữ liệu sẽ được chuyển
vào FIFO và bit UxRCIF được thiết lập mức cao. Tín hiệu ngắt sẽ tích cực nêu UxRCIE
(IE2 [1], IE2 [3] hay IE[5]) được thiết lập mức 1.
Thanh ghi dữ liệu nhận (UxRXREG) được kết nối trực tiếp đến hai tầng FIFO.
Chú ý:
Thanh ghi dịch là thanh ghi nội và không thể truy xuất trực tiếp.
Cờ UxRCIF chỉ bằng 0 khi FIFO không chứa bất kỳ dữ liệu nào.
Start bit8 data bitParity bit
PORTC [0]/RX1
or
PORTB [2]/RX2
or
PORTB [0]/RX3
UxON
(UxSTA [7])
UxRXEN
(UxCON [5])
Cấu hình chân
giao tiếpBộ lấy mẫu
BRG
Xung clock lấy
mẫu dữ liệu
Stop bit
8 bit dữ liệuUxRX9D
(UxSTA [0])
UxRXFE
(UxSTA [2])
Kiểm tra
lỗi
Thanh ghi dịch
UxRX9EN
(UxCON [4])
Tín hiệu ngắt
U1RCIE (IE2 [1])
U2RCIE (IE2 [3])
Bit trạng
thái
UxRXEN
(UxCON [5])
UxRCIF
Bộ ưu tiên
ngắt
U1RCIP (IP2 [1])
U2RCIP (IP2 [3])
UxRXOV
(UxSAT [1])
FIFO
Bit chỉ đọc
UxRXREG
Hình 18-11: Cấu trúc của UART nhận
18.5.2. Cấu hình sử dụng bộ nhận của ngoại vi UART
Các bước thiết lập bộ nhận ngoại vi UART được liệt kê sau đây:
1. Bật ngoại vi UARTx:
Thiết lập bit UxON (UxSTA [7]) lên mức cao, mức 1.
2. Xác định chiều dữ liệu cho các chân RXx (chỉ dành cho UART1 và UART2):
Xóa bit DIRC [0] để cấu hình chân PORTC [0]/RX1 là ngõ vào.
Xóa bit DIRB [2] để cấu hình chân PORTB [2]/RX2 là ngõ vào.
Xóa bit DIRB [0] để cấu hình chân PORTB [0]/RX3 là ngõ vào.
3. Cấu hình tốc độ Baud:
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 160
Dựa trên tốc độ Baud mong muốn để ghi giá trị thích hợp cho các bit UxBRH (UxCON
[3:0]) và UxBRL. Việc tính toán tốc độ Baud xem ở mục18.3.1.
4. Cho phép ngắt nhận nếu muốn sử dụng ngắt:
Thiết lập các bit UxRCIE (IE2[1], IE2[3] hay IE[5]) để bật/tắt ngắt.
Thiết lập độ ưu tiên ngắt thông qua các bit UxRCIP (IP2[1], IP2[3] hay IP[5]).
5. Cho phép bộ nhận hoạt động:
Thiết lập bit UxRXEN (UxCON [5]) để cho phép bộ nhận sẵn sàng hoạt động.
6. Chọn chế độ nhận khung dữ liệu 9 bit:
Thiết lập bit UxRX9EN (UxCON [4]) để chọn chế độ nhận 9 bit.
7. Nhận dữ liệu:
Kiểm tra cờ UxRCIF. Nếu cờ UxRCIF bằng 1 thì trong FIFO đang có dữ liệu, dữ liệu sẽ
được đọc theo thứ tự sau:
o Đọc thanh ghi UxSTA để lấy giá trị bit thứ 9 và xác định các lỗi như lỗi khung
hay lỗi tràn (overrun).
o Đọc thanh ghi dữ liệu UxRXREG để lấy 8-bit dữ liệu.
Chú ý:
Nếu thanh ghi UxRXREG được đọc trước khi đọc thanh ghi UxSTA thì giá trị của bit thông
báo lỗi khung và bit thứ 9 của khung dữ liệu được đọc sẽ bị mất.
Khi các khung dữ liệu được nhận liên tục.
18.5.2.1. Các cờ lỗi
Bộ nhận UART có hai cờ báo lỗi là cờ lỗi khung truyền UxRXFE và cờ lỗi tràn UxRXOV.
Cờ UxRXFE chỉ ra lỗi bit stop của khung truyền. Lỗi bit stop xảy ra khi bộ nhận lấy mẫu
được giá trị 0 thay vì 1 ở vị trí stop bit. Giá trị bit UxRXFE chỉ được cập nhật khi đọc
thanh ghi UxRXREG.
Cờ UxRXOV chỉ ra có ít nhất một khung dữ liệu bị mất trong quá trình nhận. Khi FIFO
nhận đã đầy mà bộ nhận vẫn tiếp tục nhận được khung dữ liệu mới trước khi thanh ghi
UxRXREG được đọc thì cờ UXRXOV được tích cực. Cờ này chỉ bị xóa khi xóa bit
UxRXEN (UxCON [5]).
Chú ý:
Cờ UxRXOV không thể bị xóa trực tiếp.
UART
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 161
Sta
rt
bit
Dữ
liệ
u đ
ượ
c n
hậ
nB
it 0
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
Bit 8
Sto
p
Bit
Nh
ận
ho
àn
th
iện
mộ
t kh
un
g d
ữ liệ
u
Cờ
RX
OV
Sta
rt
bit
Bit 0
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
Bit 8
Sto
p
Bit
Pa
rity
Bit
(nế
u c
ó)
Sta
rt
bit
Bit 0
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
Bit 8
Đọ
c th
an
h g
hi
UR
XR
EG
Sta
rt
bit
Bit 0
RX
EN
Cờ
UR
CIF
Pa
rity
Bit
(nế
u c
ó)
Pa
rity
Bit
(nế
u c
ó)
Sto
p
Bit
Hình 18-12: UART tiếp nhận
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 162
19. Ngoại vi ADC
Ngoại vi ADC thực hiện chuyển đổi tín hiệu tương tự thành tín hiệu số 8-bit. Ngoại vi có bốn
ngõ vào. Ngõ vào của điện áp tham khảo mức thấp sẽ luôn bằng 0. Ngõ vào dành cho điện áp
tham khảo mức cao sẽ hiệu chỉnh theo giá trị điện áp của chân VREF.
Ba thanh ghi liên quan đến ngoại vi ADC gồm:
Thanh ghi ADCON1 sử dụng để bặt/tắt ngoại vi ADC, lựa chọn kênh và thiết lập tần số
hoạt động của ADC.
Thanh ghi ADCON2 chứa một bit cho phép khởi động ADC và báo trạng thái hiện tại của
ADC.
Thanh ghi ADBUFF lưu giá trị của ADC sau khi chuyển đổi.
19.1. Cấu trúc cơ bản của ADC
Bộ chuyển đổi
ADC
Vref+
Vref-
VREF
Bộ tạo xung nhịp
cho ADC
Xung nhịp cấp
cho ADC
ADCK1 ADCK0
OSC1ADON
VAin
VIN1
VIN2
VIN3
VIN4
Điện áp ngõ vào
ADCH1
ADCH0
Hình 19-1: Sơ đồ khối ngoại vi ADC
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 163
Ngoại vi ADC có ba phần chính như sau.
Bộ tạo xung nhịp cho ADC: Tạo xung nhịp hoạt động cho ADC từ xung nhịp hệ thống.
Bộ chọn kênh ngõ vào
Bộ chuyển đổi ADC thực hiện chuyển đổi ngõ vào tương tự thành kết quả số 8-bit.
19.2. Các thanh ghi liên quan đến hoạt động của ADC
19.2.1. Thanh ghi điều khiển thứ 1 của ADC (ADCON1)
Tên Bit R/W Mô tả
ADON [7] R/W Bit bật/tắt ADC
0 : Bộ chuyển đổi ADC bị
tắt và không được cấp
xung nhịp hoạt động.
1 : Bộ chuyển đổi ADC
sẵn sàng hoạt động
Bit dự trữ [6:4] R Không sử dụng
Giá trị đọc ra là 0
ADCK [3:2] R/W Bit chọn tần số clock cấp cho bộ
ADC hoạt động
00 : Tần số xung clock cấp
cho ADC bằng tần số xung
clock hệ thống (fosc)
01 : Tần số xung clock cấp
cho ADC bằng một nửa
tần số xung clock hệ thống
(fosc/2)
10 : Tần số xung clock cấp
cho ADC bằng một nửa
tần số xung clock hệ thống
(fosc/4)
11 : Giá trị này không
được phép sử dụng
ADCH [1:0] R/W Bit chọn kênh ngõ vào cho ADC
00 : Kênh 0 (VIN1)
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 164
Tên Bit R/W Mô tả
01 : Kênh 1 (VIN2)
10 : Kênh 2 (VIN3)
11 : Kênh 3 (VIN4)
19.2.2. Thanh ghi điều khiển thứ 2 của ADC (ADCON2)
Tên Bit R/W Mô tả
Bit dự trữ [7:1] R Không sử dụng
Giá trị đọc ra là 0
START/BUSY [0] R/W Bit khởi động ADC và báo trạng
thái ADC. Xóa bit này xuống 0 để
khởi động một quá trình chuyển
đổi của ADC.
0 : Bộ ADC đang bận,
nghĩa là bộ ADC đang
trong quá trình thực hiện
một chuyển đổi.
1 : Bộ ADC sẵn sàng để
thực hiện một chuyển đổi
tín hiệu tương tự ở ngõ vào
thành một giá trị số 8-bit.
19.2.3. Thanh ghi lưu dữ liệu ADC (ADBUF)
Tên Bit R/W Mô tả
ADBUF [7:0] R Giá trị 8-bit của ADC sau mỗi lần
thực hiện chuyển đổi.
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 165
19.2.4. Thanh ghi cho phép ngắt số 3 (IE3)
Tên Bit R/W Mô tả
Bit dự trữ [7:3] R Không sử dụng
Giá trị đọc ra là 0
ADIE [2] R/W Bit cho phép ngắt ADC
0 : Không cho phép tạo
ngắt khi ADC hoạt động
1 : Cho phép tạo ngắt khi
ADC hoạt động
I2CBCIE [1] R/W Bit dành cho ngoại vi I2C
I2CIE [0] R/W Bit dành cho ngoại vi I2C
19.2.5. Thanh ghi ưu tiên ngắt số 3 (IP3)
Tên Bit R/W Mô tả
Bit dự trữ [7:3] R Không sử dụng
Giá trị đọc ra là 0
ADIP [2] R/W Bit xác lập ưu tiên ngắt cho ngoại
vi ADC
I2CBCIP [1] R/W Bit dành cho ngoại vi I2C
I2CIP [0] R/W Bit dành cho ngoại vi I2C
19.2.6. Thanh ghi trạng thái ngắt số 3 (IF3)
Tên Bit R/W Mô tả
Bit dự trữ [7:3] R Không sử dụng
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 166
Tên Bit R/W Mô tả
Giá trị đọc ra là 0
ADIF [2] R Bit báo trạng thái ngắt của ngoại
vi ADC
I2CBCIF [1] R Bit dành cho ngoại vi I2C
I2CIF [0] R Bit dành cho ngoại vi I2C
19.3. Hoạt động của ngoại vi ADC
Thứ tự cấu hình và hoạt động cơ bản của ADC như sau:
1. Cấu hình ngoại vi ADC
Thiết lập xung clock cho ADC hoạt động thông quan các bit ADCK, là bit thứ 4 và thứ 3
của thanh ghi ADCON1. Xung clock cấp cho ADC được tính dựa trên xung clock hệ
thống.
Chọn kênh ngõ vào cho ADC thông qua các bit ADCH, là bít thứ 2 và thứ 1 của thanh ghi
ADCON1.
Bật ngoại vi ADC thông qua bit ADON, là bit thứ 7 của thanh ghi ADCON1.
2. Cấu hình sử dụng ngắt cho ngoại vi ADC (đây là bước không bắt buộc)
Xóa bit ngắt ADIF, là bit thứ 2 của thanh ghi IF3.
Thiết lập bit cho phép ngắt ADIE, là bit thứ 2 của thanh ghi IE3.
Thiết lập bit ưu tiên ngắt ADIP, là bit thứ 2 của thanh ghi IP3.
3. Khởi động một quá trình chuyển đổi
Xóa bit START/BUSY, là bit thứ 0 của thanh ghi ADCON2.
4. Kiểm tra trạng thái hoạt động của ADC
Giám sát bit START/BUSY, là bit thứ 0 của thanh ghi ADCON2. Khi giá trị bit này là 1
thì ADC đã thực hiện xong quá trình chuyển đổi.
Chờ ngắt ADC.
5. Đọc thanh ghi dữ liệu ADBUFF và xóa cờ ngắt ADIF (nếu có sử dụng)
6. Thực hiện lần chuyển đổi tiếp theo
Nếu cần cấu hình lại thì quay lại bước thứ 1.
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 167
Nếu không cần cấu hình lại thì lặp lại từ bước thứ 3.
Xung clock cấp
cho bộ chuyển
đổi AD
START/BUSY
(ADCON2[0])
ADIF
(IF3[2] – nếu sử
dụng)
ADON
(ADCON1[7])
“1”
Xóa ngắt
ADC đang bận
Quá trinh chuyển
đổi hoàn tất
Tín hiệu bị xóa bởi
người dùng lập trình
Hình 19-2: Giản đồ thời gian cho hoạt động của ADC
Chú ý:
1. Sau khi bit ADON được thiết lập, phải chờ ít nhất 2 chu kỳ clock ADC trước khi xóa bit
START/BUSY (ADCON2[0]) để bắt đầu lần chuyển đổi đầu tiên, (xem 19.2.2 Thanh ghi điều
khiển thứ 2 của ADC (ADCON2)).
2. Quá trình chuyển đổi sẽ được bắt đầu lại nếu xóa bit START/BUSY trong khi ADC đang bận
(START/BUSY đang bằng 0).
fosc
2 Tadc
1 Tadc
ADC Clock
START/BUSY
(ADCON2[0])
ADON
(ADCON1[7])
Sau khi bit ADON tích cực, lần
hoạt động đầu tiên phải chờ ít
nhất sau 2 chu kỳ xung clock ADC
Hình 19-3: Lần chuyển đổi đầu tiên sau khi bit ADON (ADCON1[7]) được tích cực
19.4. Các chú ý khi sử dụng ngoại vi ADC
19.4.1. Nguồn xung clock cấp cho ngoại vi ADC
Tần số xung clock cấp cho ngoại vi ADC hoạt động được cấu hình thông qua các bit ADCK
(ADCON1[4:3]). Ở đây, ngoại vi ADC được hỗ trợ ba mức cấu hình là:
Fosc: Tần số clock cấp cho ADC bằng tần số clock hệ thống
Fosc/2: Tần số clock cấp cho ADC bằng một nửa tần số clock hệ thống
Fosc/4: Tần số clock cấp cho ADC bằng một phần bốn tần số clock hệ thống
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 168
Để bộ chuyển đổi ADC hoạt động chính xác thì tần số xung clock cấp cho bộ chuyển đổi ADC
phải nhỏ hơn hoặc bằng 4MHz.
Bảng 19-1. Một số giá trị cấu hình tham khảo cho xung clock ngoại vi ADC
Tần số xung clock hệ thống ADCK[1:0] Tần số xung clock ADC
4MHz 00
01
10
FADC = Fosc = 4 MHz
FADC = Fosc/2 = 2 MHz
FADC = Fosc/4 = 1 MHz
5MHz 01
10
FADC = Fosc/2 = 2.5 MHz
FADC = Fosc/4 = 1.25 MHz
10 MHz 10 FADC = Fosc/4 = 2.5 MHz
12 MHz 10 FADC = Fosc/4 = 3 MHz
13MHz 10 FADC = Fosc/4 = 3.25 MHz
Chú ý:
Nếu cả hai bit ADCK được thiết lập là 1 thì tần số xung nhịp cấp cho ADC là Fosc/4.
19.4.2. Các yêu cầu về thông số và kết nối
Ngoại vi ADC trong vi điều khiển SG8V1 có các thông số cần chú ý như sau:
Sử dụng nguồn cấp đơn VDD = 3.3V ±10%
Độ phân giải 8-bit
Sai số khoảng ±1LSB
Tần số hoạt động lớn nhất 4MHz
Thời gian chuyển đổi lớn nhất là 2.25uS và nhỏ nhất 2uS
Sử dùng điền áp chuẩn VREF ngoài có giá trị lớn nhất bằng VDD
Ngõ vào VIN1 VIN2 VIN3 VIN4 đơn với dãy điện áp có thể được lấy mẫu từ 0 tới VREF
Tần số tín hiệu ngõ vào lớn nhất 10Khz và với điện trở nguồn lớn nhất Rs = 2KΩ
Không cần thời gian chờ khi chuyển đổi giữa các kênh
ADC
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 169
Công thức chuyển đổi của ADC là:
256Dout vin
Vref
Mô hình ngõ vào kết nối đến các chân VIN1, VIN2, VIN3 hoặc VIN4 như sau:
AVDD
Rs
AGND
Chold = 5.32pF
D1
D2
Sampling
Switch
Cin =
2.15pFvin
PIN
Hình 19-4: Mô hình ngõ vào của ADC
Bộ nhớ chương trình Flash
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 170
20. Bộ điều khiển truy xuất Flash
SG8V1 hỗ trợ chức năng truy xuất bộ nhớ chương trình trong khi chip đang hoạt động. Để thực
hiện chức năng này, trước hết người sử dụng phải bật bit FAEN lên 1 để cho phép bộ điều khiển
truy xuất flash hoạt động. Sau đó, lệnh MRF hoặc MFR dùng chuyển dữ liệu từ RAM sang Flash
và ngược lại. Mỗi lần thực hiện xong các lệnh này thì bit FAEN sẽ tự động xóa. Do đó, để thực
hiện lại các lệnh này, người sử dụng phải bật bit FAEN lên lần nữa.
20.1. Thanh ghi điều khiển truy xuất Flash
Tên Bit R/W Mô tả
Bit dự trữ [7:3] R Không sử dụng
Giá trị đọc ra là 0
FDM [2] R/W Flash Data Memory Access: Bit
lựa chọn truy xuất flash data
memory hay flash program
memory:
0: Truy xuất flash program
memory
1: truy xuất flash data
memory
PAGE [1] R/W Bit lựa chọn truy xuất flash mỗi
lần 1 word (16 bit) hay 1 trang (64
lệnh):
0: Truy xuất 1 word
1: truy xuất 1 trang
FAEN [0] R/W Flash Access Enable: Bit cho phép
bộ điều khiển truy xuất flash hoạt
động. Bit này chỉ được phép set
lên ‘1’ và tự động xóa bằng phần
cứng.
0 : Không cho phép
1 : Cho phép
Bộ nhớ chương trình Flash
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 171
Tên Bit R/W Mô tả
20.1.1. Thanh ghi trọng số cao của Flash Pointer (FPTH)
Tên Bit R/W Mô tả
FPTH [7:0] R/W Thanh ghi trọng số cao của Flash
Pointer
20.1.2. Thanh ghi trọng số thấp của Flash Pointer (FPTH)
Tên Bit R/W Mô tả
FPTL [7:0] R/W Thanh ghi trọng số thấp của Flash
Pointer
20.2. Hoạt động của bộ điều khiển truy xuất flash
20.2.1. Truy xuất Flash Program Memory
20.2.1.1. Truy xuất Flash Program Memory theo trang
Muốn truy xuất Flash Program Memory theo trang, ngưởi sử dụng phải thực hiện như sau:
1. Xóa bit FDM về 0, Set bit PAGE và FAEN trong thanh ghi FLASH_CTRL lên 1
2. Sử dụng lệnh MFR để chuyển dữ liệu từ flash sang RAM hoặc MRF để chuyển dữ liệu từ
RAM sang flash.
Trong đó,
- Địa chỉ đầu tiên của flash được xác định bởi thanh ghi FPTH (địa chỉ cao) và thanh ghi
FPTL (địa chỉ thấp). Khi truy xuất byte địa chỉ flash phải là địa chỉ đầu trang (6 bit thấp của địa
chỉ flash phải bằng 0). Nếu người sử dụng lập trình 6 bit thấp của địa chỉ flash khác 0, bộ điều
khiển flash sẽ tự động bỏ qua. Khi đó chương trình hệ thống có thể hoạt động sai.
- Giá trị của các bit ‘bse’ và ‘rrrrrrrr’ trong lệnh MRF và MFR dùng xác định địa chỉ đầu của
vùng RAM. Nếu ‘bse’ = 0, một địa chỉ được xác định bằng 00rrrrrrrrb. Ngược lại, địa chỉ này
được xác định bằng thanh ghi BS và 8 bit rrrrrrrr. Giá trị này tạm gọi là “địa chỉ được gán trong
lệnh”. SG8V1 sử dụng “địa chỉ được gán trong lệnh” để quyết định địa chỉ đầu thực sự của vùng
RAM cần sử dụng. Có 2 cách định địa chỉ: trực tiếp và gián tiếp.
Bộ nhớ chương trình Flash
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 172
Định địa chỉ trực tiếp: “địa chỉ được gán trong lệnh” không trỏ đến các thanh ghi IDA0,
IDA1, IDAOFF0, IDAOFF1, IDAINC0, IDAINC1, INCIDA0, INCIDA1, IDADEC0,
IDADEC1, DECIDA0 hay DECIDA1. Khi đó, địa chỉ này cũng chính là địa chỉ đầu của
vùng RAM cần sử dụng. Địa chỉ này nên lớn hơn 0x5D, nếu không chương trình có thể
bị sai ngoài ý muốn.
Định địa chỉ gián tiếp: “địa chỉ được gán trong lệnh” trỏ đến một trong các thanh ghi
IDA0, IDA1, IDAOFF0, IDAOFF1, IDAINC0, IDAINC1, INCIDA0, INCIDA1,
IDADEC0, IDADEC1, DECIDA0 hay DECIDA1. Khi đó, địa chỉ đầu của vùng RAM
cần sử dụng được xác định tùy thuộc vào “địa chỉ được gán trong lệnh” trỏ đến thanh ghi
nào trong các thanh ghi trên (xem 7.2.5.3 Định địa chỉ gián tiếp qua con trỏ). Lưu ý, địa
chỉ vùng RAM thực sự được sử dụng phải lớn hơn 0x5D, nếu không chương trình có thể
bị sai ngoài ý muốn.
FPTH
FPTL
(high)
(low)
Flash controller
FLASH
RAM
BS/0
rrrr_rrrr
(high)
(low)
15 8 7 0
7 00x0000
0x3FFF
0x0000
0xFFFF
Low byteHigh byte
Low byte
High byte
A
A
A+1
B
B
B+1
RAM address
Truy xuất trực tiếp (Direct Access)
Truy xuất gián tiếp (Indirect Access)
DPH0, DPL0
DPH1, DPL1
(+offset (nếu có))
Hình 20-1: Quá trình truy xuất flash
20.2.1.2. Truy xuất Flash Program Memory theo từng word
Muốn truy xuất Flash Program Memory theo trang, ngưởi sử dụng phải thực hiện như sau:
1. Xóa bit FDM và PAGE về 0, set bit FAEN lên 1
2. Sử dụng lệnh MFR để chuyển dữ liệu từ flash sang RAM hoặc MRF để chuyển dữ liệu từ
RAM sang flash.
Trong đó,
Bộ nhớ chương trình Flash
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 173
- Địa chỉ đầu tiên của flash được xác định bởi thanh ghi FPTH (địa chỉ cao) và FPTL (địa chỉ
thấp). Trong trường hợp này, địa chỉ flash là tùy ý.
- Địa chỉ đầu của RAM cần sử dụng được xác định tương tự như truy xuất theo trang.
20.2.2. Truy xuất Flash Data Memory
Quá trình truy xuất Flash Data Memory tương tự như truy xuất Flash Program Memory. Tuy
nhiên, một số điểm cần lưu ý như sau:
1. Bit FDM phải set lên 1 thay vì xóa về 0
2. Địa chỉ truy xuất Flash Data Memory chỉ sử dụng 11 bit thấp. Do đó, 7 bit trọng số cao của
thanh ghi FPTH sẽ không được sử dụng trong trường hợp này (người dùng nên xóa chúng về
0).
3. Flash Data Memory có tầm địa chỉ từ 0x000 đến 0x5FF. Nếu địa chỉ truy xuất Flash Data
Memory vượt quá địa chỉ cho phép (tức từ 0x600 đến 7FF) thì SG8V1 sẽ thực hiện truy xuất
(đọc/ghi) vào vùng Flash Data Memory có địa chỉ tương ứng từ 0x000 đến 0x1FF. Do đó,
người dùng nên tránh trường hợp này để không bị mất dữ liệu ngoài ý muốn.
Bộ nhớ chương trình Flash
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 174
21. Bộ nhớ chương trình FLASH
SG8V1 có một bộ nhớ chương trình FLASH bên trong chip. Chương trình cho SG8V1 sẽ được
nạp qua cổng nối tiếp gần giống với chuẩn SPI. Sử dụng 4 đường kết nối.
Ngõ ra nối tiếp (SPDATAO) – PortB[7] /SDO
Ngõ vào nối tiếp (SPDATAI) – PortB[6] /SDI
Clock nối tiếp (SPCLK) – PortB[5] /SCK
Lựa chọn chế độ nạp chương trình (SPCS)
o SPCS = 1: chế độ nạp chương trình
o SPCS = 0: chế độ hoạt động bình thường
Bộ nhớ chương trình của SG8V1 là 64Kx16, có hỗ trợ chế độ bảo vệ chương trình bên trong
FLASH. Khi chương trình được nạp vào trong SG8V1 cùng với chế độ bảo vệ thì chương trình
đó sẽ không được phép đọc ra trở lại. Khi chương trình đã được bảo vệ thì bộ nhớ FLASH phải
được xóa toàn bộ trước lúc nạp chương trình mới vào FLASH.
R
C
/RST
SPCLK
SPDATAO
SPDATAI
SPCS
VDD = 3.3 v
GND
OSC1
spcs
portb[7]
portb[6]
portb[5]
VDD = 3.3 vSG8V1ADAPTER
USB
UART
Chương trình
trên máy tính
PC
R
VDD
GND
Hình21-1: Sơ đồ kết nối bộ nạp
21.1. Phân vùng FLASH
FLASH có 2 vùng:
Vùng chứa chương trình: 64Kx16.
Vùng chứa thông tin người sử dụng: 2Kx16.
Vùng thông tin người sử dụng, adapter có thể đọc bình thường kể cả trong chế độ bảo vệ.
Bộ nhớ chương trình Flash
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 175
Mô tả cấu hình hoạt động của SG8V1:
/RST: SPCS: 0x: SG8V1 bị reset.
10: Chế độ hoạt động bình thường.
11: Chế độ nạp chương trình
Bên trong SG8V1 còn có một ô nhớ chứa ID của SG8V1. Giá trị của ID là 0xCC01
21.2. Chế độ bảo vệ chương trình
Adapter có thể gửi lệnh để yêu cầu bảo vệ chương trình trong FLASH.
Trong chế độ bảo vệ chương trình, adapter không thể đọc chương trình từ FLASH, mà chỉ có thể
đọc dữ liệu từ vùng chứa thông tin. Để nạp lại chương trình thì adapter phải gửi lệnh để yêu cầu
xóa toàn bộ FLASH. Sau khi xóa toàn bộ FLASH thì dữ liệu trong các ô nhớ FLASH là 0xFFFF.
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 176
22. Tập lệnh
22.1. Giới thiệu
Tập lệnh của SG8V1 có tất cả 63 mã lệnh. Hầu hết các lệnh có chiều dài là 1 word (16-bit), và
hai lệnh có chiều dài 2 word. Các lệnh tùy theo chức năng và loại lệnh sẽ được chia thành các
nhóm sau:
Số học: thực hiện các phép toán trên các toán hạng
Logic: thực hiện các phép toán logic trên toán hạng
Nhảy: rẽ nhánh luồng chương trình
Điều khiển: thay đổi các bit trạng thái của hệ thống
Sao chép dữ liệu: đọc/ghi dữ liệu với SRAM.
Tất cả các mã lệnh 1 có chiều dài 1 word được thực thi trong 1 chu kỳ, ngoại trừ các lệnh có kèm
theo điều kiện. Khi đó, tùy theo điều kiện sẽ tính toán được chính xác giá trị của bộ đếm chương
trình (PC). Trong trường hợp này, lệnh có điều kiện có thể phải mất 2 chu kỳ để hoàn tất.
Các lệnh có chiều dài 2 word sẽ thực thi trong 2 chu kỳ. Vì vậy, đối với nguồn xung clock tần số
1 MHz, các lệnh bình thường sẽ thực thi trong 1 μs. Nếu điều kiện đúng, hoặc PC thay đổi như là
kết quả của lệnh thì nó được thực hiện trong 2 chu kỳ, 2 μs.
Đối với các lệnh rẽ nhánh có chiều dài 2 word thì phải mất đến 3 chu kỳ, 3 μs, để thực hiện. Tất
các ví dụ mẫu đều sử dụng giá thập lục phân (HEX) để diễn tả.
Bảng tóm tắt chức năng các lệnh trong Bảng 22-2, nó liệt kế hết các lệnh có thể nhận biết được
bởi trình biên dịch SG8V1.
Bảng 22-1: Mô tả cho các trường mã lệnh
Trường Mô tả
bse Chọn lựa băng được chọn là băng 0 hay nội dung thanh ghi BS
bit Vị trí của bit trong thanh ghi 8-bit
dst
Bit 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)
target16 Địa chỉ chương trình 16 bit (địa chỉ nhãn)
off8/off11 Đị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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 177
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 178
22.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
22.3. Tóm tắt tập lệnh
Bảng 22-2 liệt kê tất cả các lệnh của VĐK SG8V1
Bảng 22-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 = imm - (ACC) 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
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 179
DA
HC_tmp || ACC[3:0] = ([ACC[3:0] > 9] hoặc [HC = 1]) ? (ACC [3:0]) + 6 : ACC [3:0]) ACC [7:4] = ([ACC [7:4] > 9] hoặc [C = 1]) ? (ACC [7:4]) + 6 + HC_tmp; C = 1 : (ACC [7:4]) + HC_tmp
C
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
MFR reg, bse reg = (Flash_mem[FPTH*256 + FPTL]) không
MRF reg, bse Flash_mem[FPTH*256 + FPTL] = (reg) không
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), giảm con trỏ Stack không
RETA imm PC = (TS), giảm con trỏ Stack ACC = imm
không
RETI PC = (TS), giảm con trỏ Stack GIE/GIEH = 1 hoặc PIE/GIEL = 1
không
SCALL n PC = (PC) + 1 + off11 TS = (PC) + 1, tăng con trỏ Stack
không
SJMP n PC = (PC) + 1+ off11 không
TBZ IF (reg) = 0, bỏ qua lệnh tiếp theo
không
LCALL target16 PC = target16, tăng con trỏ Stack
không TS = (PC) + 2
LJMP target16 PC = target16 không
Nhóm điều khiển hệ thống
IDLE
00h → WDT postscaler, 0 → WDT prescaler, 0 → WDTO, 1 → PWD
WDTO, PWD
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 180
RST
00h → WDT postscaler, 0 → WDT prescaler, 0 → WDTO, 0 → 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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 181
22.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 ≤ target16 ≤ 65535
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 dst trong mã lệnh (bit thứ [9]), thì nếu dst = 0, kết quả sẽ lưu lại trong
thanh ghi ACC. Nếu dst = 1 thì kết quả sẽ lưu lại trong thanh ghi reg.
Đối với những lệnh có bit bse trong mã lệnh (bit thứ [8]), nếu bit bse = 0, thì băng bộ nhớ 0 sẽ
được chọn. Nếu bse = 1 thì băng bộ nhớ được chọn sẽ phụ thuộc giá trị của thanh ghi BS.
Thứ tự trình bày diễn tả chi tiết cho lệnh
VD: Lệnh ADDI
ADDI - ADD constant to ACC (Tên lệnh)
ADDI imm (cú pháp lập trình)
ACC = (ACC) + imm (chức năng lệnh)
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. (mô tả hoạt động lệnh)
Các bit cờ ảnh hưởng: C, HC, Z (các cờ trạng thái bị tác động)
ADDI 0x15; Trước lệnh: ACC = 10h (ví dụ mẫu) Sau lệnh: ACC = 25h
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 182
ADDI - ADD constant to ACC
ADDI imm
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 183
ADDRC - ADD ACC and Carry bit to reg ADDRC reg, dst, bse
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 184
ANDR - AND ACC to reg ANDR reg, dst, bse
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 185
BRC - Branch if Carry BRC off8
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
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 off8 Trước lệnh: PC = địa chỉ lệnh BRNC Sau lệnh: Nếu Carry = 0; PC = PC + 1 + off8 Nếu Carry = 1; PC = PC + 1
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 186
BRNZ - Branch if Not Zero BRNZ off8 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 off8 Trước lệnh: PC = địa chỉ lệnh BRNZ Sau lệnh: Nếu Zero = 0; PC = PC + 1 Nếu Zero = 1; PC = PC + 1 + off8
BRZ - Branch if Zero BRZ off8 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 off8 Trước lệnh: PC = địa chỉ lệnh BRZ Sau lệnh: Nếu Zero = 1; PC = PC + 1 Nếu Zero = 0; PC = PC + 1 + off8
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 187
BSET - Bit Set reg BSET reg, bit, bse
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 188
BTBS - Bit Test reg, Bypass if Set BTBS reg, bit, bse
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
reg = 0
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 189
CLRWDT - Clear Watchdog Timer CLRWDT
WDT postscaler = 000h
WDT prescaler = 000h
WDTO = 0
PWD = 0
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 190
DA - Decimal Adjust ACC Register
DA HC_tmp || ACC[3:0] = ([ACC[3:0] > 9] hoặc [HC = 1]) ?(ACC [3:0])
+ 6 : ACC [3:0])
ACC [7:4] = ([ACC [7:4] > 9] hoặc [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 Zero
DBNZ reg, dst, bse
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 191
DBZ - Decrement reg, Bypass if Zero DBZ reg, dst, bse
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 192
IACC - Immediate value to ACC
IACC imm
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 Zero IBNZ reg, dst, bse
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 193
IBS - Immediate value to Bank Select
IBS imm
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 194
IBZ - Increment reg, Bypass if Zero IBZ reg, dst, bse
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 195
IDP0 - Immediate value to Data Pointer 0
IDP0 imm
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 196
IDPOFF - Immediate value to Data Pointer Offset
IDPOFF imm
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 197
JMPA - Jump with ACC JMPA
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 target16
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 target16 Trước lệnh: PC = địa chỉ lệnh LCALL Sau lệnh: PC = target16
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 198
LD - Load reg to ACC
LD reg, bse
ACC = (reg)
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 = 00h Sau lệnh: ACC = 00h, REG = 00h, Z = 1
LJMP - Long Jump LJMP target16
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 target16 Trước lệnh: PC = địa chỉ lệnh LJMP Sau lệnh: PC = target16
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 199
MFR – Move from Flash to Register MFR reg, bse
reg = Flash_memory[FPTH*256 + FPTL]
Thực hiện chuyển dữ liệu từ bộ nhớ chương trình Flash sang bộ nhớ dữ liệu SRAM. Địa chỉ đọc
bộ nhớ Flash có 8 bit cao là thanh ghi FPTH và 8 bit thấp là nội dung của thanh ghi FPTL. Địa
chỉ thanh ghi là giá trị của trường reg kết hợp với thanh ghi BS. Băng được lựa chọn phụ thuộc
bit bse.
Các bit cờ ảnh hưởng: không có
MFR 0x6C, 0, 0x10 Trước lệnh: reg 0x6C = ?, TPS = 1, Flash_memory[0x266] = AAh Sau lệnh: reg 0x6C = AAh, TPS = 1, Flash_memory[0x266] = AAh
MFR 0x60, 0, 0x50 Trước lệnh: reg 0x60 = ?, TPS = 0, Flash_memory[0x50] = 1Fh Sau lệnh: reg 0x60 = 1Fh, TPS = 0, Flash_memory[0x50] = 1Fh
MRF – Move from Register to Flash MRF reg, bse
Flash_memory[FPTH*256 + FPTL] = reg
Thực hiện chuyển giá trị từ bộ nhớ dữ liệu sang bộ nhớ chương trình Flash. Địa chỉ ghi bộ nhớ
Flash có 8 bit cao là thanh ghi FPTH và 8 bit thấp là nội dung của thanh ghi FPTL. Địa chỉ thanh
ghi là giá trị của trường reg kết hợp với thanh ghi BS. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
MRF 0x6C, 0 Trước lệnh: FPTH = 1, FPTL = 0x10, Flash_memory[0x266] = ?, reg 0x6C = 55h, Sau lệnh: FPTH = 1, FPTL = 0x10, Flash_memory[0x266] = 55h, reg 0x6C = 55h,
MRF 0x60, 0 Trước lệnh: FPTH = 0, FPTL = 0x50, Flash_memory[0x50] = ?, reg 0x60 = CCh Sau lệnh: FPTH = 0, FPTL = 0x50, Flash_memory[0x50] = CCh, reg 0x60 = CChh
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 200
MULI - Multiply Constant with ACC MULI imm
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
MULI - Multiply Constant with ACC MULI imm
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
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 201
MULR - Multiply reg with ACC MULR reg, bse
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
NOP - No Operation NOP
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
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 202
ORI - OR Constant with ACC ORI imm
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
ORR - OR ACC with reg ORR reg, dst, bse
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
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 [SP – 1] = 4332h Sau lệnh: TS = 4332h, PC = PC + 1
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 203
PUSH - Push Top of Return Stack PUSH
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 = 0125h, TS = 0125h, Stack [SP – 1]= 345Ah
RET - Return from Subroutine RET
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ó
RET Trước lệnh: PC = ?, TS = 345Ah Sau lệnh: PC = 345Ah
RETA - Return Immediate value to ACC RETA k0
PC = (TS)
ACC = k0
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. ACC được
cập nhật với giá trị tức thời của lệnh RETA
Các bit cờ ảnh hưởng: không có
RETA k0 Trước lệnh: PC = ?, TS = 345Ah, ACC = ? Sau lệnh: PC = 345Ah, ACC = k0
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 204
RETI - Return from Interrupt RETI
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 hoặc PIE/GIEL = 1
RL - Rotate Left reg (no carry) RL reg, dst, bse
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 205
RLC - Rotate Left reg through Carry RLC reg, dst, bse
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
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
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 206
RRC - Rotate Right reg through Carry RRC reg, dst, bse
C || dest[7:0] = R[0] || C || R[7:1]
Nội dung của thanh ghi reg được xoay phả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
RRC REG, 0, 0 Trước lệnh: REG = 1110 0110, C = 0, ACC = ? Sau lệnh: REG = 1110 0110, ACC = 0111 0011, C = 0
RST – Soft Reset RST PC =0, WDTO = 0, PWD = 0
Reset hệ thống lại trạng thái ban đầu. Sauk hi lệnh này thực hiện xong, các thanh ghi hệ thống sẽ
trở về trạng thái như khi hệ thống vừa được khởi động.
Các bit cờ ảnh hưởng: WDTO, PWD, DC, C, Z
RST Trước lệnh: PC = ?, WDTO = ?, PWD = ? Sau lệnh: PC = 0, WDTO = 0, PWD = 0
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 207
SCALL - Short Subroutine Call SCALL off11
PC = (PC) + 1 + off11
TS = (PC) + 1
Gọi chương trình con trong tầm 1KB trước và sau vị trí PC hiện của chương trình. Lệnh này chỉ
hỗ trợ gọi các chương trình con gần với vị trí của PC hiện tại. Giá trị off11 là số có dấu. Ưu điểm
của lệnh này là chỉ mất 2 chu kỳ để thực hiện.
Các bit cờ ảnh hưởng: không có
SCALL off11 Trước lệnh: PC = địa chỉ lệnh SCALL, TS = ? Sau lệnh: PC = PC + 1 + off11, TS = địa chỉ SCALL + 1
SET - Set reg SET reg, bse
R = FFh
Gán tất cả các bit của thanh ghi reg lên 1, hay nói cách khác là gán FFh cho thanh ghi reg. Băng
được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
SET REG, 1 Trước lệnh: REG = ? Sau lệnh: REG = FFh
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 208
SJMP - Short Jump SJMP off11
PC = (PC) + 1 + off11
TS = (PC) + 1
Nhảy đến vị trí khác trong đoạn ngắn tầm 1KB. Lệnh này chỉ hỗ trợ rẽ nhánh chương trình đến vị
trí gần giá trị PC hiện tại. Giá trị off11 là số có dấu. Ưu điểm của lệnh này là chỉ mất 2 chu kỳ để
thực hiện.
Các bit cờ ảnh hưởng: không có
SJMP off11 Tước lệnh: PC = địa chỉ lệnh SJMP Sau lệnh: PC = PC + 1 + off11
ST - Store ACC to reg ST reg, bse
R = (ACC)
Ghi giá trị của thanh ghi ACC vào thanh ghi reg. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
ST REG, 0 Trước lệnh: REG = ?, ACC = 1Ah Sau lệnh: REG = 1Ah, ACC = 1Ah
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 209
SUBAR - Subtract reg from ACC SUBAR reg, dst, bse
dest = (ACC) - (reg)
Thực hiện phép toán trừ của thanh ghi tích lũy ACC với 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: C, HC, Z
SUBAR REG, 0, 0 Trước lệnh: REG = 0Ah, ACC = 1Ah Sau lệnh: REG = 0Ah, ACC = 10h
SUBARC - Subtract reg from ACC with Carry SUBARC reg, dst, bse
dest = (ACC) - (reg) - C
Thực hiện phép toán trừ của thanh ghi tích lũy ACC với thanh ghi reg và 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: C, HC, Z
SUBARC REG, 1, 0 Trước lệnh: REG = 3, ACC = 2, C = 1 Sau lệnh: REG = FE, ACC = 2, C = 1, Z = 0
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 210
SUBI - Subtract ACC from Constant SUBI imm
dest = imm - (ACC)
Thực hiện phép toán trừ của thanh ghi tích lũy ACC với thanh ghi reg và 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: C, HC, Z
SUBI 0x02 Trước lệnh: ACC = 01h, C = ? Sau lệnh: ACC = 01h, C = 0, Z = 0
SUBRA - Subtract ACC from reg SUBRA reg, dst, bse
dest = (reg) - (ACC)
Thực hiện phép toán trừ của thanh ghi reg với thanh ghi tích lũy ACC. 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
SUBRA REG, 1, 0 Trước lệnh: REG = 3, ACC = 2, C = ? Sau lệnh: REG = 1, ACC = 2, C = 0, Z = 0
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 211
SUBRAC - Subtract ACC from r with Carry SUBRAC reg, dst, bse
dest = (reg) - (ACC) - C
Thực hiện phép toán trừ của thanh ghi reg với thanh ghi tích lũy ACC và 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: C, HC, Z
SUBRAC REG, 1, 0 Trước lệnh: REG = 19h (0001 1001), ACC = 0Dh (0000 1101), C = 0, Z = ? Sau lệnh: REG = 0Ch (0000 1011), W = 0Dh (0000 1101), C = 0, Z = 0
TBZ - Test reg, Bypass if 0 TBZ reg, bse
IF (reg = 0) bỏ qua lệnh tiếp theo
Kiểm tra giá trị của thanh ghi reg, nếu giá trị bằng 0 thì bỏ qua lệnh tiếp theo.
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 chu kỳ.
Các bit cờ ảnh hưởng: không có
TBZ REG, 1 Trước lệnh: PC = địa chỉ lệnh TBZ Sau lệnh: If REG =0; PC = (PC) + 2 If REG ≠ 0; PC = (PC) + 1
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 212
XCHD - Exchange Digit XCHD reg, dst, bse
dest = (reg) - (ACC) - C
Thực hiện phép toán trừ của thanh ghi reg với thanh ghi tích lũy ACC và 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: không có
XCHD REG, 1, 0 Trước lệnh: REG = 53h Sau lệnh: REG = 35h
XORI - Exclusive OR Constant with ACC XORI imm
ACC = (ACC) XOR imm
Thực hiện phép XOR của thanh ghi tích lũy ACC với giá trị tức thời trong mã lệnh. Vịt rí lưu kết
quả là thanh ghi ACC.
Các bit cờ ảnh hưởng: Z
XORI 0xAF Trước lệnh: ACC = B5h Sau lệnh: ACC = 1Ah
Tập lệnh
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 213
XORR - Exclusive OR reg with ACC XORR reg, dst, bse
dest = (ACC) XOR (reg)
Thực hiện phép XOR của thanh ghi tích lũy ACC với 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
XORR REG, 1, 0 Trước lệnh: REG = 53h, ACC = B5h Sau lệnh: REG = E6h, ACC = B5h
Đặc tính vẫn vật lý điện
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 214
23. Đặc tính vật lý điện Điện áp hoạt động: 3.0V ~ 3.6V
Nhiệt độ hoạt động: ‒40°C ~ 85°C
Dòng một chiều vào tối đa: 30mA
Dòng một chiều ra tối đa: 30mA
Bảng 23-1: Thông số vật lý điện
Ký hiệu Mô tả Điều kiện Thấp Thường Cao Đơn vị
VIL Mức thấp
điện áp vào
VCC=3.3v - - 0.8 V
VIH Mức cao
điện áp vào
VCC=3.3v 2.0 - - V
VOL Mức thấp
điện áp ra
|IOL| = 2mA
~ 10mA
VCC = 3.3V
- - 0.4 V
VOH Mức cao
điện áp ra
|IOH| = 2mA
~ 10mA
VCC = 3.3V
2.4 - - V
RPU Điện trở
kéo lên các
chân I/O
40 75 190 kΩ
Prun Công suất
tiêu thụ ở
chế độ Run
20 Mhz - 38.3 - mW
Psleep Công suất
tiêu thụ ở
chế độ
sleep
20 Mhz - 3.5 - mW
Thông tin package
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 215
24. Thông tin package
D
D1
PIN 1
IDENTIFIER
1 12
13
24
36 25
48
37
4
EE1
1
2
12
AA
Hình 24-1: Hình chiếu đứng chip SG8V1
A A2
A16
e
b
SEATING PLANECCccc
Hình 24-2: Hình chiếu cạnh chip SG8V1
Bảng 24-1: Kích thước vật lý 1
Ký hiệu Kích thước (mm)
Kích thước (inch)
Nhỏ Thường Lớn Nhỏ Thường Lớn
A —— —— 1.60 —— —— 0.063
A1 0.05 —— 0.15 0.002 —— 0.006
A2 1.35 1.40 1.45 0.053 0.055 0.057
b 0.17 0.22 0.27 0.007 0.009 0.011
D 9.00 BSC 0.354 BSC
D1 7.00 BSC 0.276 BSC
E 9.00 BSC 0.354 BSC
E1 7.00 BSC 0.276 BSC
e
0.50 BSC 0.020 BSC
ccc 0.08 0.003
Thông tin package
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 216
ϴ2
ϴ1
R1
R2
ϴ
ϴ3
L1
L
S.25
GAGE PLANE
B
B
Hình 24-3: Mặt cắt A-A
b 5 3
b1 5
c1
5
c5
BASE
METAL
WITH PLATING
Hình 24-4: Mặt cắt B-B
Bảng 24-2: Kích thước vật lý 2
Ký hiệu Kích thước (mm)
Kích thước (inch)
Nhỏ Thường Lớn Nhỏ Thường Lớn
b 0.17 0.22 0.27 0.007 0.009 0.011
b1 0.17 0.20 0.23 0.007 0.008 0.009
c 0.09 —— 0.20 0.004 —— 0.008
c1 0.09 —— 0.16 0.004 —— 0.006
L 0.45 0.60 0.75 0.018 0.024 0.030
L1 1.00 REF 0.039 REF
R1 0.08 —— —— 0.003 —— ——
R2 0.08 —— 0.20 0.003 —— 0.008
S 0.20 —— —— 0.008 —— ——
ϴ 0o 3.5o 7o 0o 3.5o 7o
ϴ1 0o —— —— 0o —— ——
ϴ2 12o TYP 12o TYP
ϴ3 12o TYP 12o TYP
Thông tin package
© 2014-2015 ICDREC SG8V1 - Hướng dẫn sử dụng 217
Chú ý:
1 Được xác định tại bề mặt đặt chip. C
2 Kích thước D1 và E1 không bao gồm sự nhô ra từ chân chip. D1 và E1 là kích thước lớn nhất
của thân chip đã bao gồm sai số kỹ thuật trong sản xuất chip.
3 Kích thước b là không bao gồm sự nhô ra của chân chip. Phần nhô ra này không thể được đặt
trên bán kính nhỏ hơn của chân chip.
4 Hình dạng chính xác của mỗi góc là tối ưu.
5 Những kích thước này áp dụng cho phần mặt phẳng của chì giữa 0.10mm và 0.25mm từ đầu
mút chì.
6 A1 được định nghĩa là khoảng cách từ bề mặt đặt chip đến điểm thấp nhất của thân chip.
7. Đơn vị sử dụng: MILLIMETER
8. Tài liệu tham khảo: JEDEC MS-026
9. Đặc tính lớp C: ccc