Bài giảng Ngoại vi Inter-Integrated Circuit

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

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

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

  • pdf7p2_3948.pdf