mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/kythuatlaptrinhnhung-...

180
2 Mục lục 1.1. Mở đầu ................................................................................................ 6 1.2. Các khái nim vhnhúng .................................................................. 6 1.3. Lĩnh vực ứng dụng của hệ nhúng......................................................... 9 1.4. Đặc điểm công nghvà xu thế phát trin ca hnhúng................. 9 1.4.1 Đặc đim công ngh.................................................................... 9 1.4.2 Xu thế phát triển và stăng trưởng ca hnhúng ...................... 10 1.5. Cu trúc phn cng hnhúng ............................................................ 12 1.5.1 . Các thành phn kiến trúc bản ................................................ 12 1.5.2. Đơn vxlý trung tâm CPU ....................................................... 12 1.5.3. Xung nhịp và trạng thái tín hiệu ................................................. 15 1.5.4. Bus địa chỉ, dliu và điu khin ............................................... 17 1.5.6. Không gian và phân vùng địa ch................................................ 22 1.6. Mt snn phn cng nhúng thông dng (μP/DSP/PLA) ................. 27 1.6.1. Chip Vi xlý/Vi điều khin nhúng ............................................ 28 1.6.2. Chip DSP .................................................................................... 30 1.6.3. PAL ............................................................................................ 32 Chương 2: LẬP TRÌNH HP NGTRÊN VI XLÝ 8086 ................. 35 2.1 Cơ bản về hợp ngữ ............................................................................. 35 2.1.1. Giới thiệu chung ......................................................................... 35 2.1.2. Hệ lệnh Assembler...................................................................... 36 2.1.3. Các bước viết chương trình hợp ngữ ........................................... 36 2.1.3.1. Cài đặt chương trình dịch TASM: ............................................................ 37 2.1.3.2. Các bước thực hiện một chương trình Assember trên máy PC : ............... 37 2.2. Cấu trúc một chương trình hợp ngữ dạng đơn giản ............................ 38 2.2.1. Dạng thường thấy 1 chương trình ASM đơn giản ....................... 38 2.2.2. Các Directve (.MODEL, .STACK, .DATA, .CODE, ...) ............ 40 2.2.2.1. Directive .MODEL .................................................................................. 40 2.2.2.2. Directive .STACK ................................................................................... 41 2.2.2.3. Directive . DATA ................................................................................... 41 2.2.2.4. Directive .CODE ..................................................................................... 43 2.3. Cấu trúc của một chương trình ASM dạng chuẩn .............................. 43 2.3.1. Chương trình ASM đơn giản dạng chuẩn.................................... 43 2.3.2. Các directive điều khiển segment: dạng chuẩn............................ 43 2.3.2.1. Directive SEGMENT .............................................................................. 43 2.3.2.2. Drective GROUP..................................................................................... 46 2.3.2.3. Directive ASSUME ................................................................................. 47 2.2. Trạng thái của Vi xử lý và các thanh ghi c....................................... 48 2.2.1. Cách định địa chỉ byte nhớ trong 8086........................................ 49 2.2.2. Các thanh ghi trong 8086 ............................................................ 50 2.3. Các lệnh di chuyển dữ liệu ................................................................ 53

Upload: lehanh

Post on 08-May-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

2

Mục lục

1.1. Mở đầu ................................................................................................ 6 1.2. Các khái niệm về hệ nhúng .................................................................. 6 1.3. Lĩnh vực ứng dụng của hệ nhúng ......................................................... 9 1.4. Đặc điểm công nghệ và xu thế phát triển của hệ nhúng ................. 9

1.4.1 Đặc điểm công nghệ .................................................................... 9 1.4.2 Xu thế phát triển và sự tăng trưởng của hệ nhúng ...................... 10

1.5. Cấu trúc phần cứng hệ nhúng ............................................................ 12 1.5.1 .. Các thành phần kiến trúc cơ bản ................................................ 12 1.5.2. Đơn vị xử lý trung tâm CPU ....................................................... 12 1.5.3. Xung nhịp và trạng thái tín hiệu ................................................. 15 1.5.4. Bus địa chỉ, dữ liệu và điều khiển ............................................... 17 1.5.6. Không gian và phân vùng địa chỉ ................................................ 22

1.6. Một số nền phần cứng nhúng thông dụng (µP/DSP/PLA) ................. 27 1.6.1. Chip Vi xử lý/Vi điều khiển nhúng ............................................ 28 1.6.2. Chip DSP .................................................................................... 30 1.6.3. PAL ............................................................................................ 32

Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ................. 35 2.1 Cơ bản về hợp ngữ ............................................................................. 35

2.1.1. Giới thiệu chung ......................................................................... 35 2.1.2. Hệ lệnh Assembler...................................................................... 36 2.1.3. Các bước viết chương trình hợp ngữ ........................................... 36

2.1.3.1. Cài đặt chương trình dịch TASM: ............................................................ 37 2.1.3.2. Các bước thực hiện một chương trình Assember trên máy PC : ............... 37

2.2. Cấu trúc một chương trình hợp ngữ dạng đơn giản ............................ 38 2.2.1. Dạng thường thấy 1 chương trình ASM đơn giản ....................... 38 2.2.2. Các Directve (.MODEL, .STACK, .DATA, .CODE, ...) ............ 40

2.2.2.1. Directive .MODEL .................................................................................. 40 2.2.2.2. Directive .STACK ................................................................................... 41 2.2.2.3. Directive . DATA ................................................................................... 41 2.2.2.4. Directive .CODE ..................................................................................... 43

2.3. Cấu trúc của một chương trình ASM dạng chuẩn .............................. 43 2.3.1. Chương trình ASM đơn giản dạng chuẩn .................................... 43 2.3.2. Các directive điều khiển segment: dạng chuẩn ............................ 43

2.3.2.1. Directive SEGMENT .............................................................................. 43 2.3.2.2. Drective GROUP..................................................................................... 46 2.3.2.3. Directive ASSUME ................................................................................. 47

2.2. Trạng thái của Vi xử lý và các thanh ghi cờ ....................................... 48 2.2.1. Cách định địa chỉ byte nhớ trong 8086........................................ 49 2.2.2. Các thanh ghi trong 8086 ............................................................ 50

2.3. Các lệnh di chuyển dữ liệu ................................................................ 53

Page 2: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

3

2.3.1. Lệnh mov ................................................................................... 53 2.3.2. Lệnh push ................................................................................... 53 2.3.3. Lệnh POP ................................................................................... 54 2.3.4. Lệnh PUSHF .............................................................................. 54 2.3.5. Lệnh POPF ................................................................................. 54 2.3.6. Lệnh XCHG (Exchange 2 Operands) Tráo nội dung 2 toán hạng 54 2.3.7. Lệnh IN ...................................................................................... 54 2.3.8. Lệnh OUT .................................................................................. 55 2.3.9. Lệnh LEA (load Efective address) .............................................. 55 2.3.10. Lệnh LES (Load register and ES with words from memory) .... 55 2.3.11. Lệnh LDS (Load resgister and DS with words from memory) .. 56

2.4. Các lệnh điều khiển(Lặp và rẽ nhánh) ............................................... 56 2.4.1. Lệnh Call .................................................................................... 57 2.4.2. Lệnh RET ................................................................................... 57 2.4.3. Lệnh INT .................................................................................... 57 2.4.4. Lệnh IRET .................................................................................. 58 2.4.5. Lệnh nhảy có điều kiện ............................................................... 58 2.4.6. Lệnh LOOP (for của ASM) ........................................................ 59 2.4.7. Các thí dụ ................................................................................... 59

2.5. Các lệnh logic, dịch và quay .............................................................. 61 2.5.1. Lệnh AND .................................................................................. 61 2.5.2. Lệnh OR ..................................................................................... 62 2.5.3. Lệnh XOR .................................................................................. 62 2.5.4. Lệnh SHL (Shift Left) ................................................................ 63 2.5.5. Lệnh SHR (Shift Right) .............................................................. 63 2.5.6. Lệnh SAR ( Shift Arithmetically Right) ..................................... 64 2.5.7. Lệnh ROL( Rotate All Bits to the Left)....................................... 64 2.5.8. Lệnh ROR .................................................................................. 64

2.5. Các lệnh số học ................................................................................. 65 2.5.1. Lệnh ADD(addition) ................................................................... 65 2.5.2. Lệnh ADC(Add with carry) ........................................................ 65 2.5.4. Lệnh INC(Increment Destination Register or Memory) .............. 66 2.5.5. Lệnh SUB (Substraction) ............................................................ 66 2.5.6. Lệnh SBB (Substraction with borrow) ........................................ 66 2.5.7. Lệnh MUL/ IMUL (Multiply Unsigned Byte or Word/ Integer Multiplication )..................................................................................... 66 2.5.8. Lệnh DIV/IDIV(Unsigned Divide/Integer Division) ................... 67 2.5.9. Lệnh DEC (Decrement Destination Register or Memory) ........... 67 2.5.10. Lệnh NEG (Negate a Operand) ................................................. 68 2.5.11. Lệnh CMP (Compare Byte or Word) ........................................ 68

2.6. Các lệnh thao tác với chuỗi ................................................................ 68 2.6.1. Lệnh MOVSB/MOVSW (Move String Byte or String Word) ..... 68

Page 3: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

4

2.6.2. Lệnh LODSB/LODSW (Load String Byte or Word into AL/AX)69 2.6.3. Lệnh STOSB/STOSW (Store AL/AX in String Byte/Word) ....... 69 2.6.4. Lệnh CMPSB/CMPSW .............................................................. 69 2.6.5. Tiền tố REP (Repeat String Instruction until CX = 0). ................ 69

2.7. Ngăn xếp và thủ tục ........................................................................... 70 2.7.1 Cơ chế làm việc của chương trình con ......................................... 70 2.7.2 Cấu trúc của chương trình con ..................................................... 71 2.7.3 Vấn đề chuyển giao tham số ........................................................ 71 2.7.4 Vấn đề bảo vệ các thanh ghi ........................................................ 72 2.7.5. Một số ví dụ ................................................................................ 72

2.8. Mảng và các chế độ định địa chỉ ........................................................ 80 2.8.1 Mảng một chiều .......................................................................... 80 2.8.2. Các mode địa chỉ của 8086 ......................................................... 82 2.8.3. Thí dụ ......................................................................................... 85

2.9. Các lệnh thao tác với cờ và điều khiển bộ .......................................... 87 2.9.1. Lệnh CLC (Clear CF) ................................................................. 87 2.9.3. Lệnh CMC .................................................................................. 87 2.9.4. Lệnh CLI .................................................................................... 87 2.9.5. Lệnh STI..................................................................................... 87 2.9.6. Lệnh CLD ................................................................................... 88 2.9.7. Lệnh STD ................................................................................... 88 2.9.8. Lệnh HLT ................................................................................... 88 2.9.9. Lệnh NOP ................................................................................... 88

CHƯƠNG 3 : VI ĐIỀU KHIỂN 8051 VÀ LẬP TRÌNH HỢP NGỮ ..... 89 3.1. Tổng quan về họ vi điều khiển 80C51 ............................................... 89

3.1.1. Sự khác nhau giữa các bộ vi xử lý và vi điều khiển .................... 89 3.1.1.1.Cấu trúc phần cứng ................................................................................... 89 3.1.1.2. Các ứng dụng .......................................................................................... 90 3.1.1.3. Các đặc trưng của tập lệnh ....................................................................... 90

3.1.2. Các bộ vi điều khiển họ 8051...................................................... 90 3.1.2.1.Cấu trúc bên trong của vi điều khiển 8051 90

3.1.2.2. Các thành viên khác của họ 8051 ............................................................. 91 3.2. Cấu trúc phần cứng 8051 ................................................................... 94

3.2.1. Các chân vi điều khiển ................................................................ 94 3.2.2. Tổ chức bộ nhớ ........................................................................... 97 3.2.3. Các bank thanh ghi ..................................................................... 99 3.2.4. Các thanh ghi chức năng đặc biệt .............................................. 100

3.2.4.1. Thanh ghi từ trạng thái chương trình ...................................................... 100 3.2.4.2. Thanh ghi B ........................................................................................... 102 3.2.4.3. Con trỏ ngăn xếp ................................................................................... 102 3.2.4.4. Con trỏ dữ liệu ...................................................................................... 103 3.2.4.5. Các thanh ghi port xuất nhập ................................................................. 104 3.2.4.6. Các thanh ghi Timer .............................................................................. 104

Page 4: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

5

3.2.4.7. Các thanh ghi port nối tiếp ..................................................................... 104 3.2.4.8. Các thanh ghi ngắt ................................................................................. 104 3.2.4.9. Các thanh ghi điều khiển công suất ........................................................ 104

3. 2.5. Bộ nhớ ngoài ........................................................................... 104 3.2.5.1. Truy xuất bộ nhớ chương trình ngoài ..................................................... 105 3.2.5.2. Truy xuất bộ nhớ dữ liệu ngoài .............................................................. 105

Page 5: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

6

CHƯƠNG I: MỞ ĐẦU

1.1. Mở đầu Kỷ nguyên công nghệ mới đã và đang tiếp tục phát triển không ngừng nhằm

thông minh hoá hiện đại hoá thông suốt các hệ thống. Có thể nói đánh dấu sự ra đời và phát triển của hệ nhúng trước tiên phải kể đến sự ra đời của các bộ vi xử lý, vi điều khiển. Nó được đánh dấu bởi sự ra đời của Chip vi xử lý đầu tiên 4004 vào năm 1971 cho mục đích tính toán thương mại bởi một công ty Nhật bản Busicom và sau đó đã được chắp cánh và phát triển vượt bậc bởi Intel để trở thành các bộ siêu xử lý như các Chip được ứng dụng cho PC như ngày nay. Thập kỷ 80 có thể được coi là khởi điểm bắt đầu kỷ nguyên của sự bùng nổ về phát triển các hệ nhúng. Từ đó khởi nguồn cho làn sóng ra đời của hàng loạt các chủng loại vi xử lý và gắn liền là các hệ nhúng để thâm nhập rộng khắp trong các ứng dụng hàng ngày của cuộc sống chúng ta ví dụ như, các thiết bị điện tử sử dụng cho sinh hoạt hàng ngày (lò vi sóng, TV, tủ lạnh, máy giặt, điều hoà ...) và văn phòng làm việc (máy fax, máy in, máy điện thoại...)... Các bộ vi xử lý và phần mềm cũng ngày càng được sử dụng rộng rãi trong rất nhiều các hệ thống nhỏ. Các loại vi xử lý được sử dụng trong các hệ thống nhúng hiện nay đã vượt xa so với PC về số lượng chủng loại (chiếm đến 79% số các vi xử lý đang tồn tại [2] ) và vẫn còn tiếp tục phát triển để nhằm đáp ứng và thoả mãn rất nhiều ứng dụng đa dạng. Trong số đó vẫn còn ứng dụng cả các Chip vi xử lý 8 bit, 16 bit và hiện nay chủ yếu vẫn là 32 bit (chiếm khoảng 75%). Gắn liền với sự phát triển phần cứng, phần mềm cũng đã phát triển với tốc độ nhanh không thua kém thậm chí sẽ tăng nhanh hơn rất nhiều theo sự phát triển hệ nhúng.

1.2. Các khái niệm về hệ nhúng Hệ nhúng? Trong thế giới thực của chúng ta bất kỳ một thiết bị hay hệ thống điện/điện tử

có khả năng xử lý thông tin và điều khiển đều có thể tiềm ẩn trong đó một thiết bị hay hệ nhúng, ví dụ như các thiết bị truyền thông, thiết bị đo lường điều khiển, các thiết bị phục vụ sinh hoạt hàng ngày như lò vi sóng, máy giặt, camera…Rất dễ dàng để có thể kể ra hàng loạt các thiết bị hay hệ thống như vậy đang tồn tại quanh ta, chúng là hệ nhúng. Vậy hệ nhúng thực chất là gì và nên hiểu thế nào về hệ nhúng? Hiện nay cũng chưa có một định nghĩa nào thực sự thoả đáng để được chuẩn hoá và thừa nhận rộng rãi cho hệ nhúng mà vẫn chỉ là những khái niệm diễn tả về chúng thông qua những đặc thù chung. Tuy nhiên ở đây chúng ta có thể hiểu

Page 6: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

7

hệ nhúng là một phần hệ thống xử lý thông tin nhúng trong các hệ thống lớn, phức hợp và độc lập ví dụ như trong ôtô, các thiết bị đo lường, điều khiển, truyền thông và thiết bị thông minh nói chung. Chúng là những tổ hợp của phần cứng và phần mềm để thực hiện một hoặc một nhóm chức năng chuyên biệt, cụ thể (Trái ngược với máy tính PC mà chúng ta thường thấy được sử dụng không phải cho một chức năng mà là rất nhiều chức năng hay phục vụ chung cho nhiều mục đích). PC thực chất lại là một hệ thống lớn, tổ hợp của nhiều hệ thống nhúng ví dụ như card màn hình, âm thanh, modem, ổ cứng, bàn phím…Chính điều này làm chúng ta dễ lúng túng nếu được hỏi nên hiểu thế nào về PC, có phải là hệ nhúng hay không.

Hình 1.1. Một vài hình ảnh về hệ nhúng

Hệ thời gian thực? Trong các bài toán điều khiển và ứng dụng chúng ta rất hay gặp thuật ngữ

“thời gian thực”. Thời gian thực có phải là thời gian phản ánh về độ trung thực của thời gian hay không? Thời gian thực có phải là hiển thị chính xác và đồng bộ theo đúng như nhịp đồng hồ đếm thời gian hay không? Không phải hoàn toàn như vậy! Thực chất, theo cách hiểu nếu nói trong các hệ thống kỹ thuật đặc biệt các hệ thống yêu cầu khắt khe về sự ràng buộc thời gian, thời gian thực được hiểu là yêu cầu của hệ thống phải đảm bảo thoả mãn về tính tiền định trong hoạt động của hệ thống. Tính tiền định nói lên hành vi của hệ thống thực hiện đúng trong một khung thời gian cho trước hoàn toàn xác định. Khung thời gian này được quyết định bởi đặc điểm hoặc yêu cầu của hệ thống, có thể là vài giây và cũng có thể là vài nano giây hoặc nhỏ hơn nữa. Ở đây chúng ta phân biệt yếu tố thời gian gắn liền với khái

Page 7: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

8

niệm về thời gian thực. Không phải hệ thống thực hiện rất nhanh là sẽ đảm bảo được tính thời gian thực vì nhanh hay chậm hoàn toàn là phép so sánh có tính tương đối vì mili giây có thể là nhanh với hệ thống điều khiển nhiệt nhưng lại là chậm đối với các đối tượng điều khiển điện như dòng, áp…. Hơn thế nữa nếu chỉ nhanh không thì chưa đủ mà phải đảm bảo duy trì ổn định bằng một cơ chế hoạt động tin cậy. Chính vì vậy, hệ thống không kiểm soát được hoạt động của nó (bất định) thì không thể là một hệ thống đảm bảo tính thời gian thực mặc dù hệ thống đó có thể cho đáp ứng rất nhanh, thậm chí nhanh hơn rất nhiều so với yêu cầu đặt ra. Một ví dụ minh hoạ tiêu biểu đó là cơ chế truyền thông dữ liệu qua đường truyền chuẩn Ethernet truyền thống, mặc dù ai cũng biết tốc độ truyền là rất nhanh nhưng vẫn không phải hệ hoạt động thời gian thực vì không thoả mãn tính tiền định trong cơ chế truyền dữ liệu (có thể là rất nhanh và cũng có thể là rất chậm nếu có sự canh trạnh và giao thông đường truyền bị nghẽn).

Người ta phân ra làm hai loại đối với khái niệm thời gian thực là cứng (hard real time) và mềm (soft real time). Thời gian thực cứng là khi hệ thống hoạt động với yêu cầu thoả mãn sự ràng buộc trong khung thời gian cứng tức là nếu vi phạm thì sẽ dẫn đến hoạt động của toàn hệ thống bị sai hoặc bị phá huỷ. Ví dụ về hoạt động điều khiển cho một lò phản ứng hạt nhân, nếu chậm ra quyết định có thể dẫn đến thảm hoạ gây ra do phản ứng phân hạch và dẫn đến bùng nổ cả hệ thống. Thời gian thực mềm là khi hệ thống hoạt động với yêu cầu thoả mãn ràng buộc trong khung thời gian mềm, nếu vi phạm và sai lệch nằm trong khoảng cho phép thì hệ thống vẫn có thể hoạt động được và chấp nhận được. Ví dụ như hệ thống phát thanh truyền hình, nếu thông tin truyền đi từ trạm phát tới người nghe/nhìn chậm một vài giây thì cũng không ảnh hưởng đáng kể đến tính thời sự của tin được truyền đi và hoàn toàn được chấp nhận bởi người theo dõi.

Thực tế thấy rằng hầu hết hệ nhúng là các hệ thời gian thực và hầu hết các hệ thời gian thực là hệ nhúng. Điều này phản ánh mối quan hệ mật thiết giữa hệ nhúng và thời gian thực và tính thời gian thực đã trở thành như một thuộc tính tiêu biểu của hệ nhúng. Vì vậy hiện nay khi đề cập tới các hệ nhúng người ta đều nói tới đặc tính cơ bản của nó là tính thời gian thực.

Page 8: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

9

Hình 1.2. Phân bố và quan hệ giữa hệ nhúng và thời gian thực

1.3. Lĩnh vực ứng dụng của hệ nhúng Chúng ta có thể kể ra được rất nhiều các ứng dụng của hệ thống nhúng đang

được sử dụng hiện nay, và xu thể sẽ còn tiếp tục tăng nhanh. Một số các lĩnh vực và sản phẩm thị trường rộng lớn của các hệ nhúng có thể được nhóm như sau:

• Các thiết bị điều khiển • Ôtô, tàu điện • Truyền thông • Thiết bị y tế • Hệ thống đo lường thẩm định • Toà nhà thông minh • Thiết bị trong các dây truyền sản xuất • Rôbốt • ...

1.4. Đặc điểm công nghệ và xu thế phát triển của hệ nhúng 1.4.1 Đặc điểm công nghệ

Như vậy, c ác hệ thống đều có chung một số đặc điểm như yêu cầu về khả năng thời gian thực, độ tin cậy, tính độc lập và hiệu quả. Một câu hỏi đặt ra là tại sao hệ thống nhúng lại phát triển và được phổ cập một cách nhanh chóng như hiện nay. Câu trả lời thực ra nằm ở các yêu cầu tăng lên không ngừng trong các ứng dụng công nghệ hiện nay. Một trong những yêu cầu cơ bản đó là:

Khả năng độc lập và thông minh hoá: Điều này được chỉ rõ hơn thông qua một số các thuộc tính yêu cầu, cụ thể như:

Độ tin cậy Khả năng bảo trì và nâng cấp Sự phổ cập và tiện sử dụng Độ an toàn Tính bảo mật

Page 9: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

10

Hiệu quả: Yêu cầu này được thể hiện thông qua một số các đặc điểm của hệ thống như sau:

Năng lượng tiêu thụ Kích thước về phần cứng và phần mềm Hiệu quả về thời gian thực hiện Khối lượng Giá thành

Phân hoạch tác vụ và chức năng hoá: Các bộ vi xử lý trong các hệ nhúng thường được sử dụng để đảm nhiệm và thực hiện một hoặc một nhóm chức năng rất độc lập, đặc thù cho từng phần chức năng của hệ thống lớn mà nó được nhúng vào. Ví dụ như một vi xử lý thực hiện một phần điều khiển cho một chức năng thu thập, xử lý và hiển thị của ôtô hay hệ thống điều khiển quá trình. Khả năng này làm tăng thêm sự chuyên biệt hoá về chức năng của một hệ thống lớn và dễ dàng hơn cho quá trình xây dựng, vận hành và bảo trì.

Khả năng thời gian thực: Các hệ thống đều gắn liền với việc đảm nhiệm một chức năng chính và phải được thực hiện đúng theo một khung thời gian qui định. Thông thường một chức năng của hệ thống phải được thực hiện và hoàn thành theo một yêu cầu thời gian định trước để đảm bảo thông tin cập nhật kịp thời cho phần xử lý của các chức năng khác và có thể ảnh hưởng trực tiếp tới sự hoạt động đúng và chính xác của toàn hệ thống. Tuỳ thuộc vào từng bài toán và yêu cầu của hệ thống mà yêu cầu về khả năng thời gian thực cũng rất khác nhau.

Tuy nhiên, trong thực tế không phải hệ nhúng nào cũng đều có thể thoả mãn tất cả những yêu cầu nêu trên, vì chúng là kết quả của sự thoả hiệp của nhiều yêu cầu và điều kiện nhằm ưu tiên cho chức năng cụ thể mà chúng được thiết kế. Chính điều này lại càng làm tăng thêm tính chuyên biệt hoá của các hệ/thiết bị nhúng mà các thiết bị đa năng không thể cạnh tranh được. 1.4.2 Xu thế phát triển và sự tăng trưởng của hệ nhúng

Vì sự phát triển hệ nhúng là sự kết hợp nhuần nhuyễn giữa phần cứng và phần mềm nên công nghệ gắn liền với nó cũng chính là công nghệ kết hợp giữa các giải pháp cho phần cứng và mềm. Vì tính chuyên biệt của các thiết bị / hệ nhúng như đã giới thiệu nên các nền phần cứng cũng được chế tạo để ưu tiên đáp ứng cho chức năng hay nhiệm vụ cụ thể của yêu cầu thiết kế đặt ra.

Lớp hệ nhúng ưu tiên phát triển theo tiêu chí về kích thước nhỏ gọn, tiêu thụ năng lượng ít, giá thành thấp. Các chíp xử lý nhúng cho lớp hệ thống ứng dụng đó thường yêu cầu về khả năng tính toán ít hoặc vừa phải nên hầu hết được xây dựng

Page 10: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

11

trên cở sở bộ đồng xử lý 8 bít 16 bit hoặc cùng lắm là 32 bit và không hỗ trợ dấu phảy động do sự hạn chế về dung lượng và khả năng tính toán.

Lớp hệ nhúng ưu tiên thực thi khả năng xử lý tính toán với tốc độ thực hiện nhanh. Các chíp xử lý nhúng cho các hệ thống đó cũng sẽ là các Chip áp dụng các công nghệ cao cấp với kiến trúc xử lý song song để đáp ứng được cường độ tính toán lớn và tốc độ mà các Chip xử lý đa chức năng thông thường không đạt tới được.

Lớp hệ thống ưu tiên cả hai tiêu chí phát triển của hai lớp trên, tức là kích thước nhỏ gọn, mức tiêu thụ năng lượng thấp, tốc độ tính toán nhanh. Tuỳ theo sự thoả hiệp giữa các yêu cầu và xu thế phát triển, chính vì vậy cũng không có gì ngạc nhiên khi chúng ta thấy sự tồn tại song song của rất nhiều các Chip vi xử lý nhúng, vi điều khiển nhúng 8 bit, 16 bit hay 32 bit cùng với các Chíp siêu xử lý khác vẫn đang được ứng dụng rộng rãi cho hệ nhúng. Đó cũng là sự kết hợp đa dạng và sự ra đời của các hệ nhúng nói chung nhằm thoả mãn các ứng dụng phát triển không ngừng.

Với mỗi một nền phần cứng nhúng thường có những đặc thù riêng và kèm theo một giải pháp phát triển phần mềm tối ưu tương ứng. Không có một giải pháp nào chung và chuẩn tắc cho tất cả các hệ nhúng. Chính vì vậy thông thường các nhà phát triển và cung cấp phần cứng cũng lại chính là nhà cung cấp giải pháp phần mềm hoặc công cụ phát triển phần mềm kèm theo. Rất phổ biến hiện nay các Chip vi xử lý hay vi điều khiển đều có các hệ phát triển (Starter Kit hay Emulator) để hỗ trợ cho các nhà ứng dụng và xây dựng hệ nhúng với hiểu biết hạn chế về phần cứng. Ngôn ngữ mã hoã phần mềm cũng thường là C hoặc gần giống như C (Likely C) thay vì phải viết hoàn toàn bằng hợp ngữ Assembly. Điều này cho phép các nhà thiết kế tối ưu và đơn giản hoá rất nhiều cho bước phát triển và xây dựng hệ nhúng.

Trong xu thế phát triển không ngừng và nhằm thoả mãn được nhu cầu phát triển nhanh và hiệu quả có rất nhiều các công nghệ cho phép thực thi các giải pháp hệ nhúng. Đứng sau sự phổ cập rộng rãi của các Chip vi xử lý vi điều khiển nhúng, DSP phải kể đến các công nghệ cũng đang rất được quan tâm hiện nay như ASIC, CPLD, FPGA, PSOC và sự tổ hợp của chúng...Kèm theo đó là các kỹ thuật phát triển phần mềm cho phép đảm nhiệm được các bài toán yêu cầu khắt khe trên cơ sở một nền phần cứng hữu hạn về khả năng xử lý và không gian bộ nhớ. Giải quyết các bài toán thời gian thực như phân chia tác vụ và giải quyết cạnh tranh chia sẻ tài nguyên chung. Hiện nay cũng đã có nhiều nhà phát triển công nghệ phần mềm lớn đang hướng vào thị trường hệ nhúng bao gồm cả

Page 11: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

12

Microsoft. Ngoài một số các hệ điều hành Windows quen thuộc dùng cho PC, Microsoft cũng đã tung ra các phiên bản mini như WindowsCE, WindowsXP Embedded và các công cụ phát triển ứng dụng kèm theo để phục vụ cho các thiết bị nhúng, điển hình như các thiết bị PDA, một số thiết bị điều khiển công nghiệp như các máy tính nhúng, IPC của Siemens...

Có thể nói hệ nhúng đã trở thành một giải pháp công nghệ và phát triển một cách nhanh chóng, hứa hẹn nhiều thiết bị nhúng sẽ chiếm lĩnh được thị trường rộng lớn trong tương lai nhằm đáp ứng nhu cầu ứng dụng không ngừng trong cuộc sống của chúng ta. Đối với lĩnh vực công nghiệp về điều khiển và tự động hoá, hệ nhúng cũng là một giải pháp đầy tiềm năng đã và đang được ứng dụng rộng rãi. Nó rất phù hợp để thực thi các chức năng thông minh hoá, chuyên biệt trong các hệ thống và thiết bị công nghiệp, từ các hệ thống tập trung đến các hệ thống phân tán. Giải pháp hệ nhúng có thể thực thi từ cấp thấp nhất của hệ thống công nghiệp như cơ cấu chấp hành cho đến các cấp cao hơn như giám sát điều khiển quá trình.

1.5. Cấu trúc phần cứng hệ nhúng 1.5.1 .. Các thành phần kiến trúc cơ bản

Hình 1.1. Kiến trúc điển hình của các chíp VXL/VĐK nhúng

1.5.2. Đơn vị xử lý trung tâm CPU

Page 12: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

13

Hình 1.2. Cấu trúc CPU

Người ta vẫn biết tới phần lõi xử lý của các bộ VXL là đơn vị xử lý trung tâm CPU (Central Processing Unit) đóng vai trò như bộ não chịu trách nhiệm thực thi các phép tính và thực hiện các lệnh. Phần chính của CPU đảm nhiệm chức năng này là đơn vị logic toán học (ALU – Arthimetic Logic Unit). Ngoài ra để hỗ trợ cho hoạt động của ALU còn có thêm một số các thành phần khác như bộ giải mã (decoder), bộ tuần tự (sequencer) và các thanh ghi.

Bộ giải mã chuyển đổi (thông dịch) các lệnh lưu trữ ở trong bộ mã chương trình thành các mã mà ALU có thể hiểu được và thực thi. Bộ tuần tự có nhiệm vụ quản lý dòng dữ liệu trao đổi qua bus dữ liệu của VXL. Các thanh ghi được sử dụng để CPU lưu trữ tạm thời các dữ liệu chính cho việc thực thi các lệnh và chúng có thể thay đổi nội dung trong quá trình hoạt động của ALU. Hầu hết các thanh ghi của VXL đều là các bộ nhớ được tham chiếu (mapped) và hội nhập với khu vực bộ nhớ và có thể được sử dụng như bất kỳ khu vực nhớ khác.

Các thanh ghi có chức năng lưu trữ trạng thái của CPU. Nếu các nội dung của bộ nhớ VXL và các nội dung của các thanh ghi tại một thời điểm nào đó được lữu giữ đầy đủ thì hoàn toàn có thể tạm dừng thực hiện phần chương trình hiện tại trong một khoảng thời gian bất kỳ và có thể trở lại trạng thái của CPU trước đó. Thực tế số lượng các thanh ghi và tên gọi của chúng cũng khác nhau trong các họ VXL/VĐK và thường do chính các nhà chế tạo qui định, nhưng về cơ bản chúng đều có chung các chức năng như đã nêu.

Khi thứ tự byte trong bộ nhớ đã được xác định thì người thiết kế phần cứng phải thực hiện một số quyết định xem CPU sẽ lưu dữ liệu đó như thế nào. Cơ chế này cũng

Page 13: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

14

khác nhau tuỳ theo kiến trúc tập lệnh được áp dụng. Có ba loại hình cơ bản:

(1) Kiến trúc ngăn xếp (2) Kiến trúc bộ tích luỹ (3) Kiến trúc thanh ghi mục đích chung

Kiến trúc ngăn xếp sử dụng ngăn xếp để thực hiện lệnh và các toán tử nhận được từ đỉnh ngăn xếp. Mặc dù cơ chế này hỗ trợ mật độ mã tốt và mô hình đơn giản cho việc đánh giá cách thể hiện chương trình nhưng ngăn xếp không thể hỗ trợ khả năng truy nhập ngẫu nhiên và hạn chế hiệu suất thực hiện lệnh.

Kiến trúc bộ tích lũy với lệnh một toán tử ngầm mặc định chứa trong thanh ghi tích luỹ có thể giảm được độ phức tạp bên trong của cấu trúc CPU và cho phép cấu thành lệnh rất nhỏ gọn. Nhưng thanh ghi tích luỹ chỉ là nơi chứa dữ liệu tạm thời nên giao thông bộ nhớ rất lớn.

Kiến trúc thanh ghi mục đích chung sử dụng các tập thanh ghi mục đích chung và được đón nhận như mô hình của các hệ thống CPU mới, hiện đại. Các tập thanh ghi đó nhanh hơn bộ nhớ thường và dễ dàng cho bộ biên dịch xử lý thực thi và có thể được sử dụng một cách hiệu quả. Hơn nữa giá thành phần cứng ngày càng có xu thế giảm đáng kể và tập thanh ghi có thể tăng nhanh. Nếu cơ chế truy nhập bộ nhớ nhanh thì kiến trúc dựa trên ngăn xếp có thể là sự lựa chọn lý tưởng; còn nếu truy nhập bộ nhớ chậm thì kiến trúc thanh ghi sẽ là sự lựa chọn phù hợp nhất.

Một số thanh ghi với chức năng điển hình thường được sử dụng trong các kiến trúc CPU như sau:

Thanh ghi con trỏ ngăn xếp (stack pointer): Thanh ghi này lưu giữ địa chỉ tiếp theo của ngăn xếp. Theo nguyên lý giá trị địa

chỉ chứa trong thanh ghi con trỏ ngăn xếp sẽ giảm nếu dữ liệu được lưu thêm vào ngăn xếp và sẽ tăng khi dữ liệu được lấy ra khỏi ngăn xếp.

Thanh ghi chỉ số (index register): Thanh ghi chỉ số được sử dụng để lưu địa chỉ khi mode địa chỉ được sử dụng. Nó

còn được biết tới với tên gọi là thanh ghi con trỏ hay thanh ghi lựa chọn tệp (Microchip).

Thanh ghi địa chỉ lệnh /Bộ đếm chương trình (Program Counter): Một trong những thanh ghi quan trọng nhất của CPU là thanh ghi bộ đếm

chương trình. Thanh ghi bộ đếm chương trình lưu địa chỉ lệnh tiếp theo của chương trình sẽ được CPU xử lý. Mỗi khi lệnh được trỏ tới và được CPU xử lý thì nội dung giá trị của thanh ghi bộ đếm chương trình sẽ tăng lên một. Chương trình sẽ kết thúc khi

Page 14: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

15

thanh ghi PC có giá trị bằng địa chỉ cuối cùng của chương trình nằm trong bộ nhớ chương trình.

Thanh ghi tích lũy (Accumulator): Thanh ghi tích lũy là một thanh ghi giao tiếp trực tiếp với ALU, được sử dụng để

lưu giữ các toán tử hoặc kết quả của một phép toán trong quá trình hoạt động của ALU. 1.5.3. Xung nhịp và trạng thái tín hiệu

Trong VXL và các vi mạch số nói chung, hoạt động của hệ thống được thực hiện đồng bộ hoặc dị bộ theo các xung nhịp chuẩn. Các nhịp đó được lấy trực tiếp hoặc gián tiếp từ một nguồn xung chuẩn thường là các mạch tạo xung hoặc dao động thạch anh. Để mô tả hoạt động của hệ thống, các tín hiệu dữ liệu và điều khiển thường được mô tả trạng thái theo giản đồ thời gian và mức tín hiệu như được chỉ ra trong Hình 2 3: Mô tả và trạng thái tín hiệu hoạt động trong VXL

Hình 1.3. Mô tả và trạng thái tín hiệu hoạt động trong VXL

Mục đích của việc mô tả trạng thái tín hiệu theo giản đồ thời gian và mức tín hiệu là để phân tích và xác định chuỗi sự kiện hoạt động chi tiết trong mỗi chu kỳ bus. Nhờ việc mô tả này chúng ta có thể xem xét đến khả năng đáp ứng thời gian của các sự kiện thực thi trong hệ thống và thời gian cần thiết để thực thi hoạt động tuần tự cũng như là khả năng tương thích khi có sự hoạt động phối hợp giữa các thiết bị ghép nối hay mở rộng trong hệ thống. Thông thường thông tin về các nhịp thời gian hoạt động cũng như đặc tính kỹ thuật chi tiết được cung cấp hoặc qui định bởi các nhà chế tạo.

Một số đặc trưng về thời gian của các trạng thái hoạt động cơ bản của các tín hiệu hệ thống gồm có như sau:

Thời gian tăng hoặc giảm Thời gian trễ lan truyền tín hiệu Thời gian thiết lập Thời gian giữ Trễ cấm hoạt động và trạng thái treo (Tri State) Độ rộng xung

Page 15: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

16

Tần số nhịp xung hoạt động Thời gian tăng hoặc giảm

Hình 1.4. Mô tả trạng thái tín hiệu logic tăng và giảm

Thời gian tăng được định nghĩa là khoảng thời gian để tín hiệu tăng từ 20% đến 80% mức tín hiệu cần thiết. Thời gian giảm là khoảng thời gian để tín hiệu giảm từ 80% đến 20% mức tín hiệu cần thiết. Thời gian trễ lan truyền:

Là khoảng thời gian tín từ khi thay đổi tín hiệu vào cho tới khi có sự thay đổi tín hiệu ở đầu ra. Đặc tính này thường do cấu tạo và khả năng truyền dẫn tín hiệu vật lý trong hệ thống tín hiệu.

Hình 1.5. Mô tả trạng thái và độ trễ lan truyền tín hiệu

Thời gian thiết lập và lưu giữ Khoảng thời gian cần thiết để tín hiệu trích mẫu đạt tới một trạng thái ổn định

trước khi nhịp xung chuẩn đồng hồ thay đổi được gọi là thời gian thiết lập. Thời gian lưu giữ là khoảng thời gian cần thiết để duy trì tín hiệu trích mẫu ổn định sau khi xung nhịp chuẩn đồng hồ thay đổi. Thực chất khoảng thời gian thiết lập và thời gian lưu giữ là cần thiết để đảm bảo tín hiệu được ghi nhận chính xác và ổn định trong quá trình hoạt động và chuyển mức trạng thái. Giản đồ thời gian trong Hình 2.6: Thời gian thiết lập và lưu giữ minh họa thời gian thiết lập và lưu giữ trong hoạt động của Triger D.

Hình 1.6. Thời gian thiết lập và lưu giữ

Page 16: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

17

Trong trường hợp hoạt động chuyển trạng thái tín hiệu không đồng bộ và không đảm bảo được thời gian thiết lập và lưu giữ sẽ có thể dẫn đến sự mất ổn định hay không xác định mức tín hiệu trong hệ thống. Hiện tượng này được biết tới với tên gọi là metastabilit. Để minh họa cho hiện tượng này trong Hình 2 7 mô tả hoạt động lỗi của một Triger khi các mức tín hiệu vào không thỏa mãn yêu cầu về thời thiết lập và lưu giữ.

Hình 1.7. Hiện tượng Metastabilit trong hoạt động của Triger D

Chu kỳ tín hiệu 3 trạng thái và contention

Hình 1.8. Mô tả chu kỳ tín hiệu 3 trạng thái và contention

Độ rộng xung và tần số nhịp xung chuẩn

Hình 1.9. Độ rộng và tần số xung nhịp chuẩn

1.5.4. Bus địa chỉ, dữ liệu và điều khiển Bus địa chỉ Bus địa chỉ là các đường dẫn tín hiệu logic một chiều để truyền địa chỉ tham

chiếu tới các khu vực bộ nhớ và chỉ ra dữ liệu được lưu giữ ở đâu trong không gian bộ nhớ. Trong qúa trình hoạt động CPU sẽ điều khiển bus địa chỉ để truyền dữ liệu giữa các khu vực bộ nhớ và CPU. Các địa chỉ thông thường tham chiếu tới các khu vực bộ nhớ hoặc các khu vực vào ra, hoặc ngoại vi. Dữ liệu được lưu ở các

Page 17: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

18

khu vực đó thường là 8 bit (1 byte), 16 bit, hoặc 32 bit tùy thuộc vào cấu trúc từng loại vi xử lý/vi điều khiển. Hầu hết các vi điều khiển thường đánh địa chỉ dữ liệu theo khối 8 bit. Các loại vi xử lý 8 bit, 16 bit và 32 bit nói chung cũng đều có thể làm việc trao đổi với kiểu dữ liệu 8 bit và 16 bit.

Chúng ta vẫn thường được biết tới khái niệm địa chỉ truy nhập trực tiếp, đó là khả năng CPU có thể tham chiếu và truy nhập tới trong một chu kỳ bus. Nếu vi xử lý

có N bit địa chỉ tức là nó có thể đánh địa chỉ được 2N khu vực mà CPU có thể tham chiếu trực tiếp tới. Qui ước các khu vực được đánh địa chỉ bắt đầu từ địa chỉ

0 và tăng dần đến 2N 1. Hiện nay các vi xử lý và vi điều khiển nói chung chủ yếu vẫn sử dụng phổ biến các bus dữ liệu có độ rộng là 16, 20, 24, hoặc 32 bit. Nếu

đánh địa chỉ theo byte thì một vi xử lý 16 bit có thể đánh địa chỉ được 216 khu vực bộ nhớ tức là 65,536 byte = 64Kbyte. Tuy nhiên có một số khu vực bộ nhớ mà CPU không thể truy nhập trực tiếp tới tức là phải sử dụng nhiều nhịp bus để truy nhập, thông thường phải kết hợp với việc điều khiển phần mềm. Kỹ thuật này chủ yếu được sử dụng để mở rộng bộ nhớ và thường được biết tới với khái niệm đánh địa chỉ trang nhớ khi nhu cầu đánh địa chỉ khu vực nhớ vượt quá phạm vi có thể đánh địa chỉ truy nhập trực tiếp.

Ví dụ: CPU 80286 có 24 bit địa chỉ sẽ cho phép đánh địa chỉ trực tiếp cho

224 byte (16 Mbyte) nhớ. CPU 80386 và các loại vi xử lý mạnh hơn có không gian

địa chỉ 32 bit sẽ có thể đánh được tới 232 byte (4Gbyte) địa chỉ trực tiếp. Bus dữ liệu Bus dữ liệu là các kênh truyền tải thông tin theo hai chiều giữa CPU và bộ nhớ

hoặc các thiết bị ngoại vi vào ra. Bus dữ liệu được điều khiển bởi CPU để đọc hoặc viết các dữ liệu hoặc mã lệnh thực thi trong qúa trình hoạt động của CPU. Độ rộng của bus dữ liệu nói chung sẽ xác định được lượng dữ liệu có thể truyền và trao đổi trên bus. Tốc độ truyền hay trao đổi dữ liệu thường được tính theo đơn vị là [byte/s]. Số lượng đường bit dữ liệu sẽ cho phép xác định được số lượng bit có thể lưu trữ trong mỗi khu vực tham chiếu trực tiếp. Nếu một bus dữ liệu có khả năng thực hiện một lần truyền trong 1 μs, thì bus dữ liệu 8 bit sẽ có băng thông là 1Mbyte/s, bus 16 bit sẽ có băng thông là 2Mbyte/s và bus 32 bit sẽ có băng thông là 4Mbyte/s. Trong trường hợp bus dữ liệu 8 bit với chu kỳ bus là T=1μs (tức là sẽ truyền được 1byte/1chu kỳ) thì sẽ truyền được 1 Mbyte trong 1s hay 2 Mbyte trong 2s.

Bus điều khiển

Page 18: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

19

Bus điều khiển phục vụ truyền tải các thông tin dữ liệu để điều khiển hoạt động của hệ thống. Thông thường các dữ liệu điều khiển bao gồm các tín hiệu chu kỳ để đồng bộ các nhịp chuyển động và hoạt động của hệ thống. Bus điều khiển thường được điều khiển bởi CPU để đồng bộ hóa nhịp hoạt động và dữ liệu trao đổi trên các bus. Trong trường hợp vi xử lý sử dụng dồn kênh bus dữ liệu và bus địa chỉ tức là một phần hoặc toàn bộ bus dữ liệu sẽ được sử dụng chung chia sẻ với bus địa chỉ thì cần một tín hiệu điều khiển để phân nhịp truy nhập cho phép chốt lưu trữ thông tin địa chỉ mỗi khi bắt đầu một chu kỳ truyền. Một ví dụ về các chu kỳ bus và sự đồng bộ của chúng trong hoạt động của hệ thống bus địa chỉ và dữ liệu dồn kênh được chỉ ra trong Hình 2.10. Đây là hoạt động điển hình trong họ vi điều khiển 8051 và nhiều loại tương tự.

Hình 1.10. Chu kỳ hoạt động bus dồn kênh

1.4.5. Bộ nhớ Kiến trúc bộ nhớ Kiến trúc bộ nhớ được chia ra làm hai loại chính và được áp dụng rộng rãi

trong hầu hết các Chip xử lý nhúng hiện nay là kiến trúc bộ nhớ von Neumann và Havard.

Trong kiến trúc von Neumann không phân biệt vùng chứa dữ liệu và mã chương trình. Cả chương trình và dữ liệu đều được truy nhập theo cùng một đường. Điều này cho phép đưa dữ liệu vào vùng mã chương trình ROM, và cũng có thể lưu mã chương trình vào vùng dữ liệu RAM và thực hiện từ đó.

Hình 1.11.Kiến trúc bộ nhớ von Neumann và Havard

Page 19: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

20

Kiến trúc Havard tách/phân biệt vùng lưu mã chương trình và dữ liệu. Mã chương trình chỉ có thể được lưu và thực hiện trong vùng chứa ROM và dữ liệu cũng chỉ có thể lưu và trao đổi trong vùng RAM. Hầu hết các vi xử lý nhúng ngày nay sử dụng kiến trúc bộ nhớ Havard hoặc kiến trúc Havard mở rộng (tức là bộ nhớ chương trình và dữ liệu tách biệt nhưng vẫn cho phép khả năng hạn chế để lấy dữ liệu ra từ vùng mã chương trình). Trong kiến trúc bộ nhớ Havard mở rộng thường sử dụng một số lượng nhỏ các con trỏ để lấy dữ liệu từ vùng mã chương trình theo cách nhúng vào trong các lệnh tức thời. Một số Chip vi điều khiển nhúng tiêu biểu hiện nay sử dụng cấu trúc Havard là 8031, PIC, Atmel AVR90S. Nếu sử dụng Chip 8031 chúng ta sẽ nhận thấy điều này thông qua việc truy nhập lấy dữ liệu ra từ vùng dữ liệu RAM hoặc từ vùng mã chương trình. Chúng ta có một vài con trỏ được sử dụng để lấy dữ liệu ra từ bộ nhớ dữ liệu RAM, nhưng chỉ có duy nhất một con trỏ DPTR có thể được sử dụng để lấy dữ liệu ra từ vùng mã chương trình. Hình 2 11 mô tả nguyên lý kiến trúc của bộ nhớ von Neumann và Harvard.

Ưu điểm nổi bật của cấu trúc bộ nhớ Harvard so với kiến trúc von Neumann là có hai kênh tách biệt để truy nhập vào vùng bộ nhớ mã chương trình và dữ liệu nhờ vậy mà mã chương trình và dữ liệu có thể được truy nhập đồng thời và làm tăng tốc độ luồng trao đổi với bộ xử lý.

Hình 1.12. Nguyên lý điều khiển tách kênh truy nhập bus địa chỉ và bus dữ liệu

Bộ nhớ chương trình – PROM (Programmable Read Only Memory) Vùng để lưu mã chương trình. Có ba loại bộ nhớ PROM thông dụng được sử

dụng cho hệ nhúng và sẽ được giới thiệu lần lượt sau đây.

o EPROM Bao gồm một mảng các transistor khả trình. Mã chương trình sẽ được ghi trực

Page 20: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

21

tiếp và vi xử lý có thể đọc ra để thực hiện. EPROM có thể xoá được bằng tia cực tím và có thể được lập trình lại. Cấu trúc vật lý của EPROM được mô tả như trong Hình 2.13.

Hình 1.13. Nguyên lý cấu tạo và hoạt động xoá của EPROM

o Bộ nhớ Flash Cũng giống như EPROM được cấu tạo bởi một mảng transistor khả trình nhưng

có thể xoá được bằng điện và chính vì vậy có thể nạp lại chương trình mà không cần tách ra khỏi nền phần cứng VXL. Ưu điểm của bộ nhớ flash là có thể lập trình trực tiếp trên mạch cứng mà nó đang thực thi trên đó.

Hình 1.14. Sơ đồ nguyên lý ghép nối EPROM với VXL

o Bộ nhớ dữ liệu - RAM Vùng để lưu hoặc trao đổi dữ liệu trung gian trong quá trình thực hiện chương

trình

Page 21: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

22

Hình 1.15. Cấu trúc nguyên lý bộ nhớ RAM

Có hai loại SRAM và DRAM

Hình 1.16. Cấu trúc một phần tử nhớ DRAM

Hình 1.17. Nguyên lý ghép nối (mở rộng) RAM với VXL

1.5.6. Không gian và phân vùng địa chỉ 1.5.6.1. Ngoại vi

Bộ định thời gian/Bộ đếm Hầu hết các chip vi điều khiển ngày nay đều có ít nhất một bộ định thời gian/bộ đếm có thể cấu hình hoạt động linh hoạt theo các mode phục vụ nhiều mục đích trong các ứng dụng xử lý, điều khiển. Các bộ định thời gian cho phép tạo ra các chuỗi

Page 22: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

23

xung và ngắt thời gian hoặc đếm theo các khoảng thời gian có thể lập trình. Chúng thường được ứng dụng phổ biến trong các nhiệm vụ đếm xung, đo khoảng thời gian các sự kiện, hoặc định chu kỳ thời gian thực thi các tác vụ. Một trong những ứng dụng quan trọng của bộ định thời gian là tạo nhịp từ bộ tạo xung thạch anh cho bộ truyền thông dị bộ đa năng hoạt động. Thực chất đó là ứng dụng để thực hiện phép chia tần số. Để đạt được độ chính xác, tần số thạch anh thường được chọn sao cho các phép chia số nguyên được thực hiện chính xác đảm bảo cho tốc độ truyền thông dữ liệu được tạo ra chính xác. Chính vì vậy họ vi điều khiển 80C51 thường hay sử dụng thạch anh có tần số dao động là 11.059 thay vì 12MHz để tạo ra nhịp hoạt động truyền thông tốc độ chuẩn 9600.

Hình 1.18. Bộ định thời/ bộ đếm 8 bit của AVR

Bộ điều khiển ngắt Ngắt là một sự kiện xảy ra làm dừng hoạt động chương trình hiện tại để phục

vụ thực thi một tác vụ hay một chương trình khác. Cơ chế ngắt giúp CPU làm tăng tốc độ đáp ứng phục vụ các sự kiện trong chương trình hoạt động của VXL/VĐK. Các VĐK khác nhau sẽ định nghĩa các nguồn tạo ngắt khác nhau nhưng đều có chung một cơ chế hoạt động ví dụ như ngắt truyền thông nối tiếp, ngắt bộ định thời gian, ngắt cứng, ngắt ngoài...Khi một sự kiện yêu cầu ngắt xuất hiện, nếu được chấp nhận CPU sẽ lưu cất trạng thái hoạt động cho chương trình hiện tại đang thực hiện ví dụ như nội dung bộ đếm chương trình (con trỏ lệnh) các nội dung thanh ghi lưu dữ liệu điều khiển chương trình nói chung để thực thi chương trình phục vụ tác vụ cho sự kiện ngắt. Thực chất quá trình ngắt là CPU nhận dạng tín hiệu ngắt, nếu chấp nhận sẽ đưa con trỏ lệnh chương trình trỏ tới vùng mã chứa

Page 23: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

24

chương trình phục vụ tác vụ ngắt. Vì vậy mỗi một ngắt đều gắn với một vector ngắt như một con trỏ lưu thông tin địa chỉ của vùng bộ nhớ chứa mã chương trình phục vụ tác vụ của ngắt. CPU sẽ thực hiện chương trình phục vụ tác vụ ngắt đến khi nào gặp lệnh quay trở về chương trình trước thời điểm sự kiện ngắt xảy ra. Có thể phân ra 2 loại nguồn ngắt: Ngắt cứng và Ngắt mềm.

o Ngắt mềm Ngắt mềm thực chất thực hiện một lời gọi hàm đặc biệt mà được kích hoạt

bởi các nguồn ngắt là các sự kiện xuất hiện từ bên trong chương trình và ngoại vi tích hợp trên Chip ví dụ như ngắt thời gian, ngắt chuyển đổi A/D, … Cơ chế ngắt này còn được hiểu là loại thực hiện đồng bộ với chương trình vì nó được kích hoạt và thực thi tại các thời điểm xác định trong chương trình. Hàm được gọi sẽ thực thi chức năng tương ứng với yêu cầu ngắt. Các hàm đó thường được trỏ bởi một vector ngắt mà đã được định nghĩa và gán cố định bởi nhà sản xuất Chip. Ví dụ như hệ điều hành của PC sử dụng ngắt số 21hex để gán cho ngắt truy nhập đọc dữ liệu từ đĩa cứng và xuất dữ liệu ra máy in.

o Ngắt cứng Ngắt cứng có thể được xem như là một lời gọi hàm đặc biệt trong đó nguồn kích

hoạt là một sự kiện đến từ bên ngoài chương trình thông qua một cấu trúc phần cứng (thường được kết nối với thế giới bên ngoài qua các chân ngắt). Ngắt cứng thường được hiểu hoạt động theo cơ chế dị bộ vì các sự kiện ngắt kích hoạt từ các tín hiệu ngoại vi bên ngoài và tương đối độc lập với CPU, thường là không xác định được thời điểm kích hoạt. Khi các ngắt cứng được kích hoạt CPU sẽ nhận dạng và thực hiện lời gọi hàm thực thi chức năng phục vụ sự kiện ngắt tương ứng.

Trong các cơ chế ngắt khoảng thời gian từ khi xuất hiện sự kiện ngắt (có yêu cầu phục vụ ngắt) tới khi dịch vụ ngắt được thực thi là xác định và tuỳ thuộc vào công nghệ phần cứng xử lý của Chip.

Bộ định thời chó canh – Watchdog Timer Thông thường khi có một sự cố xảy ra làm hệ thống bị treo hoặc chạy quẩn,

CPU sẽ không thể tiếp tục thực hiện đúng chức năng. Đặc biệt khi hệ thống phải làm việc ở chế độ vận hành tự động và không có sự can thiệp trực tiếp thường xuyên bởi người vận hành. Để thực hiện cơ chế tự giám sát và phát hiện sự cố phần mềm, một số VXL/VĐK có thêm một bộ định thời chó canh. Bản chất đó là một bộ định thời đặc biệt để định nghĩa một khung thời gian hoạt động bình thường của hệ thống. Nếu có sự cố phần mềm xảy ra sẽ làm hệ thống bị treo khi đó bộ định thời chó canh sẽ phát hiện và giúp hệ thống thoát khỏi trạng thái đó bằng cách thực

Page 24: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

25

hiện khởi tạo lại chương trình. Chương trình hoạt động khi có bộ định thời phải đảm bảo reset nó trước khi khung thời gian bị vi phạm. Khung thời gian này được định nghĩa phụ thuộc vào sự đánh giá của người thực hiện phần mềm, thiết lập khoảng thời gian đảm bảo chắc chắn hệ thống thực hiện bình thường không có sự cố phần mềm.

Có một số cơ chế thực hiện cài đặt bộ định thời cho canh để giám sát hoạt động của hệ thống như sau:

Hình 1.19. Sơ đồ nguyên lý hoạt động của bộ định thời chó canh

(a) (b) Hình 1.20. Nguyên lý hoạt động bộ định thời chó canh

Bộ điều khiển truy nhập bộ nhớ trực tiếp – DMA DMA (Direct Memory Access) là cơ chế hoạt động cho phép hai hay nhiều vi

xử lý hoặc ngoại vi chia sẻ bus chung. Thiết bị nào đang có quyền điều khiển bus sẽ có thể toàn quyền truy nhập và trao đổi dữ liệu trực tiếp với các bộ nhớ như hệ

Page 25: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

26

thống có một vi xử lý. Ứng dụng phổ biến nhất của DMA là chia sẻ bộ nhớ chung giữa hai bộ vi xử lý hoặc các ngoại vi để truyền dữ liệu trực tiếp giữa thiết bị ngoại vi vào/ra và bộ nhớ dữ liệu của VXL.

Truy nhập bộ nhớ trực tiếp được sử dụng để đáp ứng nhu cầu trao đổi dữ liệu vào ra tốc độ cao giữa ngoại vi với bộ nhớ. Thông thường các ngoại vi kết nối với hệ thống phải chia sẻ bus dữ liệu và được điều khiển bởi CPU trong quá trình trao đổi dữ liệu. Điều này làm hạn chế tốc độ trao đổi, để tăng cường tốc độ và loại bỏ sự can thiệp của CPU, đặc biệt trong trường hợp cần truyền một lượng dữ liệu lớn. Cơ chế hoạt động DMA được mô tả như trong Hình 2.21. Thủ tục được bắt đầu bằng việc yêu cầu thực hiện DMA với CPU. Sau khi xử lý, nếu được chấp nhận CPU sẽ trao quyền điều khiển bus cho ngoại vi và thực hiện quá trình trao đổi dữ liệu. Sau khi thực hiện xong CPU sẽ nhận được thông báo và nhận lại quyền điều khiển bus. Trong cơ chế DMA, có hai cách để truyền dữ liệu: kiểu DMA chu kỳ đơn, và kiểu DMA chu kỳ nhóm (burst).

Hình 1.21. Nhịp hoạt động DMA

o DMA chu kỳ đơn và nhóm Trong kiểu hoạt động DMA chu kỳ nhóm, ngoại vi sẽ nhận được quyền điều

khiển và truyền khối dữ liệu rồi trả lại quyền điều khiển cho CPU. Trong cơ chế DMA chu kỳ đơn ngoại vi sau khi nhân được quyền điều khiển bus chỉ truyền một từ dữ liệu rồi trả lại ngay quyền kiểm soát bộ nhớ và bus dữ liệu cho CPU. Trong cơ chế thực hiện DMA cần có một bước xử lý để quyết định xem thiết bị nào sẽ đươc nhận quyền điều khiển trong trường hợp có nhiều hơn một thiết bị có nhu cầu sử dụng DMA. Thông thường kiểu DMA chu kỳ nhóm cần ít dữ liệu thông tin điều

Page 26: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

27

khiển (overhead) nên có khả năng trao đổi với tốc độ cao nhưng lại chiếm nhiều thời gian truy nhập bus do truyền cả khối dữ liệu lớn. Điều này có thể ảnh hưởng đến hoạt động của cả hệ thống do trong suốt quá trình thực hiện DMA nhóm, CPU sẽ bị khoá quyền truy nhập bộ nhớ và không thể xử lý các nhiệm vụ khác của hệ thống mà có nhu cầu bộ nhớ, ví dụ như các dịch vụ ngắt, hoặc các tác vụ thời gian thực...

o Chu kỳ rỗi (Cycle Stealing) Trong kiểu này DMA sẽ được thực hiện trong những thời điểm chu kỳ bus mà

CPU không sử dụng bus do đó không cần thực hiện thủ tục xử lý cấp phát quyền truy nhập và thực hiện DMA.

Hầu hết các vi xử lý hiện đại đều sử dụng gần như 100% dung lượng bộ nhớ và băng thông của bus nên sẽ không có nhiều thời gian dành cho DMA thực hiện. Để tiết kiệm và tối ưu tài nguyên thì cần có một trọng tài phân xử và dữ liệu sẽ được truyền đi xếp chồng theo thời gian. Nói chung kiểu DMA dạng burst hiệu quả nhất khi khoảng thời gian cần thực hiện DMA tương đối nhỏ. Trong khoảng thời gian thực hiện DMA, toàn bộ băng thông của bus sẽ được sử dụng tối đa và toàn bộ khối dữ liệu sẽ được truyền đi trong một khoảng thời gian rất ngắn. Nhưng nhược điểm của nó là nếu dữ liệu cần truyền lớn và cần một khoảng thời gian dài thì sẽ dẫn đến việc block CPU và có thể bỏ qua việc xử lý các sự kiện và tác vụ khác. Đối với DMA chu kỳ đơn thì yêu cầu truy nhập bộ nhớ, truyền một từ dữ liệu và giải phóng bus. Cơ chế này cho phép thực hiện truyền interleave và được biết tới với tên gọi inteleaved DMA. Kiểu truyền DMA chu kỳ đơn phù hợp để truyền dữ liệu trong một khoảng thời gian dài mà có đủ thời gian để yêu cầu truy nhập và giải phóng bus cho mỗi lần truyền một từ dữ liệu. Chính vì vậy sẽ giảm băng thông truy nhập bus do phải mất nhiều thời gian để yêu cầu truy nhập và giải phóng bus. Trong trường hợp này CPU và các thiết bị khác vẫn có thể chia sẻ và truyền dữ liệu nhưng trong một dải băng thông hẹp. Trong nhiều hệ thống bus thực hiện cơ chế xử lý và giải quyết yêu cầu truy nhập (trọng tài) thông qua dữ liệu truyền vì vậy cũng không ảnh hưởng nhiều đến tốc độ truyền DMA.

DMA được yêu cầu khi khả năng điều khiển của CPU để truyền dữ liệu thực hiện quá chậm. DMA cũng thực sự có ý nghĩa khi CPU đang phải thực hiện các tác vụ khác mà không cần nhu cầu truy nhập bus.

1.6. Một số nền phần cứng nhúng thông dụng (µP/DSP/PLA) Trong phần này giới thiệu ngắn gọn cấu trúc nguyên lý của các chip xử lý

nhúng ứng dụng trong các nền phần cứng nhúng hiện nay. Sự phát triển nhanh chóng các chủng loại Chip khả trình với mật độ tích hợp

Page 27: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

28

cao đã và đang có một tác động đáng kể đến sự thay đổi trong việc thiết kế các nền phần cứng thiết bị xử lý và điều khiển số trong thập kỷ gần đây. Mỗi chủng loại đều có những đặc điểm và phạm vi đối tượng ứng dụng và luôn không ngừng phát triển để đáp ứng một cách tốt nhất cho các yêu cầu công nghệ. Chúng đang hướng tới tập trung cho một thị trường công nghệ tiềm năng rộng lớn đó là các thiết bị xử lý và điều khiển nhúng. Trong bài viết này tác giả giới thiệu ngắn gọn về các chủng loại chip xử lý, điều khiển nhúng điển hình đang tồn tại và phát triển về một số đặc điểm và hướng phạm vi ứng dụng của chúng.

Có thể kể ra hàng loạt các Chíp khả trình có thể sử dụng cho các bài toán thiết kế hệ nhúng như các họ vi xử lý/vi điều khiển nhúng (Microprocessor/ Microcontroller), Chip DSP (Digital Signal Processing), các Chip khả trình trường (FPD – Field Programmable Device). Chúng ta dễ bị choáng ngợp nếu bắt đầu công việc thiết kế bằng việc tìm kiếm một Chip xử lý điều khiển phù hợp cho ứng dụng. Vì vậy cần phải có một hiểu biết và sự phân biệt về đặc điểm và ứng dụng của chúng khi lựa chọn và thiết kế. Các thông tin liên quan như nhà sản xuất cung cấp Chip, các kiến thức và công cụ phát triển kèm theo…Một số chủng loại Chip điển hình sẽ được giới thiệu. 1.6.1. Chip Vi xử lý/Vi điều khiển nhúng

Đây là một chủng loại rất điển hình và đang được sử dụng rất phổ biến hiện này. Chúng được ra đời và sử dụng theo sự phát triển của các Chip xử lý ứng dụng cho máy tính. Vì đối tượng ứng dụng là các thiết bị nhúng nên cấu trúc cũng được thay đổi theo để đáp ứng các ứng dụng. Hiện nay chúng ta có thể thấy các họ vi xử lý điều khiển của rất nhiều các nhà chế tạo cung cấp như, Intel, Atmel, Motorola, Infineon. Về cấu trúc, chúng cũng tương tự như các Chíp xử lý phát triển cho PC nhưng ở mức độ đơn giản hơn nhiều về công năng và tài nguyên. Phổ biến vẫn là các Chip có độ rộng bus dữ liệu là 8 bit, 16 bit, 32 bit. Về bản chất cấu trúc, Chip vi điều khiển là chip vi xử lý được tích hợp thêm các ngoại vi. Các ngoại vi thường là các khối chức năng ngoại vi thông dụng như bộ định thời gian, bộ đếm, bộ chuyển đổi A/D, giao diện song song, nối tiếp…Mức độ tích hợp ngoại vi cũng khác nhau tuỳ thuộc vào mục đích ứng dụng sẽ có thể tìm được Chip phù hợp. Thực tế với các ứng dụng yêu cầu độ tích hợp cao thì sẽ sử dụng giải pháp tích hợp trên chip, nếu không thì hầu hết các Chip đều cung cấp giải pháp để mở rộng ngoại vi đáp ứng cho một số lượng ứng dụng rộng và mềm dẻo.

Page 28: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

29

Hình 1.35. Kiến trúc nguyên lý của VĐK với cấu trúc Havard

Ví dụ về kiến trúc của họ VĐK AVR

Hình 1.36. Kiến trúc của họ VĐK AVR

Page 29: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

30

Hình 1.37. Sở đồ khối chức năng kiến trúc PIC16F873A

1.6.2. Chip DSP DSP vẫn được biết tới như một loại vi điều khiển đặc biệt với khả năng xử lý

nhanh để phục vụ các bài toán yêu cầu khối lượng và tốc độ xử lý tính toán lớn. Với ưu điểm nổi bật về độ rộng băng thông của bus và thanh ghi tích luỹ, cho phép ALU xử lý song song với tốc độ đọc và xử lý lệnh nhanh hơn các loại vi điều khiển thông thường. Chip DSP cho phép thực hiện nhiều lệnh trong một nhịp nhờ vào kiến trúc bộ nhớ Havard.

Thông thường khi phải sử dụng DSP tức là để đáp ứng các bài toán tính toán lớn và tốc độ cao vì vậy định dạng biểu diễn toán học sẽ là một yếu tố quan trọng để phân loại và được quan tâm. Hiện nay chủ yếu chúng vẫn được phân loại theo hai kiểu là dấu phảy động và dấu phảy tĩnh. Đây cũng chính là một yếu tố quan trọng phải quan tâm đối với người thiết kế để lựa chọn được một DSP phù hợp với ứng dụng của mình. Các loại DSP dấu phảy tĩnh thường là loại 16 bit hoặc 24 bit còn các loại dấu phảy tĩnh thường là 32 bit. Một ví dụ điển hình về một DSP 16 bit dấu phảy tĩnh là TMS320C55x, lưu các số nguyên 16 bit hoặc các số thực trong một miền giá trị cố định. Tuy nhiên các giá trị và hệ số trung gian có thể được lưu trữ với độ chính xác là 32 bit trong thanh ghi tích luỹ 40 bit nhằm giảm thiểu lỗi tính toán do phép làm tròn trong quá trính tính toán. Thông thường các loại DSP

Page 30: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

31

dấu phảy tĩnh có giá thành rẻ hơn các loại DSP dấu phảy động vì yêu cầu số lượng chân On chip ít hơn và cần sử dụng lượng silicon ít hơn.

Ưu điểm nổi bật của các DSP dấu phảy động là có thể xử lý và biểu diễn số trong dải phạm vi giá trị rộng và động. Do đó vấn đề về chuyển đổi và hạn chế về phạm vi biểu diễn số không phải quan tâm như đối với loại DSP dấu phảy tĩnh. Một loại DSP 32 bit dấu phảy tĩnh điển hình là TMS320C67x có thể xử lý và biểu diễn số gồm 24 bit mantissa và 8 bit exponent. Phần mantissa biểu diễn phần số lẻ trong phạm vi 1.0 – +1.0 và phần exponent biểu diễn vị trí của dấu phảy nhị phân và có thể dịch chuyển sang trái hoặc phải tuỳ theo giá trị số mà nó biểu diễn. Điều này trái ngược với các thiết kế trên nền DSP dấu phảy tĩnh, người phát triển chương trình phải tự qui ước, tính toán và phân chia ấn định thang biểu diễn số và phải luôn lưu tâm tới khả năng tràn số có thể xảy ra trong quá trình xử lý tính toán. Chính điều này đã gây ra khó khăn không nhỏ đối với người lập trình. Nói chung phát triển chương trình cho DSP dấu phảy động thường đơn giản hơn nhưng giá thành lại cao hơn nhiều và năng lượng tiêu thụ thông thường cũng lớn hơn.

Ví dụ độ chính xác của DSP dấu phảy động 32 bit là 2−23 với 24 bit biểu

diễn phần mantissa. Vùng động là 1.18 ×10−38 ≤ x ≤ 3.4 × 1038. Những nhà thiết kế hệ thống phải quyết định vùng và độ chính xác cần thiết

cho các ứng dụng. Các vi xử lý dấu phảy động thường được sử dụng cho các ứng dụng yêu cầu về độ chính xác cao và dải biểu diễn số lớn phù hợp với hệ thống có cấu trúc bộ nhớ lớn. Hơn nữa các DSP dấu phảy động cho phép phát triển phần mềm hiệu quả và đơn giản hơn bằng các trình biên dịch ngôn ngữ bậc cao như C do đó có thể giảm được giá thành và thời gian phát triển. Tuy nhiên giá thành lại cao nên các DSP dấu phảy động phù hợp với các ứng dụng khá đặc biệt và thường là với số lượng ít.

Page 31: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

32

Hình 1.38. Giản đồ khối chức năng của DSP TMS320C28xx

1.6.3. PAL Ngày nay khi nói đến các chủng loại Chip khả trình mảng ta thường biết tới một

số tên gọi như PAL, CPLD, FPGA…Một chút lược sử về sự ra đời và phát triển sau đây sẽ giúp chúng ta hình dung được đặc điểm và nguồn gốc ra đời của chúng.

Hình 1.39. Cấu trúc PROM và PAL

Lịch sử phát triển của các chủng loại Chip khả trình mảng PLA (Programmable Logic Array) được bắt nguồn từ nguyên lý bộ nhớ chương trình PROM (Programmable Read Only Memory). Trong đó các đầu vào địa chỉ đóng

Page 32: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

33

vai trò như các đường vào của mạch logic và các đường dữ liệu ra đóng vai trò như các đường ra của mạch logic. Vì PROM không thực sự phù hợp cho mục đích thiết kế các mạch logic nên PLA đã ra đời vào đầu thập kỷ 70. Nó rất phù hợp để thực hiện mạch logic có dạng tổng các tích (vì cấu thành bởi các phần tử logic AND và OR). Nhưng nhược điểm là chi phí sản xuất cao và tốc độ hoạt động thấp. Để khắc phục nhược điểm này PAL (Programmable Array Logic) đã được phát triển. Nó được cấu thành từ các phần tử AND khả trình và phần tử OR gán cố định và có chứa cả phần tử flip flop ở đầu ra nên có khả năng thực thi các mạch logic tuần tự. Hình 2 40 mô tả cấu trúc chung của PAL.

Hình 1.40. Cấu trúc chung của PAL

Từ khi được ra đời và phát triển PAL trở thành cơ sở cho sự ra đời của hàng loạt các chủng loại Chip khả trình mảng với cấu trúc phức tạp hơn như SPLD (Simple Program mable Logic Device), CPLD (Com plex Programmable Logic Device), và sau này là FPGA (Field Pro grammable Gate Array). SPLD cũng là tên gọi cho nhóm các chủng loại Chip kiểu tương tự như PAL, PLA. Về mặt cấu trúc thì SPLD cho phép tích hợp logic với mật độ cao hơn so với PAL thông thường, nhưng kích thước của nó sẽ tăng lên rất nhanh nếu tiếp túc mở rộng và tăng mật độ tích hợp số đầu vào. Để đáp ứng nhu cầu mở rộng mật độ tích hợp CPLD đã được phát triển. Nó là sự tích hợp của nhiều khối SPLD và cung cấp thêm khả năng kết nối khả trình giữa các khối SPLD đơn lẻ với nhau. Với nguyên lý cấu trúc này CPLD có khả năng tích hợp với mật độ cao tương đương với 50 khối SPLD thông thường.

Nếu chỉ dừng đến đây chúng ta có thể thấy một đặc điểm chung của các chủng loại chip kiểu PLA hay CPLD đều cho phép thực hiện các mạch logic trên cơ sở tổ hợp logic của các đầu vào và ra bằng các phần tử AND và OR. Với nguyên lý này rõ ràng sẽ gặp khó khăn khi thực thi các ứng dụng đòi hỏi các phép tính toán logic phức tạp với tốc độ cao. Để đáp ứng điều này FPGA (Field Programmable Gate Arrays) đã ra đời. Nó là sự cấu thành của các khối logic khả trình cùng với các kênh kết nối liên thông khả trình giữa các khối đó với nhau. Một hình ảnh tiêu biểu

Page 33: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

34

về cấu trúc nguyên lý của FPGA được mô tả như trong Hình 2.41:Cấu trúc nguyên lý của FPGA.

Hình 1.41. Cấu trúc nguyên lý của FPGA

FPGA đang trở thành một sự lựa chọn thay thế rất cạnh tranh của các chip xử lý nhúng ASICs. Nó hỗ trợ các ưu điểm về chức năng lựa chọn giống như ASICs nhưng cho phép chỉnh sửa và thiết kế lại sau khi sử dụng và giá thành phát triển thấp hơn. FPGA cho phép khả năng thiết kế linh hoạt và thích nghi dễ dàng cho các tiện ích thiết bị tối ưu, trong khi vẫn duy trì được không gian kích thước phần cứng và năng lượng tiêu thụ của hệ thống. Điều này không dễ dàng nhận được khi thiết kế dựa trên nền các Chip DSP.

FPGA thực sự phù hợp cho các ứng dụng đòi hỏi lượng tính toán lớn như trong xử lý tín hiệu. FPGA có thể được lập trình hoạt động đồng thời với một số các đường dữ liệu song song. Chúng là các đường dữ liệu hoạt động của tổ hợp nhiều các chức năng từ đơn giản đến phức tạp như bộ cộng, bộ nhân, bộ đếm, bộ lưu trữ, bộ so sánh, bộ tính tương quan, …

Hình 1.42. Cấu trúc CLB và LAB

Page 34: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

35

Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086

2.1 Cơ bản về hợp ngữ 2.1.1. Giới thiệu chung

Việc lập trình bằng ngôn ngữ máy đòi hỏi ta phải nhớ các mã lệnh bằng số (dưới dạng nhị phân), còn được gọi là mã máy, phải sắp đặt vị trí của mã lệnh và các số liệu trong bộ nhớ của máy tính, ngay cả số liệu cũng phải viết dưới dạng số. Công việc này rất nặng nhọc, tốn công, dễ nhầm lẫn và khó chỉnh sửa.

Tuy nhiên việc viết chương trình bằng ngôn ngữ máy cũng có những ưu điểm của nó như phát huy tối đa được khả năng của tập lệnh của bộ vi xử lý, cũng như sử dụng có hiệu quả nhất bộ nhớ của máy tính, tốc độ thực hiện chương trình là nhanh nhất và chương trình có kích thước nhỏ nhất.

Để tránh các khó khăn của việc viết chương trình bằng ngô ngữ máy nhưng vẫn đạt được ưu điểm của việc lập trình bằng ngôn ngữ máy người ta sử dụng hợp ngữ. Hợp ngữ là một ngôn ngữ lập trình gợi nhớ, nó có các ưu nhược điểm như sau:

Ưu điểm : Vì ngôn ngữ Assembler rất gần gũi với ngôn ngữ máy nên chương trình

+ Chạy nhanh. + Tiết kiệm bộ nhớ. + Có thể lập trình truy cập qua các giao diện vào ra nhưng hiện nay các ngôn ngữ bậc cao cũng có thể làm được.

Nhược điểm + Khó viết bởi vì yêu cầu người lập trình rất am hiểu về phần cứng. + Khó tìm sai: bao gồm sai về cú pháp (syntax) và sai về thuật toán (Algorithm). Chương trình dịch sẽ thông báo sai ta sẽ dùng debug của DOS để kiểm tra. + Không chuyển chương trình Assembler cho các máy tính có cấu trúc khác nhau.

Ứng dụng + Viết lõi của hệ điều hành. + Các chương trình trò chơi ( ngày trước). + Tạo virus.

Page 35: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

36

+ Các chương trình đo và điều khiển sử dụng trong công nghiệp, ngày nay các vi điều khiển được sử dụng một cách rộng rãi.

2.1.2. Hệ lệnh Assembler a) Hệ lệnh assembler gồm có: Tập lệnh MNEMONIC sinh mã máy để chạy chương trình. Các DIRECTIVE điều khiển khi dịch chương trình. b) Cú pháp của một dòng lệnh ASM Mỗi một dòng chỉ được viết một lệnh. [Label] [Directive/Mnemonic] [Operands] [;Commnet] [Nhãn] [Loại lệnh] [Toán hạng][Ghi chú] Từ ; cho đến hết dòng là ghi chú và nó có hiệu lực chỉ trên 1 dòng. c) Tập lệnh Mnemonic - Tập lệnh Mnemonic là lệnh của ASM được thể hiện bằng viết tắt của tiếng

Anh cho dễ hiểu. Ví dụ:

Tiếng Anh Lệnh dạng Mnemonic Move mov Addition add Multiplication mul

Các quy ước về toán hạng: SRC: Toán hạng nguồn. DST: Toán hạng đích. REG(reg8/reg16): Toán hạng là thanh ghi Data: Toán hạng là hằng số. Mem: Toán hạng là biến nhớ. Segreg: Toán hạng là thanh ghi segment.

Tập lệnh MNEMONIC gồm có 6 nhóm: Nhóm 1: Các lệnh di chuyển dữ liệu Nhóm 2: Các lệnh số học. Nhóm 3: Các lệnh thao tác bit Nhóm 4: Các lệnh thao tác xâu ký tự. Nhóm 5: Các lệnh rẽ nhánh Nhóm 6: Các hệ thống cờ

2.1.3. Các bước viết chương trình hợp ngữ

Page 36: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

37

Hiện nay có hai chương trình dịch rất phổ biến là MASM (của hãng Microsoft) và TASM (của hãng Borland) về cơ bản là hai chương dịch này rất giống nhau nhưng khác nhau ở chỗ: khi viết lệnh push

Nếu viết : push ax push bx push cx thì cả hai chương trình đều biên dịch được. ( cách viết này theo MASM). Còn trong TASM thì cho phép viết push ax bx cx

2.1.3.1. Cài đặt chương trình dịch TASM: Cách 1:

Mua đĩa bản quyền nếu là đĩa mềm thì có 5 đĩa hoặc là 1 đĩa CD. Hoặc download phần mềm TASM hoặc MASM về.

Run cmd A:\ install

Cách 2:

+ Tạo thư mục: C:\TASM + Copy 4 tệp lõi từ máy khác đã cài đặt theo cách 1 về thư mục đã tạo trước.

2.1.3.2. Các bước thực hiện một chương trình Assember trên máy PC : Gồm 4 bước:

Bước 1: Dùng chương trình soạn thảo bất kì (Edit, NC, TC, ….) để soạn thảo chương trình. Sau khi soạn thảo xong phải cất tệp có đuôi là .ASM. Bước 2: Dịch chương trình gốc có đuôi .ASM thành tệp có đuôi là .OBJ

Cú pháp: C:\BT> tasm ten tep[.ASM]

Page 37: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

38

ten tep.OBJ Chú ý: khi chương trình dịch có lỗi thì không sinh ra tệp có đuôi là .OBJ Cách khai báo sai ** Error**ten tep.asm[10] Illegal Instruction dòng thứ bao nhiêu lỗi gì

Bước 3: Liên kết để chuyển tên tệp có đuôi .OBJ sang tệp .EXE hay .COM Cú pháp: C:\BT> tlink ten tep[.OBJ] ten tep.EXE hay ten tep.COM

Bước 4: Chạy thử chương trình Khi chạy nếu có lỗi thì dùng debug để kiểm tra.

2.2. Cấu trúc một chương trình hợp ngữ dạng đơn giản Cấu trúc của một chương trình hợp ngữ có liên quan chặt chẽ với cấu trúc

phần cứng của bộ vi xử lý. Người ta đã tạo dựng bốn đoạn (segment) được dự tính cho bộ vi xử lý trong quá trình lập trình: đoạn mã lệnh, đoạn dữ liệu, đoạn ngăn xếp và đoạn mở rộng. Trong đó, ít nhất một chương trình hợp ngữ phải có một đoạn mã lệnh.

Do chương trình hợp ngữ có cấu trúc như vậy mà ta có khái niệm về chương trình hợp ngữ dạng segment. Một chương trình segment dạng chuẩn phải định nghĩa đầy đủ bốn đoạn, mỗi đoạn được bắt đầu bằng chỉ dẫn hướng (directive) segment và kết thúc bằng chỉ dẫn hướng ENDS, mỗi đoạn đều được người lập trình cho trước một tên độc lập với kiểu của nó.

Ở cuối mỗi chương trình hợp ngữ có chỉ dẫn hướng END để hướng dẫn cho bộ dịch hợp ngữ biết rằng chương trình đã kết thúc.

Tuy nhiên, việc viết một chương trình hợp ngữ dạng segment chuẩn quá phức tạp, nên chúng ta thường dùng dạng giản lược của nó hay chương trình hợp ngữ dạng segment đơn giản. 2.2.1. Dạng thường thấy 1 chương trình ASM đơn giản

.MODEL

.STACK

.DATA Khai báo biến .CODE Nhãn chương trình: Thân chương trình END Nhãn chương trình

Page 38: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

39

Một chương trình asm được biên dịch thành công sẽ trở thành một file chạy có phần mở rộng là .com hoặc .exe. Sự khác nhau của chương trình dạng .com và chương trình dạng .exe là:

Chương trình dạng .com có tất cả các phần mã lệnh, dữ liệu và ngăn xếp đều cùng nằm trong một segment

Chương trình dạng .exe có phần mã lệnh, dữ liệu và ngăn xếp nằm trên các segment khác nhau.

a. Cấu trúc chương trình dạng .Com

Cấu trúc: .MODEL SMALL .CODE org 0100h Nhãn chương trình: [JMP nhãn khác khai báo biến nhãn khác:] Thân chương trình int 20h [các chương trình con] END Nhãn chương trình Ví dụ: Viết chương trình hiện một xâu lên màn hình: .model small .code org 100h begin: jmp var str db "hello world!$" var: lea dx,str mov ah,9 int 21h mov ah,1 int 21h mov ah,4ch int 21h end begin

Page 39: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

40

b. Cấu trúc chương trình dạng .exe

Cấu trúc: .MODEL SMALL .STACK 100h .DATA Khai báo biến .CODE Nhãn chương trình: mov ax,@data mov ds,ax Thân chương trình mov ah,4ch int 21h END Nhãn chương trình Ví dụ: Chương trình hiện một xâu lên màn hình .model small .stack 100h .data str db "hello world!$" .code begin: mov ax,@data mov ds,ax lea dx,str mov ah,9 int 21h mov ah,1 int 21h mov ah,4ch int 21h end begin

2.2.2. Các Directve (.MODEL, .STACK, .DATA, .CODE, ...) 2.2.2.1. Directive .MODEL

Chức năng: Cho phép người lập trình xác lập vùng nhớ RAM thích hợp cho chương trình.

Page 40: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

41

Cú pháp:

.model <kiểu>

Trong đó, kiểu mô hình bộ nhớ nhận một trong các giá trị sau:

Kiểu Mô tả

Tiny Code + data ≤ 64k

Small Code ≤ 64k; data ≤ 64k

Compact Code ≤ 64k; data ≥ 64k

Medium Code ≥ 64k; data ≤ 64k

Large Code ≥ 64k; data ≥ 64k

1 array ≤ 64k

Huge Code ≥ 64k; data ≥ 64k

1 array ≥ 64k

Bảng 2.1. Các kiểu mô hình bộ nhớ

2.2.2.2. Directive .STACK Chức năng: Báo cho chương trình dịch của ASM biết xác lập một vùng nhớ

RAM cho Stack. Với lệnh điều khiển này thì DOS sẽ xác lập địa chỉ đầu của ngăn xếp và giá trị đó được đưa vào thanh ghi segment SS.

Cú pháp: . stack độ dài (tính theo byte) Ví dụ: . stack 100h Nếu không có khai báo . stack thì lấy độ dài mặc định default.

2.2.2.3. Directive . DATA Chức năng: Báo cho chương trình dịch của ASM biết để xác lập một vùng nhớ

RAM cho dữ liệu chương trình. Cú pháp: .DATA Khai báo biến Biến trong ASM có ba loại: biến số, biến xâu kí tự và biến trường số

Page 41: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

42

a. Khai báo biến số: . DATA Tên_biến Kiểu Giá_trị_ban_đầu/? Các kiểu dữ liệu: db ( 1 byte) dw (2 byte) dd ( 4 byte) dp ( 6 byte) dq ( 8 byte) dt ( 10 byte) trong đó 2 biến db và dw hay dùng. Ví dụ: .DATA Value dw ? Value db 10

b. Khai báo biến xâu kí tự . DATA Tên_biến db Các_kí_tự_cách_nhau_bởi_dấu_phẩy độ_lớn dup (1 kí tự/ ?) Ví dụ: .DATA xau1 db ‘H’,’e’,’l’,’l’,’l,’o’ xau2 db 100h dup(‘A’) xau2 db 100 dup(?)

c. Khai báo biến trường số .DATA Tên_trường_số kiểu_của_thành_phần (Các số cách nhau bởi dấu ',')

Độ_lớn dup( 1 số/?) Ví dụ: .DATA array1 db 100,2,21,31 array2 dw 100h dup(-100) Chú ý: Nếu chương trình có khai báo biến (tức là có .DATA) thì người lập

trình ASM phải đưa phần địa chỉ segment của vùng nhớ dữ liệu vào trong DS nhờ 2 lệnh sau:

mov reg16, @data mov ds,reg16

Page 42: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

43

Ví dụ: mov ax, @data mov ds,ax

2.2.2.4. Directive .CODE Chức năng: Báo cho chương trình dịch ASM biết để xác lập 1 vùng nhớ RAM

cho phần tử mã máy của chương trình. Cú pháp: .CODE

2.3. Cấu trúc của một chương trình ASM dạng chuẩn Ta có thể hình dung dạng thường thấy của một chương trình segment như sau: Segment_Name SEGMENT .... .... .... Segment_Name ENDS END

2.3.1. Chương trình ASM đơn giản dạng chuẩn Stack segment db 100h dup (?) Stack ends Data segment Khai báo biến Data ends Code segment Assume cs:code, ds:data, ss:stack Nhan CT: mov ax, data mov ds,ax mov ah, 4ch int 21h code ends END Nhan CT

2.3.2. Các directive điều khiển segment: dạng chuẩn (Gồm:SEGMENT, GROUP và ASSUME)

2.3.2.1. Directive SEGMENT

Page 43: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

44

Chức năng: báo cho chương trình dịch ASM xác lập các segment cho chương trình.

Cú pháp: Khuân mẫu đầy đủ của chỉ dẫn hướng SEGMENT là:

Segment_Name SEGMENT Align Combine Use Class PARA(16 byte)

BYTE (1 byte) WORD(2 byte) DWORD(4 byte) PAGE(128 byte)

PUBLIC COMMON STACK AT

USER16 USER32

Class

- Segment_Name: bất kỳ một định danh nào. Tên segment chỉ được phép bao gồm một từ, nếu gồm nhiều từ thì phải có dấu gạch dưới để nối các từ với nhau. Các phần tử đứng sau SEGMENT đều là tùy chọn.

- Align Cú pháp:

Align

PARA (16 byte)

BYTE (1 byte)

WORD (2 byte)

DWORD (4 byte)

PAGE (128 byte)

Chức năng: xác lập khoảng trống giữa segment đang khai báo với segment trước nó. Nếu là BYTE thì khoảng trống giữa hai segment là 1 byte, PARA là 16 byte...

Page 44: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

45

Hình 2.1. Xác lập khoảng trống giữa hai segment là 1 byte (BYTE) Nếu như Align không được định nghĩa thì chỉ thị mặc định PARA sẽ được sử

dụng. - Combine Chức năng 1: cho phép đặt segment khai báo vào một vùng nhớ RAM theo yêu

cầu. Cú pháp: tên segment SEGMENT địa chỉ .... .... .... Tên segment ENDS Chức năng 2: phục vụ chương trình đa tệp thuần tuý ASM, cách gộp các

segment có cùng tên nằm ở các tệp khác nhau khi liên kết.

- USE : chỉ có từ thế hệ 80386 và chỉ được dùng với chỉ dẫn hướng 386. use16 ASM 16 bit (default): Độ dài đoạn cực đại là 64Kbyte use32 ASM 32 bit : Độ dài đoạn cực đại là 4Gbyte.

- ‘CLASS’

Chức năng: cho phép gộp các segment có cùng lớp lại gần nhau khi liên kết. Tên lớp phải được đặt trong dấu nháy đơn '', có thể dùng một tên bất kỳ. Tất cả các segment có cùng tên nhưng có tên lớp khác nhau sẽ được nạp kế tiếp nhau vào trong bộ nhớ. Thông thường thì ta chỉ cần có một tên lớp khi ta muốn kết nối các chương trình hợp ngữ với các chương trình ngôn ngữ bậc cao.

Dạng chuẩn Dạng đơn giản

Page 45: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

46

Stack segment

db 100h dup (?)

Stack ends

.Stack 100h

Data segment

Khai báo biến

Data ends

.DATA

Khai báo biến

Chú ý: mov ax, data

mov ds, ax

Chú ý: mov ax,@data

mov ds, ax

Code segment

Nhan CT:

Code ends

ENDS Nhan CT

.CODE

Nhan CT:

ENDS Nhan CT

Bảng 2.2. Cách khai báo 3 segment của chương trình dạng đơn giản và dạng chuẩn 2.3.2.2. Drective GROUP

Chức năng: gộp các segment cùng loại cho dễ dàng qui chiếu. Cú pháp: tên nhóm GROUP tên các segment Khai báo các segment Giải thích: Data1 segment M1 db ? Data1 ends Data2 segment M2 dw ? Data2 ends Code segment

Page 46: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

47

PS: mov ax, data1 mov ds,ax mov cl, M1 mov ax, data2 mov ds,ax mov cl, M2

Ta làm group như sau: Nhom_DL GROUP data1,data2 Data1 segment M1 db ? Data1 ends Data2 segment M2 dw ? Data2 ends Code segment PS:

mov ax, nhom_DL mov cl, M1 mov dx,M2

2.3.2.3. Directive ASSUME Chức năng: cho biết segment khai báo thuộc loại segment nào Cú pháp: assume tên thanh ghi segment : tên segment Giải thích:

Page 47: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

48

assume cs:x3, ds:x2,ss:x1 Chú ý: assume thường là dòng đầu của code segment Ví dụ: Hiện xâu kí tự "hello world !$" stack segment db 100h dup(?) ends stack data segment str db "hello world!$" ends data code segment assume ss:stack,cs:code,ds:data begin: mov ax,data mov ds,ax lea dx,str mov ah,9 int 21h mov ah,1 int 21h mov ah,4ch int 21h ends code end begin

2.2. Trạng thái của Vi xử lý và các thanh ghi cờ

Page 48: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

49

Vi xử lý (VXL) làm nhiệm vụ của bộ xử lý trung tâm CPU nên thường đươc gọi là CPU và được đặt ở trung tâm bản mạch chính. VXL được chế tạo trên cơ sở công nghệ chế tạo các mạch vi điện tử tích hợp rất lớn với các phần tử cơ bản là các Transistor.

Các máy tính IBM tương thích với VXL của hãng Intel nên ta sẽ đi tìm hiểu về VXL của intel. Họ VXL của Intel 80x86 với x là 1,2,3,4, đến số 5 thì đổi thành Pentium. Ngoài ra còn có các VXL của các hãng khác.

80x86 là VXL 16 bit, tức là nó có bus dữ liệu 16 bit. Do vậy nó có khả năng truy xuất dữ liệu 2 byte một lần. bus địa chỉ có độ rộng 20 bit. Tức là nó có khả năng xác định địa chỉ của 220 ô nhớ = 1MB địa chỉ byte nhớ vật lý.

Về mặt cấu trúc, CPU hay VXL có hai phần chức năng độc lập đó là BIU và EU:

BIU là đơn vị ghép nối, nó thực hiện tất cả các công việc về BUS cho EU. Nó thiết lập khâu nối với thế giới bên ngoài là các Bus địa chỉ, số liệu và điều khiển. BIU bao gồm các thanh ghi đoạn nhớ, thanh ghi con trỏ lệnh và bộ điều khiển logic Bus.

EU là đơn vị thi hành lệnh, EU gồm hai khối: khối tính toán số học và logic ALU và khối điều khiển CU. EU có trách nhiệm xử lý dữ liệu, nó duy trì trạng thái của VXL, kiểm soát các thanh ghi đa năng và toán hạng lệnh. EU gồm các thanh ghi đa năng, thanh ghi cờ.

Khi VXL hoạt động, dữ liệu được truyền giữa VXL và thiết bị vào ra khi có yêu cầu của EU. Chúng không được truyền trực tiếp tới EU mà phải qua một vùng nhớ RAM có dung lượng nhỏ hơn 6 byte gọi là hàng nhập lệnh trước PQ. Rồi sau đó mới được truyền vào đơn vị lệnh IU. Tiếp đó IU sẽ điều khiển EU để cho lệnh được thực hiện bởi ALU.

Một chu kì lệnh của 8086 có thể coi đơn giản gồm hai thời khoảng: lấy lệnh từ bộ nhớ và thực hiện lệnh. Khi EU đang thực hiện lệnh trước thì BIU đã tìm và lấy lệnh tiếp theo từ bộ nhớ, giải mã nó và nạp vào PQ vào, khiến cho thời gian lấy lệnh của 8086 có thể coi là bằng 0. Sau này chúng ta biết đến cơ chế này trong các VXL về sau của Intel đó là cơ chế đường ống. 2.2.1. Cách định địa chỉ byte nhớ trong 8086

Bus địa chỉ của 8086 có 20 bit, định địa chỉ cho 1 MB bộ nhớ, trong khi đó các thanh ghi trong 8086 đều có độ rộng là 16 bit, nên phải có cơ chế để đánh địa chỉ logic và vật lý cho không gian nhớ 1MB. Cách đánh địa chỉ như sau:

Page 49: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

50

Chương trình sẽ chia không gian nhớ vật lý thành các đoạn nhớ logic, với kích thước 64Kbyte mỗi đoạn, các byte trong đoạn là liên tiếp nhau. Mỗi đoạn nhớ được chương trình gắn cho một địa chỉ đoạn, đó là địa chỉ byte nhớ thấp nhất trong đoạn nhớ. Hai đoạn nhớ liền kề nhau nhất thiết phải cách nhau 16 byte, do đó các đoạn có địa chỉ là bội số 16 của nhau. Như vậy chương trình có thể chứa các đoạn tách rời, phủ lấp hoặc chồng lên nhau. Bên trong đoạn có địa chỉ offset để chỉ khoảng cách từ địa chỉ thấp nhất trong đoạn tới ô nhớ đó. Giá trị offset cho phép xác định chính xác địa chỉ logic của byte nhớ trong đoạn đó.

Như vậy, một byte nhớ được định địa chỉ logic bởi một cặp 2 thanh ghi 16 bit là chứa địa chỉ đoạn và địa chỉ độ lệch (segment:offset). Người lập trình chỉ quan tâm tới địa chỉ logic nhưng khi truy xuất bộ nhớ, đơn vị ghép nối Bus BIU trong VXL sẽ tính từ đó ra địa chỉ vật lý thật sự của byte nhớ cần truy cập theo công thức:

Địa chỉ vật lý=địa chỉ đoạn ×16 + địa chỉ độ lệch (segment×16 + offset) Điều này được BIU thực hiện dễ dàng bằng cách dịch trái giá trị thanh ghi

chứa địa chỉ đoạn đi 4 bit rồi cộng với giá trị offset trong thanh ghi chứa độ lệch (vì khi một số nhị phân được dịch trái đi 4 digit, tương đương với việc nhân nó với 24 = 16).

Vì mỗi thanh ghi đoạn dài 16 bit nên có thể định đến 64 k đoạn nhớ, và số địa chỉ offset (tương ứng với kích thước mỗi đoạn) sẽ là 64 kbyte. Do đó không gian địa chỉ logic sẽ lớn hơn và bằng 64 kbyte × 64 kbyte địa chỉ = 4 Gbyte nhớ. 2.2.2. Các thanh ghi trong 8086

8086 có 14 thanh ghi 16 bit. Các thanh ghi đa năng AX, BX, CX, DX. Chúng được dùng để lưu trữ dữ

liệu tạm thời trong khi thực hiện chương trình. Ưu điểm của việc sử dụng thanh ghi bên trong cho việc lưu trữ tạm thời dữ liệu là cho phép VXL có thể truy cập dữ liệu nhanh hơn rất nhiều so với việc phải truy cập bộ nhớ ngoài. Các thanh ghi này được tách thành hai phần, mỗi phần 8 bit, phần chứa 8 bit cao là AH, BH, CH, DH và phần chứa 8 bit thấp là AL, BL, CL , DL. Mỗi phần đều có thể được địa chỉ hóa tách biệt.

Thanh ghi AX: Thanh ghi tích lũy (Accumulator Register) – là thanh ghi đóng vai trò trung tâm đối với phép nhân và phép chia. Thanh ghi AH thường được sử dụng để truy nhập qua một kênh vào/ra.

Page 50: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

51

Thanh ghi BX: Thanh ghi cơ sở (Base Register) – được dùng cho các loại định địa chỉ đặc biệt để tính toán địa chỉ, thường được dùng để chứa con trỏ trỏ tới bộ nhớ.

Thanh ghi CX: Thanh ghi đếm (Count Register) – chứa số đếm trong các lệnh lặp vòng.

Thanh ghi DX: Thanh ghi dữ liệu (Data Register) – là thanh ghi mở rộng của thanh ghi AX trong các lệnh nhân và chia. Thanh ghi này chứa nửa cao của một tích 32 bit hoặc nửa cao của một số bị chia 32 bit. Trong việc thực hiện các lệnh đọc/viết các cổng vào/ra, thanh ghi này được dùng để chứa địa chỉ của các cổng cần đọc/viết có giá trị lớn hơn FFh.

Các thanh ghi đoạn CS, DS, SS, ES: có 4 thanh ghi đoạn dùng để lưu trữ địa chỉ 16 bit của 4 loại đoạn nhớ logic: đoạn mã lệnh CS, đoạn dữ liệu DS, đoạn ngăn xếp SS, đoạn phụ ES. Ngăn xếp (stack) là một vùng nhớ được đặt ra ngoài để lưu trữ địa chỉ và dữ liệu trong khi thực hiện chương trình con.

Thanh ghi đoạn mã lệnh CS: là thanh ghi chứa địa chỉ đoạn của vùng chứa mã lệnh của chương trình đang thực hiện.

Thanh ghi đoạn dữ liệu DS: là thanh ghi địa chứa địa chỉ đoạn của vùng dữ liệu mà chương trình đang thực hiện sử dụng, vùng này thường chứa các biến của chương trình.

Thanh ghi đoạn ngăn xếp SS: là thanh ghi chứa địa chỉ đoạn bộ nhớ ngăn xếp (stack) của chương trình.

Thanh ghi đoạn phụ (mở rộng, bổ xung): là thanh ghi chứa địa chỉ đoạn của vùng nhớ bổ xung mà chương trình đang sử dụng, vùng này cũng thường chứa các biến của chương trình.

Các thanh ghi con trỏ và chỉ số: gồm có các thanh ghi: BP, SP, SI, DI, IP. SP (Stack Pointer) – thanh ghi con trỏ stack: nó luôn kết hợp với SS để

chỉ ra đỉnh tức thời của ngăn xếp. Sau mỗi thao tác cất một từ (word) vào ngăn xếp SP sẽ tự động giảm đi 2 đơn vị, và ngược lại sau mỗi thao tác lấy một từ ra khỏi ngăn xếp SP sẽ tự động tăng lên 2 đơn vị.

BP (Base Stack Pointer) – thanh ghi con trỏ cơ sở: là thanh ghi con trỏ để đánh dấu ngăn xếp, Trong nhiều thao tác với stack cần sử dụng thêm thanh ghi này, chẳng hạn như truyền thông số thông qua stack.

SI (Source Index) và DI (Destination Index) – thanh ghi con trỏ chỉ số nguồn và thanh ghi con trỏ chỉ số đích: được thiết kế để chuyên sử dụng trong các thao tác vận chuyển dữ liệu. Trong một số lệnh của 8086 các

Page 51: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

52

thanh ghi này luôn được kết hợp với các thanh ghi đoạn DS, ES để trỏ tới nguồn và đích của thao tác vận chuyển dữ liệu. Đó là cắp DS: SI và ES:DI.

Thanh ghi con trỏ lệnh IP (Intruction Pointer): Thanh ghi con trỏ lệnh luôn chứa địa chỉ lệch của lệnh tiếp theo sẽ được thi hành trong đoạn nhớ CS. Sau khi một lệnh được thi hành thì IP lại được bộ VXL thay đổi giá trị để trỏ tới lệnh tiếp theo sẽ được thi hành.

Thanh ghi cờ Flag (Flags Register): đây là thanh ghi 16 bit, trong đó mỗi bit được sử dụng để thể hiện một trạng thái của bộ VXL tại một thời điểm nhất định trong quá trình thực hiện chương trình, trong VXL 8086 mới chỉ có 9 bit được sử dụng, người ta gọi mỗi bit đó là một cờ, mỗi cờ thường được biểu diễn bằng một kí hiệu gợi nhớ, mỗi cờ đều có hai trạng thái khác nhau là 0 và 1. Người lập trình ASM hay dùng trạng thái các bit cờ làm điều kiện cho các lệnh nhảy có điều kiện.

x x

x

x

O D

I T S Z x A x P x C

x: không được định nghĩa. C hoặc CT (Carry flag): cờ nhớ. CF = 1 khi số nhớ tràn khỏi bit có trọng

số lớn nhất. P hoặc PF (Parity flag): cờ parity. PF phản ánh tính chẵn lẻ (parity) của

tổng số bit có trong kết quả. PF = 1 khi tổng số bit 1 trong kết quả là chẵn.

A hoặc AF (Auxiliary carry flag): cờ nhớ phụ, rất có ý nghĩa khi ta làm việc với các số BCD. AF = 1 khi có nhớ hoặc mượn từ một số BCD thấp (4 bit thấp) sang một số BCD cao (4 bit cao).

Z hoặc ZF ( Zero flag): cờ rỗng, ZF = 1 khi kết quả bằng 0. S hoặc SF (Sign flag): cờ dấu, SF = 1 khi kết quả âm. hoặc OF (Overflow flag): cờ tràn, OF = 1 khi có hiện tượng tràn số học,

đó là trường hợp số quá lớn vượt ra khỏi dung lượng nơi gửi đến. T hoặc TF (Trap flag): cờ bẫy, TF = 1 thì CPU làm việc ở chế độ chạy

từng lệnh( chế độ này cần dùng khi cần tìm lỗi trong một chương trình). I hoặc IF (Interrupt enable flag): cờ cho phép ngắt, IF = 1 thì CPU cho

phép các yêu cầu ngắt được tác động. D hoặc DF (Direction flag): cờ hướng, DF = 1 khi CPU làm việc với

chuỗi kí tự theo thứ tự từ trái sang phải (hay còn gọi D là cờ lùi).

Page 52: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

53

2.3. Các lệnh di chuyển dữ liệu Tất cả lệnh trong nhóm này khi thực hiện không làm thay đổi trạng thái của

các bit cờ. 2.3.1. Lệnh mov

Chức năng: Đưa nội dung từ SRC đến DST Cú pháp: mov DST, SRC

reg1 reg2 mov ax, bx reg data mov cx,100 reg mem mov dx,value mem reg mov value,dx mem data mov value,100 segreg reg16 mov ds,ax reg16 segreg mov bx,cs segreg mem 16 mov cs,value mem16 segreg mov value,cs

Chú ý: Không được di chuyển giữa hai biến nhớ (mov mem1,mem2). Thực hiện gián tiếp: mov reg,mem2 mov mem1,reg Không đưa trực tiếp dữ liệu vào thanh ghi segment (mov seg,data). Thực hiện gián tiếp: mov reg16,data mov segreg,reg16 Sự khác nhau khi sử dụng các chế độ địa chỉ ( mov ax,bx khác với mov ax,[bx] ; đưa nội dung mà bx trỏ đến vào ax) mov ax,[bx] tương đương với mov ax, ds:[bx] (SI,DI hay BP)

2.3.2. Lệnh push Chức năng: cất 2 byte của SRC vào đỉnh ngăn xếp(stack). Cú pháp:

PUSH SRC Reg16

Mem16 Ví dụ: push ax

Page 53: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

54

Toán hạng gốc có thể tìm được theo các chế độ địa chỉ khác nhau: có thể là thanh ghi đa năng, thanh ghi đoạn hay là ô nhớ. Lệnh này thường được dùng với lệnh POP như là một cặp đỗi ngẫu để xử lý các dữ liệu và trạng thái của chương trình chính(CTC) khi vào ra chương trình con(ctc). 2.3.3. Lệnh POP

Chức năng: lấy 2 byte (1 từ) ở đỉnh ngăn xếp (stack) vào toán hạng đích. Cú pháp:

POP DST Reg16 Mem16

Chú ý: - Cơ chế PUSH/POP là LIPO( last in first out) - Cách viết trên chỉ được sử dụng trong MASM còn trong TASM được viết

như sau: push ax bx cx

2.3.4. Lệnh PUSHF Chức năng: cất giá trị thanh ghi cờ vào đỉnh ngăn xếp Cú pháp: PUSHF Dữ liệu tại ngăn xếp không thay đổi, SS không thay đổi.

2.3.5. Lệnh POPF Chức năng: Lấy 2 byte từ đỉnh ngăn xếp rồi đưa vào thanh ghi cờ. Cú pháp: POPF Sau lệnh này dữ liệu tại ngăn xếp không thay đổi, SS không thay đổi.

2.3.6. Lệnh XCHG (Exchange 2 Operands) Tráo nội dung 2 toán hạng Chức năng: Tráo nội dung 2 toán hạng DST và SRC Cú pháp:

XCHG DST SRC Reg1 Reg2 Reg Mem

Trong toán hạng đích có thể tìm theo chế độ địa chỉ khác nhau nhưng phải chứa dữ liệu có cùng độ dài và không được phép đồng thời là 2 ô nhớ và cũng không được là thanh ghi đoạn. Sau lệnh XCHG toán hạng chứa nội dung cũ của toán hạng kia và ngược lại.

Lệnh này không tác động đến cờ. 2.3.7. Lệnh IN

Page 54: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

55

Chức năng: đọc dữ liệu từ cổng vào thanh ghi AL/AX Cú pháp: IN AL/AX, địa chỉ cổng Chú ý: + Nếu địa chỉ cổng <256 thì số địa chỉ đứng trực tiếp trong lệnh IN Ví dụ: địa chỉ cổng là 1fh IN AL,1fh ; nội dung cổng 1fh đưa vào AL. + Nếu địa chỉ cổng ≥ 256 thì phải nhờ đến thanh ghi DX Ví dụ: địa chỉ COM1 = 378h mov dx,378h in al,dx

2.3.8. Lệnh OUT Chức năng: đưa dữ liệu từ thanh ghi AL/AX ra cổng Cú pháp: OUT địa chỉ cổng,AL/AX Chú ý: Nếu địa chỉ cổng <256 thì số địa chỉ đứng trực tiếp trong lệnh OUT Ví dụ: địa chỉ cổng là 1fh OUT 1fh,AL ; nội dung cổng 1fh đưa vào AL. Nếu địa chỉ cổng ≥ 256 thì phải nhờ đến thanh ghi DX Ví dụ: địa chỉ COM1 = 378h mov dx,378h out dx,al Lệnh này không tác động đến cờ.

2.3.9. Lệnh LEA (load Efective address) Chức năng: lấy phần địa chỉ offset của biến đưa vào thanh ghi 16 bit Cú pháp: lea reg16, mem Ví dụ: lea bx, Value hay mov bx, OFFSET Value Đích thường là các thanh ghi: BX, CX, DX, BP, SI, DI. Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hay ô nhớ cụ thể. Ví dụ: lea dx, msg; Nạp địa chỉ offset của bản tin msg vào dx.

2.3.10. Lệnh LES (Load register and ES with words from memory)

Page 55: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

56

Chức năng: chuyển giá trị của 1 từ từ một vùng nhớ vào thanh ghi đích và giá trị của từ tiếp theo sau của vùng nhớ vào thanh ghi ES.

Cú pháp: les reg, mem Trong đó: Đích là một trong các thanh ghi AX, BX,CX, DX, SP, BP, SI, DI. Gốc là ô nhớ trong đoạn DS được chỉ rõ trong lệnh

2.3.11. Lệnh LDS (Load resgister and DS with words from memory)

Chức năng: Nạp một từ từ bộ nhớ vào thanh ghi cho trong lệnh và 1 từ tiếp theo vào DS.

Cú pháp: lds reg, mem

2.3.12. Các thí dụ: Thí dụ 1: Viết chương trình hiện một xâu kí tự kết thúc bởi $ lên màn hình:

.model small .stack 100h .data msg db 'hello !$' .code Prostart: mov ax,@data mov ds,ax mov dx, offset msg mov ah,9 int 21h mov ah,4Ch int 21h end Prostart

2.4. Các lệnh điều khiển(Lặp và rẽ nhánh)

Page 56: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

57

2.4.1. Lệnh Call Chức năng: Gọi chương trình con Cú pháp

2.4.2. Lệnh RET

Chức năng: quay về chương trình đã gọi chương trình con Cú pháp: RET (nằm ở cuối chương trình con)

2.4.3. Lệnh INT Chức năng: Kích hoạt một ngắt (chuyển sang chạy chương trình con phục vụ

ngắt) (Ngắt mềm). Cú pháp: int n (số ngắt viết theo số hexa) Ví du: int 21h = int 33 Các ngắt hay dùng hỗ trợ cho lập trình Assembler Hàm 1: Chờ 1 kí tự mov ah,1 ; gán ah = 1 al chứa mã ASCII ; al = 0 khi kí tự gõ vào là các phím chức năng. int 21h Hàm 2: Hiện 1 ký tự lên màn hình từ vị trí con trỏ đang đứng. Cách 1: mov al, mã ASCII mov ah,0eh int 10h Cách 2: mov dl, mã ASCII ; dl = mã ASCII của kí tự cần hiển thị mov ah,2 int 21h Hàm 3: Hiện xâu kí tự kết thúc ‘$’ lên màn hình. lea dx, tên biến xâu ; mov dx,offset tên biến xâu mov ah,9 int 21h

Page 57: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

58

Hàm 4: Trở về DOS mov ah,4ch int 21h

2.4.4. Lệnh IRET Chức năng: quay về chương trình đã kích hoạt nó từ chương trình con phục

ngắt. Cú pháp: IRET - Lệnh JMP (go to) Chức năng: nhảy không điều kiện Cú pháp:

Chú ý: Bước nhảy của lệnh jump < 64k

2.4.5. Lệnh nhảy có điều kiện

Với số không có dấu (Below/above)

Với số có dấu (Less/ greater)

Nhảy theo trạng thái các bit cờ

Cmp DST, SRC Cmp DST, SRC Jb/jnae Nhãn Địa chỉ

Khi DST dưới SRC

Jl/jnge Nhãn Địa chỉ

Khi DST<SRC

jc Nhãn Địa chỉ

Khi CF=1

Jbe/jna Nhãn Địa chỉ

Khi DST dưới SRC hoặc =

Jle/jng Nhãn Địa chỉ

Khi DST≤SRC

jnc Nhãn Địa chỉ

Khi CF=0

Je Nhãn Địa chỉ

Khi DST= SRC

Je Nhãn Địa chỉ

Khi DST= SRC

jz Nhãn Địa chỉ

Khi ZF=1

Jne Nhãn Địa chỉ

Khi DST≠ SRC

Jne Nhãn Địa chỉ

Khi DST≠ SRC

jnz Nhãn Địa chỉ

Khi ZF=0

Ja/jnbe Nhãn Địa chỉ

Khi DST trên SRC

Jg/jnle Nhãn Địa chỉ

Khi DST > SRC

js Nhãn Địa chỉ

Khi SF=1

Jae/jnb Nhãn

Khi DST trên /=SRC

Jge/jnl Nhãn Địa chỉ

Khi DST ≥SRC

jns Nhãn Địa chỉ

Khi SF=0

Page 58: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

59

Địa chỉ

Bảng 2.3. Các lệnh nhảy có điều kiện Chú ý: Bước nhảy các lệnh nhảy có điều kiện phải nhỏ hơn hoặc bằng 128

byte 2.4.6. Lệnh LOOP (for của ASM)

Chức năng: lặp đi lặp lại khối lệnh ASM nằm giữa nhãn và loop cho đến khi cx = 0. Mỗi khi thực hiện một vòng lặp giá trị của CX giảm đi 1.

Cú pháp: mov cx, số lần lặp; số lần lặp ≥ 1 Nhan: Khối lệnh ASM Loop Nhan

2.4.7. Các thí dụ Thí dụ 1: Viết chương trình hiện một số nằm trong thanh ghi ax ra màn hình ở dạng cơ số 10:

;Hien 1 so ra man hinh ? d?ng c? so 10 nam trong ax .MODEL small .STACK 100h .DATA Mess db 'So can hien la : $' .CODE ProgramStart: mov ax,@data mov ds,ax mov dx,OFFSET Mess mov ah,9 int 21h mov bx,10 xor cx,cx mov ax,0fffh ;so can hien LAP: xor dx,dx div bx add dx,30h push dx

Page 59: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

60

inc cx cmp ax,0 jnz LAP LAP1: pop ax mov ah,0eh int 10h loop LAP1 mov ah,4ch int 21h END ProgramStart

Thí dụ 2: Viết chương trình tính n! với n nằm trong khoảng từ 0 đến 7 ;------------------- ; n! (n tu 0 den 7) | ;------------------- INCLUDE lib1.asm .MODEL small .STACK 100h .DATA M1 db 13,10,'Hay vao n : $' M2 db 13,10,'Giai thua cua $' M3 db ' la : $' M4 db 13,10,'Co tiep tuc CT (c/k)? $' .CODE PS: mov ax,@data mov ds,ax clrscr HienString M1 call VAO_SO_N mov cx,ax ; cx = n HienString M2 call HIEN_SO_N HienString M3 mov ax,1 cmp cx,2

Page 60: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

61

jb HIEN LAP: mul cx loop LAP HIEN: call HIEN_SO_N HienString M4 mov ah,1 int 21h cmp al,'c' jne Exit jmp PS Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS

Thí dụ 3:

2.5. Các lệnh logic, dịch và quay Chú ý: tất cả các lệnh trong nhóm này khi thực hiện có thể làm thay đổi trạng

thái các bit cờ. 2.5.1. Lệnh AND

Chức năng: Thực hiện phép “và logic”, bit của kết quả bằng 1 khi 2 bit tương ứng đều bằng 1. DST← DST Λ SRC

Ví dụ: al = 1010 1010 bl = 1100 1100 and al,bl = 1000 1000 Cú pháp: and DST, SRC Cách hay dùng: Tách bit: al = xxxx xxxx 0001 0000

Page 61: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

62

and al, 10h = 000x 0000 Khi dùng phép AND để che đi/ giữ lại một vài bit nào đó của một toán hạng

thì bằng cách nhân logic toán hạng đó với toán hạng tức thì có các bit0/1 ở các chỗ cần che/ giữ nguyên tương ứng.

Dựng cờ and DST,DST Ví dụ: and ax, ax Nếu ax < 0 thì SF = 1. Nếu ax ≥ 0 thì SF = 0. Nếu ax = 0 thì ZF = 1. Nếu ax ≠ 0 thì ZF = 0.

2.5.2. Lệnh OR Chức năng: thực hiện phép hoặc logic, Bit của kết quả = 1 khi 1 trong 2 bit là

1. DST ←DST V SRC Ví dụ: al = 1010 1010 bl = 1100 1100 or al,bl = 1110 1110 Cú pháp: or DST, SRC Tác động đến cờ: C = O = 0, P, Z, S.

2.5.3. Lệnh XOR Chức năng: Thực hiện phép “hoặc loại trừ” 2 toán hạng, bit của kết quả bằng 1

khi 2 bit tương ứng khác nhau. Ví dụ: al = 1010 1010 bl = 1100 1100 xor al,bl = 0110 0110 Cú pháp: xor DST, SRC Cách hay dùng: Tách bit: al = xxxx xxxx 0001 0000 and al, 10h = 000x 0000 Tác động đến cờ: C = O = 0, P, Z, S. Ví dụ: Thực hiện ax = 0

Page 62: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

63

1. mov ax,0 ; 3 byte 2. and ax,0 3. sub ax,ax ; 2 byte 4. xor ax,ax

2.5.4. Lệnh SHL (Shift Left) Chức năng: dịch trái các bit của toán hạng đích đi một số lần nào đó (số lần

dịch được cất trong thanh ghi CL). Cú pháp: SHL DST, CL (reg, mem)

Tác động đến cờ: C, P, Z, S, O. Mỗi một lần dịch MSB sẽ đưa qua cờ CF và đưa 0 vào LSB. CL chứa số lần

dịch mong muốn. Nếu dịch một lần thì ta có thể viết trực tiếp. VD: shl ax,1 Nếu số lần dịch ≥ 2 thì phải nhờ đến CL/CX shl ax, 4 ≡ mov cl/cx, 4 shl ax, cl/cx Ý nghĩa: Dịch trái 1 lần là nhân 2 với số nguyên dương.

2.5.5. Lệnh SHR (Shift Right) Chức năng: dịch phải logic các bit của toán hạng đích đi một số lần nào đó (số

lần dịch được cất trong thanh ghi CL). Cú pháp: SHR DST, CL (reg, mem)

Tác động đến cờ: C, P, Z, S, O. Mỗi một lần dịch LSB sẽ đưa qua cờ CF và đưa 0 vào MSB. CL chứa số lần

dịch mong muốn. Nếu dịch một lần thì ta có thể viết trực tiếp. VD: shr ax,1 Nếu số lần dịch ≥ 2thì phải nhờ đến CL/CX shr ax, 4 ≡ mov cl/cx, 4

Page 63: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

64

shr ax, cl/cx Ý nghĩa: Dịch phải 1 lần là chia đôi và làm tròn dưới với số nguyên dương

2.5.6. Lệnh SAR ( Shift Arithmetically Right) Chức năng: dịch phải số học các bit của toán hạng đích đi một số lần nào đó

(số lần dịch được cất trong thanh ghi CL). Cú pháp: SAR DST, CL (reg, mem)

Tác động đến cờ: C, P, Z, S, O. Mỗi một lần MSB được giữ lại ( nếu ta hiểu đây là bit dấu của một số nào đó

thì dấu luôn không đổi sau phép dịch phải số học) còn LSB được đưa vào cờ CF. CL chứa sẵn số lần dịch mong muốn.

Nếu dịch một lần thì ta có thể viết trực tiếp. VD:sar ax,1 Nếu số lần dịch ≥ 2thì phải nhờ đến CL/CX sar ax, 4 ≡ mov cl/cx, 4 sar ax, cl/cx Ý nghĩa: Dịch phải 1 lần là chia đôi và làm tròn dưới với số có dấu.

2.5.7. Lệnh ROL( Rotate All Bits to the Left) Chức năng: quay vòng sang trái các bit của toán hạng đích đi một số lần nào

đó (số lần dịch được cất trong thanh ghi CL). Trong mỗi lần quay giá trị bit cao nhất vừa chuyển vào thanh ghi cờ CF đồng thời chuyển vào bit thấp nhất

Cú pháp: ROL DST, CL (reg, mem)

Tác động đến cờ: C, O. Nếu dịch một lần thì ta có thể viết trực tiếp. VD:rol ax,1

2.5.8. Lệnh ROR

Page 64: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

65

Chức năng: quay vòng sang phải các bit của toán hạng đích đi một số lần nào đó (số lần dịch được cất trong thanh ghi CL). Trong mỗi lần quay giá trị bit thấp LSB nhất vừa chuyển vào thanh ghi cờ CF đồng thời chuyển vào bit cao nhất MSB.

Cú pháp: ROR DST, CL (reg, mem)

Tác động đến cờ: C, O. Nếu dịch một lần thì ta có thể viết trực tiếp. VD:ror ax,1

2.5. Các lệnh số học 2.5.1. Lệnh ADD(addition)

Chức năng: DST ←DST + SRC Cộng hai toán hạng: lấy toán hạng đích cộng với toán hạng nguồn rồi đưa vào

toán hạng đích. Cú pháp:

Tác động đến cờ: C, P, A, Z, S, O.

2.5.2. Lệnh ADC(Add with carry) Chức năng: cộng có nhớ, DST← DST + SRC + CF Cú pháp: adc DST, SRC Tác động đến cờ: C, P, A, Z, S, O. Ví dụ: adc ax, bx

2.5.3. Lệnh I3NC(Increment Destination Register or Memory)

Chức năng: Tăng toán hạng đích thêm 1. DST← DST + 1

Page 65: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

66

Cú pháp: inc DST Tác động đến cờ: C, P, Z, S, O. Ví dụ: reg→ inc ax mem→ inc value

2.5.4. Lệnh INC(Increment Destination Register or Memory) Chức năng: Tăng toán hạng đích thêm 1. DST ←DST + 1 Cú pháp: inc DST Tác động đến cờ: C, P, Z, S, O. Ví dụ: reg→ inc ax mem→ inc value

2.5.5. Lệnh SUB (Substraction) Chức năng: Trừ hai toán hạng, DST← DST – SRC Cú pháp: sub DST, SRC Ví dụ: sub ax, bx Tác động đến cờ: C, P, A, Z, S, O. Chú ý: chế độ địa chỉ không được đồng thời là 2 ô nhớ hay là thanh ghi đoạn.

2.5.6. Lệnh SBB (Substraction with borrow) Chức năng: Trừ có mượn, DST ←DST – SRC – CF Cú pháp: sbb DST, SRC Ví dụ: sbb ax, bx Tác động đến cờ: C, P, A, Z, S, O.

2.5.7. Lệnh MUL/ IMUL (Multiply Unsigned Byte or Word/ Integer Multiplication )

Chức năng: Nhân 2 toán hạng với số không dấu (MUL), số có dấu (IMUL) Cú pháp:

Có hai trường hợp tổ chức phép nhân 8 bits * 8 bits Số bị nhân phải là số 8 bit để trong AL

Page 66: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

67

Sau khi nhân: al*SRC AX 16 bits * 16 bits Số bị nhân phải là số 16 bit để trong AX Sau khi nhân: ax*SRC dx:ax Tác động đến cờ: C, O. Chú ý: al = 1111 1111 bl = 0000 0010 mul bl ax = al*bl (255*2 = 510) imul bl ax = al*bl (- 1*2 = -2 ) Trong phép chia thì ax, bx, dx (al,bl,dx) là ẩn

2.5.8. Lệnh DIV/IDIV(Unsigned Divide/Integer Division) Chức năng: Chia hai toán hạng với số không dấu/ số có dấu Cú pháp:

Hai trường hợp tổ chức phép chia Nếu số 16 bits chia cho số 8 bits

Nếu số 32 bits chia cho số 16 bits

Trong phép chia thì ax, bx, dx (al,bl,dx) là ẩn Ví dụ:

2.5.9. Lệnh DEC (Decrement Destination Register or Memory)

Page 67: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

68

Chức năng: Giảm toán hạng đích đi 1, DST← DST – 1 Cú pháp: dec DST reg→ dec ax mem →dec value Tác động đến cờ: C, P, Z, S, O.

2.5.10. Lệnh NEG (Negate a Operand) Chức năng: lấy bù hai của một toán hạng, đảo dấu của một toán hạng DST ← - DST Cú pháp: neg DST reg→ neg ax mem →neg value Tác động đến cờ: C, P, A, Z, S, O.

2.5.11. Lệnh CMP (Compare Byte or Word) Chức năng: So sánh nội dung của hai toán hạng và dựng cờ. Sau khi thực hiện

lệnh này nội dung của hai toán hạng không thay đổi. Cú pháp: cmp DST, SRC Tác động đến cờ: C, P, Z, S, O. Cách dựng cờ: cmp DST, SRC Nếu DST < SRC thì CF = 1. Nếu DST ≥ SRC thì CF = 0. Nếu DST = SRC thì ZF = 1. Nếu DST ≠ SRC thì ZF = 0.

2.6. Các lệnh thao tác với chuỗi Chú ý: Chỉ có 2 lệnh trong nhóm này khi thực hiện làm thay đổi các bit cờ.

2.6.1. Lệnh MOVSB/MOVSW (Move String Byte or String Word) Chức năng: Chuyển một xâu ký tự theo từng byte(MOVSB) hay theo từng từ

(MOVSW) từ vùng nhớ trỏ bởi DS:SI sang vùng nhớ trỏ bởi ES:DI. Sau mỗi lần dịch chuyển thì giá trị của SI, DI tự động tăng lên 1 hoặc 2 khi cờ hướng DF = 0 hoặc giảm đi 1 hoặc 2 khi DF = 1.

Phần tử của Chuỗi đích← Phần tử của Chuỗi gốc Cú pháp: MOVSB hoặc MOVSW

Page 68: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

69

Chuẩn bị trước ds:si con trỏ đến đầu xâu SRC, es:di con trỏ đến đầu xâu DST Lệnh này không tác động đến cờ.

2.6.2. Lệnh LODSB/LODSW (Load String Byte or Word into AL/AX) Chức năng: Chuyển các kí tự theo từng byte (LODSB) hay theo từng từ

(LODSW) từ vùng nhớ trỏ bởi DS:SI vào AL/AX. Cú pháp: LODSB hoặc LODSW Chuẩn bị trước ds:si con trỏ ở đầu xâu, df = 0 hay df = 1. Lệnh này không tác động đến cờ.

2.6.3. Lệnh STOSB/STOSW (Store AL/AX in String Byte/Word) Chức năng: Chuyển các kí tự nằm ở AL(STOSB) /AX (STOSW) vào vùng nhớ

trỏ bởi ES:DI. Cú pháp: STOSB hoặc STOSW hoặc STOS Chuỗi đích. Xác lập trước ES:DI trỏ đến đầu vùng nhớ, df = 0 hay df = 1. Lệnh này không tác động đến cờ. Nhận xét 1. movsb = lodsb + stosb 2. movsw = lodsw + stosw

2.6.4. Lệnh CMPSB/CMPSW Chức năng: So sánh hai xâu kí tự theo từng byte (CMPSB) / theo từng từ

(CMPSW) giữa hai vùng nhớ trỏ bởi DS:SI và ES:DI. Lệnh này chỉ tạo cờ, không lưu lại kết quả so sánh, sau khi so sánh các toán hạng không bị thay đổi.

Cú pháp: CMPSB hoặc CMPSW hoặc STOS Chuỗi đích. Xác lập trước DS:SI trỏ đến đầu xâu 1, ES:DI trỏ đến đầu xâu 2, df = 0 hay df

= 1. Tác động đến cờ: ZF = 1 khi hai xâu bằng nhau, ZF = 0 khi hai xâu khác nhau.

2.6.5. Tiền tố REP (Repeat String Instruction until CX = 0). Chức năng: Lặp đi lặp lai lệnh làm việc với xâu kí tự đằng sau nó cho đến khi

cx = 0. Sau mỗi lần thực hiện cx tự động giảm đi 1 Cú pháp: mov cx, số lần

Page 69: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

70

rep lệnh làm việc với xâu ; rep movsb

Thuật toán 1. DS:SI 2. ES:DI 3. D = 0 4. CX = 5 5. rep movsb; sau mỗi lần cx = cx – 1 cho đến khi cx = 0.

2.7. Ngăn xếp và thủ tục Trong các chương trình cỡ lớn, việc module hóa để cho chương trình có cấu

trúc sáng sủa, dễ debug và tiết kiệm thời gian viết mã là một việc hết sức quan trọng. Để có thể module hóa được chương trình chúng ta cần phải sử dụng một trong các công cụ rất hữu hiệu đó là thủ tục – chương trình con. Chương trình con là một đoạn các mã lệnh được gộp lại và được đặt tên, thông qua tên (bằng cách gọi tên), chúng ta có thể sử dụng lại một đoạn mã lệnh ở bất cứ nơi nào ta cần trong chương trình thay vì phải viết lại hoàn toàn đoạn mã lệnh đó. 2.7.1 Cơ chế làm việc của chương trình con

Nói chung cơ chế làm việc của chương trình con trong ASM không khác gì nhiều so với các ngôn ngữ bậc cao khác.

Cơ chế có 5 bước : - Bước 1: Tham số thực đưa vào stack - Bước 2: Địa chỉ lệnh tiếp theo đưa vào stack - Bước 3: Hệ điều hành biết được địa chỉ đầu của chương trình con. Do vậy hệ

điều hành đưa địa chỉ đầu của chương trình con vào CS:IP rẽ nhánh vào chương trình con.

- Bước 4: Thực hiện chương trình con cho đến khi gặp return thì vào stack lấy địa chỉ lệnh tiếp theo (đã cất ở bước 2 để đưa vào CS:IP) và quay về chương trình đã gọi nó.

- Bước 5: tiếp tục chương trình đang thực hiện dở.

Page 70: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

71

2.7.2 Cấu trúc của chương trình con

Tên chương trình con PROC [near/far] Bảo vệ các thanh ghi mà thân chương trình con phá vỡ. Các lệnh ASM của thân chương trình con. Hồi phục các thanh ghi mà thân chương trình con đã phá vỡ. RET Tên chương trình con ENDP Nhận xét: 1. Chương trình con thuần tuý ASM không có tham số. 2. Vấn đề near/ far - Chương trình con là near khi mã máy của chương trình con và mã máy của

chương trình chính là cùng nằm trong 1 segment, địa chỉ của chương trình con và chương trình chính chỉ khác nhau phần địa chỉ offset. Cho nên địa chỉ lệnh tiếp theo cất váo stack chỉ cần 2 byte offset.

- Chương trình con là far khi mã máy của chương trình con và mã máy của chương trình chính nằm trên các segment khác nhau, địa chỉ của chương trình con và chương trình chính khác nhau cả về phần địa chỉ segment. Cho nên địachỉ lệnh tiếp theo cất vào stack phải cần 4 byte offset.

Default: - Với chương trình được khai báo directive dạng đơn giản thì directive

MODEL sẽ cho biết chương trình con là near hay far Nếu .MODEL tiny/small/compact thì chương trình con là NEAR(mã máy<

64k) Nếu .MODEL medium/large/huge thì chương trình con là FAR(mã máy>64k - Với chương trình con được viết theo directive dạng chuẩn thì mặc định là

near. Còn muốn chương trình con là far thì phải viết far khi viết chương trình con. 2.7.3 Vấn đề chuyển giao tham số

Page 71: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

72

Trong chương trình con của hợp ngữ không có tham số hình thức vì vậy mà việc trao đổi dữ liệu giữa chương trình con và chương trình chính gọi nó được thực hiện thông qua 3 cách sau:

Chuyển tham số thông qua các thanh ghi: Cách này đơn giản và dễ viết thường được sử dụng trong các chương trình thuần túy ASM. Với cách này ta chỉ cần đặt một giá trị vào thanh ghi nào đó trong chương trình chính sau đó gọi chương trình con và chương trình con sẽ sử dụng được giá trị trong thanh ghi đó. Nó giống như ta đưa các chức năng con vào thanh ghi AH trước khi gọi ngắt của hệ thống, đó cũng là một cách truyền tham số cho chương trình con thông qua thanh ghi.

Chuyển tham số thông qua các biến ngoài: Biến khai báo toàn cục được sử dụng trong toàn chương trình, cả chương trình chính và chương trình con, do vậy ta có thể dùng nó để chuyển tham số.

Chuyển tham số thông qua ngăn xếp: Phương pháp này cần lưu thứ tự sắp xếp trong ngăn xếp để truy cập các tham số.

2.7.4 Vấn đề bảo vệ các thanh ghi Việc bảo vệ các thanh ghi trong quá trình gọi các chương trình con là một vấn

đề rất quan trọng trong lập trình ASM vì chương trình viết bằng ASM rất hay dùng các toán hạng là các thanh ghi. Do vậy trong chương trình con đôi khi có thể làm thay đổi giá trị của một thanh ghi nào đó làm ảnh hưởng tới kết quả thực hiện của chương trình chính. Có hai phương pháp thường dùng là:

Dùng lệnh Push để cất thanh ghi vào ngăn xếp ở đầu chương trình con và cuối chương trình con ta dùng lệnh POP để lấy lại các giá trị của các thanh ghi.

Dùng theo quy ước: Những thanh ghi nào dùng trong chương trình chính thì không dùng trong chương trình con nữa. Tuy nhiên cách này không hiệu quả lắm và ít dùng vì có những thanh ghi ta buộc phải sử dụng mà không thể thay thế được.

2.7.5. Một số ví dụ Thí dụ 1: Viết chương trình hiện một số ra màn hình ở dạng hexa: .MODEL small .STACK 100 .CODE PS: mov cx,0ffffh

Page 72: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

73

call HIENDEC mov ah,4ch int 21h HIENDEC PROC push ax bx cx dx xor dx,dx mov bx,1000h mov al,bl H1: shl cx,1 mov al,dl adc al,al daa mov dl,al mov al,dh adc al,al daa mov dh,al mov al,bl adc al,al mov bl,al dec bh jnz H1 call HIEN mov al,dh call HIEN mov al,dl call HIEN pop dx cx bx ax ret HIENDEC ENDP HIEN PROC push ax cx push ax mov cl,4

Page 73: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

74

shr al,cl add al,30h mov ah,0eh int 10h pop ax and al,0fh add al,30h mov ah,0eh int 10h pop cx ax ret HIEN ENDP END PS

Thí dụ 2: Tạo thư viện Lib1.asm và Lib2.asm sử dụng macro và chương trình con ;----------------------------- ; MACRO hien 1 xau ky tu ket | ; thuc bang '$'ra man hinh | ;----------------------------- HienString MACRO xau push AX DX mov DX,offset xau mov AH,9 int 21h pop DX AX ENDM ;-------------------- ; MACRO xoa man hinh | ;-------------------- CLRSCR MACRO push AX mov AH,0fh int 10h mov AH,0 int 10h pop AX

Page 74: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

75

ENDM Tệp Lib2.asm:

;--------------------------------- ; NHAN MOT SO NGUYEN TU BAN PHIM | ; Ket thuc so bang ENTER (0dh) | ; So nhan duoc nam trong AX | ; (khong duoc danh sai) | ;--------------------------------- VAO_SO_N PROC push BX CX DX SI mov BX,10 ; Mot so hang nhan xor CX,CX ; Phan so da vao truoc (luc dau bang 0) mov SI,CX ; Co dau cua so (luc dau coi nhu so duong) VSN1: mov AH,1 ; Cho 1 ky tu tu ban phim int 21h cmp AL,0dh ; Ky tu vua vao la phim Enter je VSN3 cmp AL,'-' ; Ky tu vua vao la dai '-' jne VSN2 ; Khong phai dau '-' thi nhay inc SI ; con khong thi co dau len 1 jmp VSN1 VSN2: sub AL,30h ; Chuyen ky tu vua vao tu ma ASCII sang dang so xor AH,AH ; AH=0 (AX la so vua vao) xchg AX,CX ; Doi cheo so vua vao va phan so da vao truoc mul BX ; Nhan phan so da vao truoc voi 10 add CX,AX ; Cong so vua vao voi phan so da vao sau khi nhan 10 jmp VSN1 VSN3: and SI,SI ; Dung co ZF (Neu SI#0 thi so vao la am) jz VSN4 ; So vua vao la duong thi nhay neg CX ; Bu 2 gia tri vua vao de duoc so am VSN4:

Page 75: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

76

mov AX,CX pop SI DX CX BX ret VAO_SO_N ENDP ;---------------------------- ; HIEN NOI DUNG THANH GHI AX | ; RA MAN HINH DANG CO SO 10 | ;---------------------------- HIEN_SO_N PROC push AX BX CX DX mov BX,10 ; BX chua so chia la 10 xor CX,CX ; So lan cat vao stack (luc dau = 0) and AX,AX ; Dung co dau SF jns HSN1 ; Neu so can hien la duong thi nhay push AX ; con khong thi cat AX vao stack mov AL,'-' ; Hien dau '-' ra man hinh mov AH,0eh int 10h pop AX ; Hoi phuc lai so can hien tu stack vao AX neg AX ; Bu 2 de lay gia tri tuyet doi HSN1: xor DX,DX ; DX=0 div BX ; DX:AX chia cho BX (10) add DX,30h ; Chuyen so du tu dang so ra dang ASCII push DX ; Cat vao stack inc CX ; Tang so lan cat vao stack len 1 and AX,AX ; Dung co ZF (lieu thuong = 0) jnz HSN1 ; Thuong # 0 thi nhay den tiep tuc qua trinh chia HSN2: ; Vong lap lay cac gia tri co trong stack hien pop AX mov AH,0eh ; Chuc nang hien 1 ky tu dang ASCII o AL ra man hinh int 10h loop HSN2

Page 76: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

77

pop DX CX BX AX ret HIEN_SO_N ENDP

Thí dụ 3: Viết chương trình chia hai số nguyên với số bị chia là nguyên và số chia là nguyên dương:

;------------------------------------ ; Chia 2 so voi so bi chia la nguyen | ; con so chia la nguyen duong | ;------------------------------------ INCLUDE lib1.asm .MODEL small .STACK 100h .DATA M1 db 10,13,'Hay vao so chia : $' M2 db 10,13,'Hay vao so bi chia : $' M3 db 10,13,'Thuong la : $ ' dautru db '-$' daucham db '.$' M4 db 10,13,'Co tiep tuc (c/k) ? $' .CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xoa man hinh HienString M1 ; Hien dong nhac call VAO_SO_N mov bx,ax HienString M2 call VAO_SO_N HienString M3 and ax,ax jns CH1 HienString dautru neg ax CH1:

Page 77: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

78

xor dx,dx div bx call HIEN_SO_N and dx,dx jz KT HienString daucham mov cx,2 mov si,10 CH2: mov ax,dx mul si div bx call HIEN_SO_N and dx,dx jz KT loop CH2 KT: HienString M4 ; Hien dong nhac M4 mov ah,1 ; Cho 1 ky tu tu ban phim int 21h cmp al,'c' ; Ky tu vao co phai la 'c' (tiep tuc) ? jne Exit jmp PS Exit: mov ah,4ch ; Con khong thi tro ve DOS int 21h INCLUDE lib2.asm END PS

Thí dụ 4: Viết chương trình tính a lũy thừa n, với a là số nguyên và n là số nguyên dương:

;------------------------------------------------------------ ; a luy thua n (voi a la so nguyen va n la so nguyen duong) | ;------------------------------------------------------------ INCLUDE lib1.asm .MODEL small

Page 78: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

79

.STACK 100h

.DATA M1 db 13,10,'Hay vao a : $' M2 db 13,10,'Hay vao n : $' crlf db 13,10,'$' M3 db ' luy thua $' M4 db ' la : $' M5 db 13,10,'Co tiep tuc CT (c/k)? $' .CODE PS: mov ax,@data mov ds,ax clrscr HienString M1 call VAO_SO_N mov bx,ax ; bx = a HienString M2 call VAO_SO_N mov cx,ax ; cx = n HienString crlf ; quay dau dong va xuong hang mov ax,bx call HIEN_SO_N HienString M3 mov ax,cx call HIEN_SO_N HienString M4 mov ax,1 and cx,cx jz HIEN LAP: mul bx loop LAP HIEN: call HIEN_SO_N HienString M5

Page 79: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

80

mov ah,1 int 21h cmp al,'c' jne Exit jmp PS Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS

2.8. Mảng và các chế độ định địa chỉ 2.8.1 Mảng một chiều

Mảng một chiều là một danh sách các phần tử cùng loại và có trật tự. Có trật tự có nghĩa là có phần tử thứ nhất, phần tử thứ hai, phần tử thứ ba ... Trong toán học, nếu A là một mảng thì các phần tử của mảng được định nghĩa làA[1}, A[2] , A[3] ... Hình vẽ là dưới đây là mảng A có 6 phần tử .

Trong chương 1 chúng ta đã dùng toán tử giả DB và DW để khai báo mảng byte và mảng từ . Ví dụ , một chuổi 5 ký tự có tên là MSG MSG DB 'abcde' hoặc một mảng từ W gồm 6 số nguyên mà giá trị ban đâù của chúng là 10,20,30,40.50 và 60

W DW 10,20,30,40,50,60

Địa chỉ của biến mảng gọi là địa chỉ cơ sở của mảng ( base address of the array) . Trong mảng W thì địa chỉ cơ sở là 10 .Nếu địa chỉ offset của W là 0200h thì trong bộ nhớ mảng 6 phần tử nói trên sẽ như sau :

Page 80: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

81

Offset address Symbolic address Decimal content 0200h W 10 0202h W+2h 20 0204h W+4h 30 0206h W+6h 40 0208h W+8h 50 020Ah W+Ah 60

a. Toán tử DUP ( Duplicate)

Có thể định nghĩa một mảng mà các phần tử của nó có cùng một giá trị ban đầu bằng phép DUP như sau : Ví dụ :

repeat_count DUP ( value) lặp lại một số ( VALUE) n lần (n = repeat_count) GAMMA DW 100 DUP (0) ; tạo một mảng 100 từ mà giá trị ban đâù là 0 . DELTA DB 212 DUP (?) ; tạo một mảng 212 byte giá trị chưa xác định DUP có thể lồng nhau , ví dụ : LINE DB 5,4,3 DUP (2, 3 DUP (0) ,1) tương đương với : LINE DB 5,4,2,0,0,0,1,2,0,0,0,1,2,0,0,0,1 b. Vị trí các phần tử của một mảng

Địa chỉ của một phần tử của mảng có thể được xác định bằng cách cộng một hằng số với địa chỉ cơ sở . Giả sử A là một mảng và S chỉ ra số byte của một phần tử của mảng ( S=1 đối với mảng byte và S=2 đối với mảng từ ) . Vị trí của các phần tử của mảng A có thể tính như sau :

Position Location

1 A

2 A+1xS

3 A+2xS

. .

. .

Page 81: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

82

. .

N A+ (N-1)xS

Ví dụ: Trao đổi phần tử thứ 10 và thứ 25 của mảng từ W . Phần tử thứ 10 là W[10] có địa chỉ là W+9x2=W+18 Phần tử thứ 25 là W[25] có địa chỉ là W+24x2=W+48 Vì vậy có thể trao đổi chúng như sau :

MOV AX,W+18 ; AX = W[10]

XCHG W+48,AX ; AX= W[25]

MOV W+18, AX ; complete exchange

2.8.2. Các mode địa chỉ của 8086 Hay còn gọi là các chế độ địa chỉ, các phương pháp xác định địa chỉ của các

toán hạng có trong lệnh. Lưu ý rằng tập các thanh ghi của bộ xử lý được sắp xếp cũng tạo nên một bộ nhớ tốc độ cao và cũng có một không gian địa chỉ.

Địa chỉ hiệu dụng EA ~ offset hay độ lệch của ô nhớ chứa toán hạng mong muốn tính từ địa chỉ cơ sở đoạn. Địa chỉ vật lý của ô nhớ chứa toán hạng được 8086 xác định bằng cách cộng địa chỉ hiệu dụng với địa chỉ cơ sở đoạn nằm trong các thanh ghi đoạn. Thanh ghi đoạn thông dụng nhất là thanh ghi DS.

8086 có các mode địa chỉ sau: Định địa chỉ tức thời: các đơn giản nhất để xác định một toán hạng là phần địa chỉ của lệnh chứa chính toán hạng đó chứ không cần địa chỉ hoặc thông tin khác mô tả toán hạng đó ở đâu. Một toán hạng như vậy gọi là toán hạng tức thời bởi vì toán hạng được tìm và nạp tự động từ bộ nhớ cùng lúc với lệnh và được sử dụng ngay lập tức. Định địa chỉ tức thời có ưu điểm là không cần một truy xuất bộ nhớ nào. Tuy nhiên nó có nhược điểm là toán hạng bị giới hạn bởi một số chỉ đặt vừa trong trường địa chỉ. Thí dụ: MOV CX, 437Bh Định địa chỉ trực tiếp: phương pháp này xác định một toán hạng bằng cách cung cấp địa chỉ của từ nhớ chứa toán hạng cho bộ xử lý. Với chế độ định địa chỉ bộ nhớ đơn giản nhất, địa chỉ hiệu dụng chỉ là số 16 bit được viết tiếp trong câu lệnh.

Page 82: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

83

Thí dụ: MOV BL, [437Ah], nạp nội dung ô nhớ có độ lệch tính từ địa chỉ cơ sở đoạn là 437A vào thanh ghi BL. Khi đó VXL sẽ tính toán địa chỉ của ô nhớ bằng cách cộng thêm địa chỉ hiệu dụng 437A vào địa chỉ cơ sở đoạn dữ liệu. Chế độ định địa chỉ này được gọi là trực tiếp vì độ dịch chuyển của toán hạng được chỉ ra trực tiếp trong câu lệnh. Thí dụ khác: MOV BX, [437Ah], copy một từ 16 bit từ ô nhớ vào thanh ghi BX. Bởi mỗi địa chỉ trong 8086 đại diện cho 1 byte, do đó nội dung của ô nhớ có địa chỉ lệch so với địa chỉ đoạn dữ liệu DS là 437A sẽ được copy vào thanh ghi BL, nội dung ô nhớ có địa chỉ lệch 437B sẽ được copy vào thanh ghi BH. Ngoài ra định địa chỉ trực tiếp còn được dùng để xác định toán hạng đích trong bộ nhớ, ví dụ: MOV [437Ah], BX sẽ copy vào ô nhớ có địa chỉ lệch 437A nội dung thanh ghi BL, và copy nội dung thanh ghi BH vào ô nhớ có địa chỉ lệch là 437B. Định địa chỉ thanh ghi: Trong chế độ này, thanh ghi sẽ là toán hạng nguồn của câu lệnh. Thí dụ: MOV CX, AX. Trong đó, toán hạng nguồn là toán hạng đứng sau dấu phẩy, toán hạng đích là toán hạng đứng trước dấu phẩy, lệnh MOV CX, AX sẽ copy nội dung thanh ghi AX vào thanh ghi CX. Ta có thể copy nội dung bất cứ thanh ghi 16 bit nào sang thanh ghi 16 bit khác, cũng có thể copy nội dung bất cứ thanh ghi 8 bit nào sang thanh ghi 8 bit khác, các trường hợp còn lại là không thể. Định địa chỉ gián tiếp: trong chế độ này, trường địa chỉ cho biết từ nhớ nào hoặc thanh ghi nào chứa địa chỉ của toán hạng. Trong nhóm này có các loại như sau: - Định vị gián tiếp thanh ghi: lúc này địa chỉ hiệu dụng nằm ở một trong các thanh ghi BX, BP, SI hoặc DI. Thí dụ: MOV AX, [SI] ; chuyển nội dung của ô nhớ trong đoạn hiện tại có offset là nội dung của thanh ghi SI và thanh ghi AX. - Định vị cơ sở: EA là tổng của độ dịch chuyển và nội dung của thanh ghi BX hoặc BP. -Thí dụ: MOV [BX] + displacement, AL; chuyển nội dung của thanh ghi AL vào ô nhớ có địa chỉ offset bằng tổng nội dung của BX với độ dịch chuyển. Định vị chỉ số (indexed addressing): EA là tổng của độ dịch chuyển và nội dung của thanh ghi SL hoặc DI. Lý do có chế độ này như sau. Nhiều thuật toàn cần thực hiện một thao tác nào đó trên một chuỗi cấu trúc dữ liệu lưu giữ trong những vị trí nhớ liên tiếp. Thí

Page 83: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

84

dụ xét một khối gồm n từ lệnh máy chiếm các vị trí A, A + 1, A + 2, …, A + n-1. Các từ này cần được di chuyển đến các vị trí B, B + 1, B + 2, … ,B + n-1. Trong trường hợp này có thể thực hiện lệnh MOV A, B rồi thay đổi chính lệnh đó thành MOVE A + 1, B + 1 và lặp lại cho tới khi cả n từ được sao chép hết. Bằng cách định địa chỉ gián tiếp có thể thực hiện được điều này. Một thanh ghi hoặc từ nhớ được nạp địa chỉ A, một thanh ghi hoặc từ nhớ khác được nạp địa chỉ B. Lệnh MOV dùng 2 thanh ghi này làm các con trỏ và sau mỗi lần sao chép một từ con trỏ được tăng lên 1. Các con trỏ là một phần của dữ liệu chứ không phải là phần của chương trình và những người sử dụng không được dùng chung đồng thời. Một giải pháp khác là có một số thanh ghi gọi là thanh ghi chỉ số hoạt động như sau. Địa chỉ có 2 phần: số của một thanh ghi chỉ số và một hằng số. Địa chỉ của toán hạng là tổng của hằng số với nội dung của thanh ghi chỉ số. Trong thí dụ này, nếu cả hai địa chỉ được định chỉ số bằng cách dùng một thanh ghi chỉ số chứa số nguyên k, lệnh MOV A, B sẽ chuyển nội dung vụ trí nhớ A + k tới B + k. Bằng cách khởi động thanh ghi chỉ số là 0 và tăng nội dung thanh ghi này lên một lượng bằng kích thích của từ sau khi sao chép một từ, chỉ cần một thanh ghi cho vòng lặp sao chép. Hơn nữa việc tăng thanh ghi sẽ nhanh hơn việc tăng một vị trí nhớ. Việc đánh chỉ số được sử dụng rộng rãi để định địa chỉ một trường tại một khoảng cách đã biết tính từ điểm đầu của một cấu trúc dữ liệu đã cho. Các biến cục bộ trong một thủ tục được truy cập theo cách này. Việc tăng hoặc giảm giá trị thanh ghi chỉ số trước hoặc sau khi nó được sử dụng là việc làm thường xuyên xảy ra. Vì vậy người ta thường đưa các lệnh định địa chỉ đặc biệt hoặc thậm chí có những thanh ghi chỉ số đặc biệt mà tự chúng có thể tăng hoặc giảm giá trị. Việc sửa đổi tự động một thanh ghi chỉ số được gọi là đánh chỉ số tự động (autoindexing). Thí dụ lệnh: MOV AL, [SI] + displacement; chuyển nội dung ô nhớ có địa chỉ offset bằng tổng của nội dung SI với độ dịch chuyển vào thanh ghi AL. MOV AH,[BX] [SI] + displacement; chuyển nội dung của ô nhớ có địa chỉ offset bằng tổng của độ dịch chuyển với nội dung của BX và SI vào thanh ghi AH. Đây là kiểu định địa chỉ chỉ số và cơ sở, EA là tổng của nội dung thanh ghi cơ sở, thanh ghi chỉ số và độ dịch chuyển. Định địa chỉ ngăn xếp (stack addressing): Ngăn xếp gồm các phần tử dữ liệu (từ, kí tự, bit v.v…) được lưu trữ theo một trật tự liên tiếp trong bộ nhớ. Phần tử đầu tiên được cất vào ngăn xếp sẽ ở đáy ngăn xếp. Phần tử mới nhất được cất

Page 84: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

85

vào sẽ ở đỉnh ngăn xếp. Kết hợp với mỗi ngăn xếp là một thanh ghi hoặc từ nhớ chứa địa chỉ của đỉnh ngăn xếp được gọi là con trỏ ngăn xếp (stack pointer). Máy tính có lệnh PUSH cất các nội dung của ô nhớ hoặc thanh ghi vào ngăn xếp. Lệnh này phải thực hiện việc sao chép phần tử đó và tăng con trỏ ngăn xếp. Ngược lại, lệnh POP lấy nội dung đỉnh ngăn xếp đưa trở lại thanh ghi hoặc ô nhớ phải thực hiện sao chép mới vào nơi thích hợp và giảm con trỏ ngăn xếp. Thí dụ lệnh: PUSH AX ;cất nội dung của thanh ghi AX vào ngăn xếp POP AX ;hồi phục giá trị thanh ghi AX từ nội dung đỉnh ngăn xếp. Một số lệnh không địa chỉ cũng có thể được sử dụng cùng với ngăn xếp. Định dạng lệnh này chỉ ra rằng 2 toán hạng được lấy ra khỏi ngăn xếp, toán hạng này tiếp sau toán hạng kia, phép toán được thực hiện (thí dụ nhân hoặc AND) và kết quả được cất trở lại ngăn xếp.

2.8.3. Thí dụ

Thí dụ 1: Viết chương trình hiện một số nằm trong thanh ghi ax ra màn hình ở dạng cơ số 10 (sử dụng mảng)

.MODEL small

.STACK 100h

.DATA

Bang dw 10000

dw 1000

dw 100

dw 10

dw 1

M db 'Gia tri dang co so 10 cua thanh ghi AX la : $'

.CODE

Page 85: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

86

PS:

mov ax,@data

mov ds,ax

mov dx,offset M

mov ah,9

int 21h

mov ax,0ffh

xor dl,dl

mov cx,5

mov bx,offset Bang

H1:

cmp ax,WORD PTR [bx]

jc H2

sub ax,WORD PTR[bx]

inc dl

jmp H1

H2:

push ax

add dl,30h

mov ah,2

int 21h

Page 86: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

87

pop ax

xor dl,dl

inc bx

inc bx

loop H1

mov ah,4ch

int 21h

END PS

Thí dụ 2:

2.9. Các lệnh thao tác với cờ và điều khiển bộ 2.9.1. Lệnh CLC (Clear CF)

Chức năng: Xoá giá trị cờ CF về 0, CF = 0 Cú pháp: CLC Cờ C = 0

2.9.2. Lệnh STC Chức năng: Đưa giá trị cờ CF lên 1, CF = 1 Cú pháp: STC Cờ C = 1

2.9.3. Lệnh CMC Chức năng: Đảo giá trị hiện thời của cờ CF. Cú pháp: CMC Tác động đền cờ C.

2.9.4. Lệnh CLI Chức năng: Xoá giá trị của cờ IF về 0(IF = 0). Cấm toán bộ các ngắt cứng trừ

ngắt MNI. Cú pháp: CLI Cờ IF = 0.

2.9.5. Lệnh STI Chức năng: Đưa giá trị của cờ IF lên1 (IF = 1). Cho phép ngắt cứng.

Page 87: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

88

Cú pháp: STI Cờ IF = 1.

2.9.6. Lệnh CLD Chức năng: Xoá giá trị của cờ DF về 0 (DF = 0). Cú pháp: CLD Cờ DF = 0, dựng cờ.

2.9.7. Lệnh STD Chức năng: Đưa giá trị của cờ DF lên1 (DF = 1). Cú pháp: STD Cờ DF = 1.

2.9.8. Lệnh HLT Chức năng: dừng máy Cú pháp: HLT

2.9.9. Lệnh NOP Chức năng: lệnh này không thực hiện gì cả Cú pháp: NOP (4μs) Ý nghĩa: Tạo trễ (delay)

Tạo vòng chờ vô tận để chờ ngắt. L1: nop jmp L1

Page 88: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

89

CHƯƠNG 3 : VI ĐIỀU KHIỂN 8051 VÀ LẬP TRÌNH HỢP NGỮ

3.1. Tổng quan về họ vi điều khiển 80C51 3.1.1. Sự khác nhau giữa các bộ vi xử lý và vi điều khiển 3.1.1.1.Cấu trúc phần cứng

Bộ vi xử lý là một CPU đơn chip còn một bộ vi điều khiển là một vi mạch đơn chứa bên trong một CPU và các mạch khác để tạo nên một hệ máy vi tính đầy đủ. Ngoài CPU, các bộ vi điều khiển còn chứa bên trong các RAM, ROM, mạch giao tiếp nối tiếp, mạch giao tiếp song song, bộ định thời và các mạch điều khiển ngắt, tất cả hiện diện trong một vi mạch.

Dung lượng RAM trên chip trong các bộ vi điều khiển không thể đạt bằng dung lượng RAM ở các máy vi tính bởi vi điều khiển được dùng cho các thiết kế riêng. Các bộ vi xử lý có tỷ lệ RAM: ROM cao trong khi đó các bộ vi điều khiển có tỷ lệ ROM :RAM cao.

Một đặc trưng quan trọng là hệ thống ngắt được thiết kế bên trong chip. Các bộ vi điều khiển đáp ứng với các tác động bên ngoài (các ngắt) theo thời gian thực. Chúng phải chuyển đổi ngữ cảnh rất nhanh, treo một quá trình trong khi đang thực thi một quá trình khác theo yêu cầu của một sự kiện. Các bộ vi xử lý đều có khả năng thực hiện các sơ đồ ngắt nhưng phải sử dụng các thành phần bên ngoài trong khi đó các mạch bên trong một chip vi điều khiển bao gồm các mạch quản lý ngắt cần thiết.

Hình 3.1. Sự khác nhau giữa bộ VXL và VĐK

CPU

ROM RAM

Timer

Serial

COM I/O

Port CPU

RAM ROM

I/O

Timer

Serial

COM

Data bus

(a) Microprocessor

Address bus

(b) Microcontroller

Page 89: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

90

3.1.1.2. Các ứng dụng

Các bộ vi xử lý hầu hết được dùng làm các CPU trong các hệ máy vi tính trong khi đó các bộ vi điều khiển được ứng dụng trong các thiết kế nhỏ với số thành phần thêm vào tối thiểu nhằm thực hiện các hoạt động hướng điều khiển. Trước khi các thiết kế như vậy yêu cầu hàng chục thậm chí hàng trăm các vi mạch số. Bộ vi điều khiển giúp giảm thiểu số lượng tổng thể các thành phần. Tất cả chỉ cần một bộ vi điều khiển, một số ít các thành phần hỗ trợ và một chương trình điều khiển chứa trong ROM. Các bộ vi điều khiển thích hợp với các điều khiển xuất nhập với yêu cầu các thành phần tối thiểu còn bộ vi xử lý thích hợp với các ứng dụng xử lý thông tin trong các hệ máy tính.

3.1.1.3. Các đặc trưng của tập lệnh

Các tập lệnh của bộ vi xử lý bao gồm các lệnh xử lý bao quát nên chúng mạnh về các kiểu định địa chỉ với các lệnh hoạt động trên lượng dữ liệu lớn.

Các bộ vi điều khiển có các tập lệnh điều khiển việc xuất nhập. Mạch giao tiếp nhiều ngõ nhập và ngõ xuất chỉ sử dụng một bit. Đặc trưng này hiếm thấy trên các bộ vi xử lý thường được thiết kế hoạt động trên các byte và các đơn vị dữ liệu lớn hơn. Do kết cấu phần cứng nên các lệnh trong bộ vi điều khiển phải thật cơ động và hầu hết được thực thi trên từng byte một.

3.1.2. Các bộ vi điều khiển họ 8051 3.1.2.1.Cấu trúc bên trong của vi điều khiển 8051

Bộ vi điều khiển 8051 là thành viên đầu tiên của họ 8051. Hãng Intel ký hiệu nó như là MCS51.

Page 90: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

91

3.1.2.2. Các thành viên khác của họ 8051 Có hai bộ vi điều khiển thành viên khác của họ 8051 là 8052 và 8031.

a. Bộ vi điều khiển 8052

Bộ vi điều khiển 8052 là một thành viên khác của họ 8051, 8052 có tất cả các đặc tính chuẩn của 8051 ngoài ra nó có thêm 128 byte RAM và một bộ định thời nữa. Hay nói cách khác là 8052 có 256 byte RAM và 3 bộ định thời. Nó cũng có 8K Byte ROM trên chíp thay vì 4K Byte như 8051. Xem bảng 3.1.

Bảng 3.1: So sánh các đặc tính của các thành viên họ 8051

Đặc tính 8051 8052 8031

ROM trên chíp 4K byte 8K byte OK

RAM 128 byte 256 byte 128 byte

Bộ định thời 2 3 2

CO

UN

TER INPU

TS

OSC

INTERRUPT

CONTROL

4 I/O

PORTS

BUS

CONTROL

SERIAL

PORT

EXTERNAL

INTERRUPTS

CPU

ON - CHIP

RAM

ETC

TIMER 0

TIMER 1

ADDRESS/DATA

TXD RXD P0 P1 P2 P3

Hình 3.2. Bố trí bên trong của sơ đồ khối 8051.

Page 91: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

92

Chân vào ra 32 32 32

Cổng nối tiếp 1 1 1

Nguồn ngắt 6 8 6

Như nhìn thấy từ bảng 3.1 thì 8051 là tập con của 8052. Do vậy tất cả mọi chương trình viết cho 8051 đều chạy trên 8052 nhưng điều ngược lại là không đúng.

b. Bộ vi điều khiển 8031

Một thành viên khác nữa của 8051 là chíp 8031. Chíp này thường được coi như là 8051 không có ROM trên chíp vì nó có 0KB ROM trên chíp. Để sử dụng chíp này ta phải bổ sung ROM ngoài cho nó. ROM ngoài phải chứa chương trình mà 8031 sẽ nạp và thực hiện. So với 8051 mà chương trình được chứa trong ROM trên chíp bị giới hạn bởi 4K byte, còn ROM ngoài chứa chương trình được gắn vào 8031 thì có thể lớn đến 64K byte.

c. Các bộ vi điều khiển 8051 từ các hãng khác nhau

+ Bộ vi điều khiển 8751

Chíp 8751 chỉ có 4K byte bộ nhớ UV-EPROM trên chíp. Để sử dụng chíp này để phát triển yêu cầu truy cập đến một bộ đốt PROM cũng như bộ xoá UV- EPROM để xoá nội dung của bộ nhớ UV-EPROM bên trong 8751 trước khi ta có thể lập trình lại nó. Do một thực tế là ROM trên chíp đối với 8751 là UV-EPROM nên cần phải mất 20 phút để xoá 8751 trước khi nó có thể được lập trình trở lại. Điều này đã dẫn đến nhiều nhà sản xuất giới thiệu các phiên bản Flash Rom và UV-RAM của 8051. Ngoài ra còn có nhiều phiên bản với các tốc độ khác nhau của 8751 từ nhiều hãng khác nhau.

+ Bộ vi điều khiển AT8951 từ Atmel Corporation

Chíp 8051 phổ biến này có ROM trên chíp ở dạng bộ nhớ Flash. Điều này là lý tưởng đối với những phát triển nhanh vì bộ nhớ Flash có thể được xoá trong vài giây trong tương quan so với 20 phút hoặc hơn mà 8751 yêu cầu. Vì lý do này mà AT89C51 để phát triển một hệ thống dựa trên bộ vi điều khiển yêu cầu một bộ đốt ROM mà có hỗ trợ bộ nhớ Flash. Tuy nhiên lại không yêu cầu bộ xoá ROM. Lưu ý rằng trong bộ nhớ Flash ta phải xoá toàn bộ nội dung của ROM nhằm để lập trình lại

Page 92: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

93

cho nó. Việc xoá bộ nhớ Flash được thực hiện bởi chính bộ đốt PROM và đây chính là lý do tại sao lại không cần đến bộ xoá.

Bảng 3.2: Các phiên bản của 8051 từ Atmel(Flash ROM)

Số linh kiện ROM RAM Chân I/O Timer Ngắt Vcc Đóng vỏ

AT89C51 4K 128 32 2 6 5V 40

AT89LV51 4K 128 32 2 6 3V 40

AT89C1051 1K 64 15 1 3 3V 20

AT89C2051 2K 128 15 2 6 3V 20

AT89C52 8K 128 32 3 8 5V 40

AT89LV52 8K 128 32 3 8 3V 40

Chữ C trong ký hiệu AT89C51 là CMOS.

+ Bộ vi điều khiển DS5000 từ hãng Dallas Semiconductor.

Một phiên bản phổ biến khác nữa của 8051 là DS5000 của hãng Dallas Semiconductor. Bộ nhớ ROM trên chíp của DS5000 ở dưới dạng NV-RAM. Khả năng đọc/ ghi của nó cho phép chương trình được nạp vào ROM trên chíp trong khi nó vẫn ở trong hệ thống (không cần phải lấy ra). Điều này còn có thể được thực hiện thông qua cổng nối tiếp của máy tính IBM PC.Việc nạp chương trình trong hệ thống (in-system) của DS5000 thông qua cổng nối tiếp của PC làm cho nó trở thành một hệ thống phát triển tại chỗ lý tưởng. Một ưu việt của NV-RAM là khả năng thay đổi nội dung của ROM theo từng byte tại một thời điểm. Điều này tương phản với bộ nhớ Flash và EPROM mà bộ nhớ của chúng phải được xoá sạch trước khi lập trình lại cho chúng.

Bảng 3.3: Các phiên bản 8051 từ hãng Dallas Semiconductor.

Mã linh kiện ROM RAM Chân I/O Timer Ngắt Vcc Đóng vỏ

Page 93: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

94

DS5000-8

DS5000-32

DS5000T-8

DS5000T-8

8K

32K

8K

32K

128

128

128

128

32

32

32

32

2

2

2

2

6

6

6

6

5V

5V

5V

5V

40

40

40

40

+ Phiên bản OTP của 8051.

Các phiên bản OTP của 8051 là các chíp 8051 có thể lập trình được một lần và được cung cấp từ nhiều hãng sản xuất khác nhau. Các phiên bản Flash và NVRAM thường được dùng để phát triển sản phẩm mẫu. Khi một sản phẩm được thiết kế và được hoàn thiện tuyệt đối thì phiên bản OTP của 8051 được dùng đểsản hàng loạt vì nó sẽ hơn rất nhiều theo giá thành một đơn vị sản phẩm

+ Họ 8051 từ Hãng Philips

Một nhà sản xuất chính của họ 8051 khác nữa là Philips Corporation. Hãng này có một dải lựa chọn rộng lớn cho các bộ vi điều khiển họ 8051. Nhiều sản phẩm của hãng đã có kèm theo các đặc tính như các bộ chuyển đổi ADC, DAC, cổng I/0 mở rộng và cả các phiên bản OTP và Flash.

3.2. Cấu trúc phần cứng 8051 3.2.1. Các chân vi điều khiển

Hình 3.3 : Sơ đồ chân 8051

Page 94: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

95

a.Port0: là Port có 2 chức năng ở trên chân từ 32 đến 39 trong các thiết kế cỡ nhỏ (không dùng bộ nhớ mở rộng ) có hai chức năng như các đường I/O. Đối với các thiết kế cỡ lớn (với bộ nhớ mở rộng) nó được kết hợp kênh giữa các bus.

b.Port1: Port1 là một port I/O trên các chân 1-8. Các chân được ký hiệu P1.0, P1.1, P1.2 … có thể dùng cho các thiết bị ngoài nếu cần. Port1 không có chức năng khác, vì vậy chúng ta chỉ được dùng trong giao tiếp với các thiết bị ngoài.

c.Port2: Port2 là một port công dụng kép trên các chân 21 - 28 được dùng như các đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ mở rộng.

d.Port3: Port3 là một port công dụng kép trên các chân 10 - 17. Các chân của port này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tín đặc biệt của 8051 / 8031 như sau :

Bit Tên Chức năng chuyển đổi

P3.0 RXD Dữ liệu nhận cho port nối tiếp

P3.1 TXD Dữ liệu phát cho port nối tiếp

P3.2 INTO Ngắt 0 bên ngoài

P3.3 INT1 Ngắt 1 bên ngoài

P3.4 TO Ngõ vào của timer/counter 0

P3.5 T1 Ngõ vào của timer/counter 1

P3.6 WR Xung ghi bộ nhớ dữ liệu ngoài

P3.7 RD Xung đọc bộ nhớ dữ liệu ngoài

e. PSEN (Program Store Enable) : 8051/8031 có 4 tín hiệu điều khiển

PSEN là tín hiệu ra trên chân 29. Nó là tín hiệu điều khiển để cho phép bộ nhớ chương trình mở rộng và thường được nối đến chân OE (Output Enable) của một EPROM để cho phép đọc các bytes mã lệnh.

Page 95: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

96

PSEN sẽ ở mức thấp trong thời gian lấy lệnh. Các mã nhị phân của chương trình được đọc từ EPROM qua bus và được chốt vào thanh ghi lệnh của 8051 để giải mã lệnh. Khi thi hành chương trình trong ROM nội (8051), PSEN sẽ ở mức thụ động (mức cao).

f.ALE (Address Latch Enable)

tín hiệu ra ALE trên chân 30 tương hợp với các thiết bị làm việc với các xử lí 8585, 8088, 8086, 8051 dùng ALE một cách tương tự cho làm việc giải các kênh các bus địa chỉ và dữ liệu. Khi Port 0 được dùng trong chế độ chuyển đổi, vừa là bus dữ liệu vừa là bus thấp của địa chỉ, ALE là tín hiệu để chốt địa chỉ vào một thanh ghi bên ngoài trong nửa đầu của chu kỳ bộ nhớ. Sau đó, các đường Port 0 dùng để xuất hoặc nhập dữ liệu trong nửa sau chu kỳ của bộ nhớ.

Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng là nguồn xung nhịp cho các hệ thống. Nếu xung trên 8051 là 12MHz thì ALE có tần số 2MHz. Chỉ ngoại trừ khi thi hành lệnh MOVX, một xung ALE sẽ bị mất. Chân này cũng được làm ngõ vào cho xung lập trình cho EPROM trong 8051.

g. EA (External Access)

Tín hiệu vào EA trên chân 31 thường được mắc lên mức cao (+5V) hoặc mức thấp (GND). Nếu ở mức cao, 8051 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng. Khi dùng 8031, EA luôn được nối mức thấp vì không có bộ nhớ chương trình trên chip. Nếu EA được nối mức thấp bộ nhớ bên trong, chương trình 8051 sẽ bị cấm và chương trình thi hành từ EPROM mở rộng.

h. RST (Reset)

Ngõ vào RST trên chân 9 là ngõ reset của 8051. Khi tín hiệu này được đưa lên múc cao (trong ít nhất 2 chu kỳ máy), các thanh ghi trong 8051 được tải những giá trị thích hợp để khởi động hệ thống.

i. Các ngõ vào bộ dao động trên chip

Như đã thấy trong các hình trên, 8051 có một bộ dao động trên chip. Nó thường được nối với thạch anh giữa hai chân 18 và 19. Các tụ giữa cũng cần thiết như đã vẽ. Tần số thạch anh thông thường là 12MHz.

j. Các chân nguồn

Page 96: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

97

8051 vận hành với nguồn đơn +5V. Vcc được nối vào chân 40 và Vss (GND) được nối vào chân 20.

3.2.2. Tổ chức bộ nhớ

8051 / 8031 có bộ nhớ theo cấu trúc Harvard: có những vùng cho bộ nhớ riêng biệt cho chương trình dữ liệu. Như đã nói ở trên, cả chương trình và dữ liệu có thể ở bên trong 8051, dù vậy chúng có thể được mở rộng bằng các thành phần ngoài lên đến tối đa 64 Kbytes bộ nhớ chương trình và 64 Kbytes bộ nhớ dữ liệu.

Bộ nhớ bên trong bao gồm ROM (8051) và RAM trên chip, RAM trên chip bao gồm nhiều phần : phần lưu trữ đa dụng, phần lưu trữ địa chỉ hóa từng bit, các bank thanh ghi và các thanh ghi chức năng đặc biệt.

Hai đặc tính cần lưu ý là:

- Các thanh ghi và các port xuất nhập đã được xếp trong bộ nhớ và có thể được truy xuất trực tiếp như các địa chỉ bộ nhớ khác.

- Ngăn xếp bên trong RAM nội nhỏ hơn so với RAM ngoài như trong các bộ vi xử lí khác.

Chi tiết về bộ nhớ RAM trên chip :

Như ta đã thấy trên hình sau, RAM bên 8051/ 8031 được phân chia giữa các bank thanh ghi (00H - 1FH), RAM địa chỉ hóa từng bit (20H - 2FH), RAM đa dụng (30H - 7FH) và các thanh ghi chức năng đặc biệt (80H - FFH).

Bộ nhớ

chương trình

được chọn

Bộ nhớ

dữ liệu

được chọn

FFFFH

FFFFH

FFH

Hình 3.4. Không gian bộ nhớ

Page 97: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

98

Địa chỉ byte

FF

30

2F

2E

2D

2C

2B

2A

29

28

27

26

25

24

23

22

21

20

1F

18

RAM đa dụng

7F 7E 7D 7C 7B 7A 79 78

77 76 75 74 73 72 71 70

6F 6E 6D 6C 6B 6A 69 68

67 66 65 64 63 62 61 60

5F 5E 5D 5C 5B 5A 59 58

57 56 55 54 53 52 51 50

4F 4E 4D 4C 4B 4A 49 48

47 46 45 44 43 42 41 40

3F 3E 3D 3C 3B 3A 39 38

37 36 35 34 33 32 31 30

2F 2E 2D 2C 2B 2A 29 28

27 26 25 24 23 22 21 20

1F 1E 1D 1C 1B 1A 19 18

17 16 15 14 13 12 11 10

0F 0E 0D 0C 0B 0A 09 08

07 06 05 04 03 02 01 00

BANK 3

BANK 2

BANK 1

Page 98: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

99

17

10

0F

08

07

00

Default register

Bank for R0R7

Mọi địa chỉ trong vùng RAM đa dụng đều có thể được truy xuất tự do dùng cách đánh địa chỉ trực tiếp hoặc gián tiếp. Ví dụ, để đọc nội dung ở địa chỉ 5FH của RAM nội vào thanh ghi tích lũy lệnh sau sẽ được dùng:

MOV A, 5FH

Lệnh này di chuyển một bus dữ liệu dùng cách đánh địa chỉ trực tiếp để xác định "địa chỉ nguồn" (5FH). Đích nhận dữ liệu được ngầm xác định trong mã lệnh là thanh ghi tích lũy A.

RAM bên trong cũng có thể được truy xuất dùng cách đánh địa chỉ gián tiếp qua RO hay R1. Ví dụ, sau khi thi hành cùng nhiệm vụ như lệnh đơn ở trên:

MOV R0, #5FH

MOV A, @R0

Lệnh đầu dùng địa chỉ tức thời để di chuyển giá trị 5FH vào thanh ghi R0 và lệnh thứ hai dùng địa trực tiếp để di chuyển dữ liệu "được trỏ bởi R0" vào thanh ghi tích lũy.

3.2.3. Các bank thanh ghi

32 byte thấp nhất của bộ nhớ nội là dành cho các bank thanh ghi. Bộ lệnh của 8051/8031 hỗ trợ 8 thanh ghi (R0 đến R7) và theo mặc định (sau khi Reset hệ thống) các thanh ghi này ở các địa chỉ 00H-07H. Lệnh sau đây sẽ đọc nội dung ở địa chỉ 05H vào thanh ghi tích lũy.

MOV A,R5

Hình 3.5. Địa chỉ bộ nhớ RAM

Page 99: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

100

Đây là lệnh một byte dùng địa chỉ thanh ghi. Tất nhiên, thao tác tương tự có thể được thi hành bằng lệnh 2 byte dùng địa chỉ trực tiếp nằm trong byte thứ hai.

MOV A,05H

Các lệnh dùng các thanh ghi R0 đến R7 thì sẽ ngắn hơn và nhanh hơn các lệnh tương ứng nhưng dùng địa chỉ trực tiếp. Các giá trị dữ liệu được dùng thường xuyên nên dùng một trong các thanh ghi này.

Bank thanh ghi tích cực có thể chuyển đổi bằng cách thay đổi các bit chọn bank thanh ghi trong từ trạng thái chương trình (PSW).

ý tưởng dùng "các bank thanh ghi" cho phép "chuyển hướng" chương trình nhanh và hiệu quả (từng phần riêng rẽ của phần mềm sẽ có một bộ thanh ghi riêng không phụ thuộc vào các phần khác).

3.2.4. Các thanh ghi chức năng đặc biệt

Các thanh ghi nội của 8051/8031 được truy xuất ngầm định bởi bộ lệnh. Ví dụ lệnh "INC A" sẽ tăng nội dung của thanh ghi tích lũy A lên 1. Tác động này được ngầm định trong mã lệnh.

Các thanh ghi trong 8051/8031 được định dạng như một phần của RAM trên chip. Vì vậy mỗi thanh ghi sẽ có một địa chỉ (ngoại trừ thanh ghi trực tiếp, sẽ không có lợi khi đặt chúng vào trong RAM trên chip). Đó là lý do để 8051/8031 có nhiều thanh ghi. Cũng như R0 đến R7, có 21 thanh ghi chức năng đặc biệt (SFR: Special Funtion Rgister) ở vùng trên của RAM nội, từ địa chỉ 80H đến FFH. Chú ý rằng hầu hết 128 địa chỉ từ 80H đến FFH không được định nghĩa. Chỉ có 21 địa chỉ SFR là được định nghĩa.

Ngoại trừ tích lũy (A) có thể được truy xuất ngầm như đã nói, đa số các SFR được truy xuất dùng địa chỉ trực tiếp. Chú ý rằng một vài SFR có thể được địa chỉ hóa bit hoặc byte. Người thiết kế phải thận trọng khi truy xuất bit và byte. Ví dụ lệnh sau:

SETB 0E0H

Sẽ Set bit 0 trong thanh ghi tích lũy, các bit khác không thay đổi. Ta thấy rằng E0H đồng thời là địa chỉ byte của thanh ghi tích lũy và là địa chỉ bit có trọng số nhỏ nhất trong thanh ghi tích lũy. Vì lệnh SETB chỉ tác động trên bit, nên chỉ có địa chỉ bit là có hiệu quả.

3.2.4.1. Thanh ghi từ trạng thái chương trình

Page 100: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

101

Từ trạng thái chương trình (PSW: Program Status Word) ở địa chỉ D0H chứa các bit trạng thái như bảng tóm tắt sau:

Bảng 3. 4. Thanh ghi từ trạng thái chương trình

Bit Ký hiệu Địa chỉ Y nghĩa

PSW.7

PSW.6

PSW.5

PSW.4

PSW.3

PSW.2

PSW.1

PSW.0

CY

AC

F0

RS1

RS0

OV

P

D7H

D6H

D5H

D4H

D3H

D2H

D1H

D0H

Cờ nhớ

Cờ nhớ phụ

Cờ 0

Bit 1 chọn bank thanh ghi

Bit chọn bank thanh ghi.

00=bank 0; địa chỉ 00H-07H

01=bank 1: địa chỉ 08H-0FH

10=bank 2:địa chỉ 10H-17H

11=bank 3:địa chỉ 18H-1FH

Cờ tràn

Dự trữ

Cờ Parity chẵn.

a. Cờ nhớ (CY) có công dụng kép. Thông thường nó được dùng cho các lệnh toán học: nó sẽ được set nếu có một số nhớ sinh ra bởi phép cộng hoặc có một số mượn phép trừ . Ví dụ, nếu thanh ghi tích lũy chứa FFH, thì lệnh sau:

ADD A, #1

Sẽ trả về thanh ghi tích lũy kết quả 00H và set cờ nhớ trong PSW.

Cờ nhớ cũng có thể xem như một thanh ghi 1 bit cho các lệnh luận lý thi hành trên bit. Ví dụ, lệnh sau sẽ AND bit 25H với cờ nhớ và đặt kết quả trở vào cờ nhớ.

AND C, 25H

b. Cờ nhớ phụ

Page 101: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

102

Khi cộng các số BCD, cờ nhớ phụ (AC) được set nếu kết quả của 4 bit thấp trong khoảng 0AH đến 0FH. Nếu các giá trị cộng được là số BCD, thì sau lệnh cộng cần có DA A (hiệu chỉnh thập phân thanh ghi tích lũy) để mang kết quả lớn hơn 9 trở về tầm từ 0 - 9.

c. Cờ 0

Cờ 0 (F0) là một bit cờ đa dụng dành các ứng dụng của người dùng.

d. Các bit chọn bank thanh ghi

Các bit chọn bank thanh ghi (RS0 và RS1) xác định bank thanh ghi được tích cực. Chúng được xóa sau khi reset hệ thống và được thay đổi bằng phần mềm nếu cần. Ví dụ, ba lệnh sau cho phép bank thanh ghi 3 và di chuyển nội dung của thanh ghi R7 (địa chỉ byte IFH) đến thanh ghi tích lũy:

SETB RS1

SETB RS0

MOV A, R7

Khi chương trình được hợp dịch các địa chỉ bit đúng được thay thế cho các ký hiệu "RS1" và "RS0". Vậy lệnh SETB RS1 sẽ giống như lệnh SETB 0D4H.

e. Cờ tràn

Cờ tràn (OV) được set một lệnh cộng hoặc trừ nếu có một phép toán bị tràn. Khi các số có dấu được cộng hoặc trừ với nhau, phần mềm có thể kiểm tra bit này để xác định xem kết quả của nó có nằm trong tầm xác định không. Khi các số không dấu được cộng, bit OV có thể được bỏ qua. Các kết quả lớn hơn +127 hoặc nhỏ hơn -128 sẽ set bit OV.

3.2.4.2. Thanh ghi B

Thanh ghi B ở địa chỉ F0H được dùng cùng với thanh ghi tích lũy A cho các phép toán nhân và chia. Lệnh MUL AB sẽ nhân các giá trị không dấu 8 bit trong A và B rồi trả về kết quả 16 bit trong A (byte thấp) và B (byte cao). Lệnh DIV AB sẽ chia A cho B rồi trả về kết quả nguyên trong A và phần dư trong B. Thanh ghi B cũng có thể được xem như thanh ghi đệm đa dụng. Nó được địa chỉ hóa ttừng bit bằng các địa chỉ bit F0H đến F7H.

3.2.4.3. Con trỏ ngăn xếp

Page 102: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

103

Con trỏ ngăn xếp (SP) là một thanh ghi 8 bit ở địa chỉ 81H. Nó chứa địa chỉ của byte dữ liệu hiện hành trên đỉnh của ngăn xếp. Các lệnh trên ngăn xếp bao gồm các thao tác cất dữ liệu vào ngăn xếp và lấy dữ liệu ra khỏi ngăn xếp. Lệnh cất dữ liệu vào ngăn xếp sẽ làm tăng SP trước khi ghi dữ liệu, và lệnh lấy dữ liệu ra khỏi ngăn xếp sẽ dọc dữ liệu và làm giảm SP. Ngăn xếp của 8051/8031 được giữ trong RAM nội và được giới hạn các địa chỉ có thể truy xuất bằng địa chỉ gián tiếp. Chúng là 128 byte đầu của 8051/8031.

Để khởi động lại SP với ngăn xếp bắt đầu tại 60H, các lệnh sau đây được dùng:

MOV SP,#5FH

Trên 8051/8031 ngăn xếp bị giới hạn 32 byte vì địa chỉ cao nhất của RAM trên chip là 7FH. Sở dĩ dùng giá trị 5FH vì SP sẽ tăng lên 60H trước khi cất byte dữ lệu đầu tiên.

Người thiết kế có thể chọn không phải khởi động lại con trỏ ngăn xếp mà để nó lấy giá trị mặc định khi reset hệ thống.Giá trị măc định đó là 07H và kết quả là ngăn đầu tiên để cất dữ liệu có địa chỉ 08H. Nếu phần mềm ứng dụng không khởi động lại SP, bank thanh ghi 1 (có thể cả 2 và 3) sẽ không dùng được vì vùng RAM này đã được dùng làm ngăn xếp.

Ngăn xếp được truy xuất trực tiếp bằng các lệnh PUSH và POP để lưu giữ tạm thời và lấy lại dữ liệu hoặc được truy xuất ngầm bằng các lệnh gọi chương trình con (ACALL, LACALL) và các lệnh trở về (RET, RETI) để cất và lấy lại bộ đếm chương trình.

3.2.4.4. Con trỏ dữ liệu

Con trỏ dữ liệu (DPTR) được dùng để truy xuất bộ nhớ ngoài là một thanh ghi 16 bit ở địa chỉ 82H (DPL: byte thấp) và 83H (DPH: byte cao). Ba lệnh sau sẽ ghi 55H vào RAM ngoài ở địa chỉ 1000H:

MOV A, #55H

MOV DPTR, #1000H

MOVX @DPTR, A

Lệnh đầu tiên dùng địa chỉ tức thời để tải dữ liệu 55H vào thanh ghi tích lũy, lệnh thứ hai cũng dùng địa chỉ tức thời, lần này để tải dữ liệu 16 bit 1000H vào con trỏ dữ liệu. Lệnh thứ ba dùng địa chỉ gián tiếp để di chuyển dữ liệu trong A (55H) đến RAM ngoài ở địa chỉ được chứa trong DPTR (1000H).

Page 103: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

104

3.2.4.5. Các thanh ghi port xuất nhập

Các port của 8051/8031 bao gồm Port 0 ở địa chỉ 80H, Port 1 ở địa chỉ 90 H, Port 2 ở địa chỉ A0H và Port 3 ở địa chỉ B0H. Tất cả các Port đều được địa chỉ hóa từng bit. Điều đó cung cấp một khả năng giao tiếp thuận lợi.

3.2.4.6. Các thanh ghi Timer

8051/8031 chứa 2 bộ định thời đếm 16 bit được dùng trong việc định thời hoặc đếm sự kiện. Timer 0 ở địa chỉ 8AH (TL0:byte thấp) và 8CH (TH0:byte cao).Timer 1 ở địa chỉ 8BH (TL1:byte thấp) và 8DH (TH1: byte cao). Việc vận hành timer được set bởi thanh ghi Timer Mode (TMOD) ở địa chỉ 89H và thanh ghi điều khiển timer (TCON) ở địa chỉ 88H. Chỉ có TCON được địa chỉ hóa từng bit.

3.2.4.7. Các thanh ghi port nối tiếp

8051/8031 chứa một port nối tiếp trên chip dành cho việc trao đổi thông tin với các thiết bị nối tiếp như máy tính, modem hoặc cho việc giao tiếp với các IC khác có giao tiếp nối tiếp (có bộ chuyển đổi A/D, các thanh ghi dịch..). Một thanh ghi gọi là bộ đệm dữ liệu nối tiếp (SBUF) ở địa chỉ 99H ssẽ giữ cả hai dữ liệu truyền và nhận. Khi truyền dữ liệu thì ghi lên SBUF, khi nhận dữ liệu thì đọc SBUF. Các mode vận hành khác nhau được lập trình qua thanh ghi điều khiển port nối tiếp (SCON) (được địa chỉ hóa từng bit) ở địa chỉ 98H.

3.2.4.8. Các thanh ghi ngắt

8051/8031 có cấu trúc 5 nguồn ngắt, 2 mức ưu tiên. Các ngắt bị cấm sau khi reset hệ thống và sẽ được cho phép bằng việc ghi thanh ghi cho phép ngắt (IE) ở địa chỉ 8AH. Cả hai thanh ghi được địa chỉ hóa từng bit.

3.2.4.9. Các thanh ghi điều khiển công suất

Thanh ghi điều khiển công suất (PCON) ở địa chỉ 87H chứa nhiều bit điều khiển.

3.2.5. Bộ nhớ ngoài

8051/8031 có khả năng mở rộng bộ nhớ đến 64K bộ nhớ chương trình và 64K bộ nhớ dữ liệu bên ngoài. Do đó có thể dùng thêm ROM và RAM nếu cần.

Khi dùng bộ nhớ ngoài, Port 0 không còn là một port I/O thuần túy nữa. Nó được hợp kênh giữa bus địa chỉ (A0-A7) và bus dữ liệu (D0-D7) với tín hiệu ALE để chốt byte thấp của địa chỉ khi bắt đầu mỗi chu kỳ bộ nhớ. Port 2 thông thường được dùng cho byte cao của bus địa chỉ.

Page 104: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

105

Trong nửa đầu của mỗi chu kỳ bộ nhớ, byte thấp của địa chỉ được cấp trong port 0 và được chốt bằng xung ALE. Một IC chốt 74HC373 (hoặc tương đương) sẽ giữ byte địa chỉ thấp trong phần còn lại của chu kỳ bộ nhớ. Trong nửa sau của chu kỳ bộ nhớ Port 0 được dùng như bus dữ liệu và được đọc hoặc ghi tùy theo lệnh.

3.2.5.1. Truy xuất bộ nhớ chương trình ngoài

Bộ nhớ chương trình ngoài là một IC ROM được phép bởi tín hiệu PSEN. Hình sau mô tả cách nối một EPROM vào 8051/8031:

Hình 3.3. Giao tiếp giữa 8051/8031 và EPROM

Một chu kỳ máy của 8051/8031 có 12 chu kỳ xung nhịp. Nếu bộ dao động trên chip được tạo bởi một thạch anh 12MHz thì chu kỳ máy kéo dài 1s. Trong một chu kỳ máy sẽ có 2 xung ALE và 2 byte được đọc từ bộ nhớ chương trình (nếu lệnh hiện hành là một byte thì byte thứ hai sẽ được loại bỏ).

3.2.5.2. Truy xuất bộ nhớ dữ liệu ngoài

Port 0

EA

8051

ALE

Port 2

D0-D7

A0-A7

EPROM

A8-A15

D Q

74HC373

Page 105: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

106

Hình 3.8. Giao tiếp giữa 8051/8031 và RAM

Bộ nhớ dữ liệu ngoài là một bộ nhớ RAM được cho phép ghi/đọc bằng các tín hệu WR/ và RD (các chân P3.6 và P3.7 thay đổi chức năng). Chỉ có một cách truy xuất bộ nhớ dữ liệu ngoài là với lệnh MOVX dùng con trỏ dữ liệu (DPTR) 16 bit hoặc R0 và R1 xem như thanh ghi địa chỉ.

Kết nối bus địa chỉ và bus dữ liệu giữa RAM và 8051/8031 cũng giống EPROM và do đó cũng có thể lên đến 64 byte bộ nhớ RAM. Ngoài ra, chân RD của 8051/8031 được nối tới chân cho phép xuất (OE) của RAM và chân WR được nối tới chân ghi (WR) của RAM.

Giản đồ thời gian cho lệnh đọc bộ nhớ dữ liệu ngoài được vẽ trên hình sau đối với lệnh MOVX A, @DPTR:

S5

DPL

Moät chu kyø maùy

Port 2 PCH

Opcode

S2

RD

S3

PCL

S1 S6

DPH

ALE

PSEN

S1 S2S4 S3 S4 S5 S6

Port 0DATA

Moät chu kyø maùy

Port 0

8051

EA

ALE

Port 2

D0-D7

RAM

A0-A7

A -A

74HC373

O D

Page 106: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

107

Hình 3.9: Giản đồ thời gian của lệnh MOVX

Giản đồ thời gian cho lệnh ghi (MOVX @DPTR, A) cũng tương tự chỉ khác đường WR sẽ thay vào đường RD và dữ liệu được xuất ra trên port 0 (RD vẫn giữ mức cao).

3.2.6. Lệnh Reset

8051/8031 được reset bằng cách giữ chân RST ở mức cao ít nhất trong 2 chu kỳ máy và trả nó về mức thấp. RST có thể được kích khi cấp điện dùng một mạch R-C.

Trạng thái của tất cả các thanh ghi của 8051/8031 sau khi reset hệ thống được tóm tắt trong bảng sau:

Bảng 3.5. Trạng thái các thanh ghi sau khi Reset

Thanh ghi Nội dung

Đếm chương trình

Tích lũy

B

0000H

00H

00H

+5V+5V

100

8,2K

10UF

Hình 6.10. Mạch Reset hệ thống

Page 107: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

108

PSW

SP

DPTR

Port 0-3

IP

IE

Các thanh ghi định thời

SCON

SBUF

PCON(HMOS)

PCON(CMOS)

00H

07H

0000H

FFH

XXX00000B

0XX00000B

00H

00H

00H

0XXXXXXB

0XXX0000B

Quan trọng nhất trong các thanh ghi trên là thanh ghi đếm chương trình, nó được đặt lại 0000H. Khi RST trở lại mức thấp, việc thi hành chương trình luôn bắt đầu ở địa chỉ đầu tiên trong bộ nhớ trong chương trình: địa chỉ 0000H. Nội dung của RAM trên chip không bị thay đổi bởi lệnh reset.

3.3. Lập trình với họ 8051

3.3.1. Tóm tắt tập lệnh của 8051

Các chương trình được cấu tạo từ nhiều lệnh, chúng được xây dựng logic, sự nối tiếp của các lệnh được nghĩ ra một cách hiệu quả và nhanh chóng, kết quả của chương trình khả thi.

Tập lệnh họ MSC-51 được sự kiểm tra của các mode định vị và các lệnh của chúng có các Opcode 8 bit. Điều này cung cấp khả năng 28 = 256 lệnh được thi hành (thực tế có 255 lệnh, một lệnh không được định nghĩa). Ngoài opcode, một số lệnh còn có thêm 1 hoặc 2 byte cho dữ liệu hoặc địa chỉ. Trong toàn bộ các lệnh có 139 lệnh 1 byte, 92 lệnh 2 byte và 24 lệnh 3 byte.

3.3.2. Các mode định địa chỉ (Addressing Mode)

Page 108: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

109

Các mode định địa chỉ là một bộ phận thống nhất của tập lệnh. Chúng cho phép định rõ nguồn hoặc đích của dữ liệu theo các cách khác nhau tùy thuộc vào tình huống lập trình. 8051 có 8 mode định địa chỉ được dùng như sau:

" Thanh ghi.

" Trực tiếp.

" Gián tiếp.

" Tức thời.

" Tương đối.

" Tuyệt đối.

"Dài.

"Định vị.

3.3.2.1. Sự định địa chỉ thanh ghi (Register Addressing)

Người lập trình trên 8051 có thể truy xuất 8 thanh ghi làm việc được đánh số từ R0 – R7. Các lệnh sử dụng kiểu định địa chỉ thanh ghi được mã hóa bằng cách dùng 3 bit thấp nhất của opcode của lệnh để chỉ ra một thanh ghi bên trong địa chỉ logic này. Vậy thì một mã chức năng và địa chỉ toán hạng có thể kết hợp để hình thành một lệnh ngắn (1 byte).

Ví dụ: ADD A, R7 sẽ có opcode là 00101111B. Năm bit cao 00101 cho biết đây là lệnh cộng và 3 bit thấp chỉ ra thanh ghi R7.

Có 4 dãy thanh ghi 32 byte đầu tiên của RAM dữ liệu trên Chip địa chỉ 00H - 1FH, nhưng tại một thời điểm chỉ có một dãy hoạt động. Các bit PSW3, PSW4 của từ trạng thái chương trình sẽ quyết định dãy nào hoạt động.

Một vài lệnh dùng cụ thể cho 1 thanh ghi nào đó như thanh ghi A, DPTR.... mã Opcode tự nó cho biết thanh ghi vì các bit địa chỉ không cần biết đến.

Lưu ý:

Opcode n n n

Page 109: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

110

+ Các thanh ghi nguồn và đích phải phù hợp về kích thước. Hay nói cách khác, nếu viết “MOV DPTR, A” sẽ cho một lỗi vì nguồn là thanh ghi 8 bit và đích lại là thanh ghi 16 bit.

MOV DPTR, #25F5H

MOV R7, DPL

MOV R6, DPH

+ Ta có thể chuyển dữ liệu giữa thanh ghi tích luỹ A và thanh ghi Rn (n từ 0 đến 7) nhưng việc chuyển dữ liệu giữa các thanh ghi Rn thì không được phép. Ví dụ, lệnh “MOV R4, R7” là không hợp lệ. 3.3.2.2. Sự định địa chỉ trực tiếp (Direct Addressing)

Sự định địa chỉ trực tiếp có thể truy xuất các biến nhớ hoặc các thanh ghi trên chip. Một byte địa chỉ trực tiếp được đưa vào Opcode để định rõ vị trí được dùng như sau:

Tùy thuộc các bit bậc cao của địa chỉ trực tiếp mà một trong 2 vùng nhớ trên chip được chọn. Khi bit 7 = 0, thì địa chỉ trực tiếp ở trong khoảng 0 - 127 (00H - 7FH) và 128 vị trí nhớ thấp của RAM trên chip được chọn.

Tất cả các Port I/O, các thanh ghi chức năng đặc biệt, thanh ghi điều khiển hoặc thanh ghi trạng thái bao giờ cũng được quy định các địa chỉ trong khoảng 128 - 255 (80 - FFH). Khi byte địa chỉ trực tiếp nằm trong giới hạn này (ứng với bit 7 = 1) thì thanh ghi chức năng đặc biệt được truy xuất. Ví dụ Port 0 và Port 1 được quy định địa

Opcode

Direct Addressing

Page 110: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

111

chỉ trực tiếp là 80H và 90H. Chẳng hạn lệnh: MOV P1, A sự biên dịch sẽ xác định địa chỉ trực tiếp của Port 1 là 90H đặt vào hai byte của lệnh (byte 1 của port 0).

Lưu ý:

+ Dấu (# 0 là sự phân biệt giữa hai chế độ đánh địa chỉ. Xét các ví dụ dưới đây và lưu ý rằng các lệnh không có dấu (#):

MOV R0, 40H ; Lưu nội dung của ngăn nhớ 40H của RAM vào R0

MOV R2, #05 ; Gán R2 = 05

MOV A, 2 ; Sao nội dung thanh ghi R2 vào A

MOV B, 2 ; Sao nội dung thanh ghi R2 vào B

MOV 7, 2 ; Sao nội dung thanh ghi R7 vì lệnh “MOV R7, R2” là không hợp lệ.

MOV R4, 7FH ; Chuyển nội dung ngăn nhớ 7FH của RAM vào R4

+ Các ngăn nhớ trừ 0 đến 7 của RAM được cấp cho bank0 của các thanh ghi R0 - R7. Các thanh ghi này có thể được truy cập theo 2 cách như sau:

MOV A, 4 ;Hai lệnh này giống nhau đều sao nội dung thanh ghi R4 vào A

MOV A, R4

+ Mặc dù sử dụng các tên R0 - R7 dễ hơn các địa chỉ bộ nhớ của chúng nhưng các ngăn nhớ 30H đến 7FH của RAM không thể được truy cập theo bất kỳ cách nào khác là theo địa chỉ của chúng vì chúng không có tên.

+ Các thanh ghi SFR có địa chỉ nàm giữa 80H và FFH các địa chỉ này ở trên 80H, vì các địa chỉ từ 00 đến 7FH là địa chỉ của bộ nhớ RAM bên trong 8051.

+ Không phải tất cả mọi địa chỉ từ 80H đến FFH đều do SFR sử dụng, nhưng vị trí ngăn nhớ từ 80H đến FFH chưa dùng là để dự trữ và lập trình viên 8051 cũng không được sử dụng.

+ Các thanh ghi có thể đánh địa chỉ theo bit

Page 111: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

112

Xét theo chế độ đánh địa chỉ trực tiếp thì cần phải lưu ý rằng giá trị địa chỉ được giới hạn đến 1byte, 00 - FFH. Điều này có nghĩa là việc sử dụng của chế độ đánh địa chỉ này bị giới hạn bởi việc truy cập các vị trí ngăn nhớ của RAM và các thanh ghi với địa chỉ được cho bên trong 8051.

+ Ngăn xếp và chế độ đánh địa chỉ trực tiếp

Một công dụng chính khác của chế độ đánh địa chỉ trực tiếp là ngăn xếp. Trong họ 8051 chỉ có chế độ đánh địa chỉ trực tiếp là được phép đẩy vào ngăn xếp. Do vậy, một lệnh như “PUSH A” là không hợp lệ. Việc đẩy thanh ghi A vào ngăn xếp phải được viết dưới dạng “PUSH 0E0H” với 0E0H là địa chỉ của thanh ghi A. Tương tự như vậy để đẩy thanh ghi R3 bank 0 vào ngăn xếp ta phải viết là “PUSH 03”. Chế độ đánh địa chỉ trực tiếp phải được sử dụng cho cả lệnh POP. Ví dụ “POP 04” sẽ kéo đỉnh của ngăn xếp vào thanh ghi R4 bank 0.

3.3.2.3. Sự định địa chỉ gián tiếp (Indirect Addressing)

Trong chế độ này, một thanh ghi được sử dụng như một con trỏ đến dữ liệu. Bit có trọng số nhỏ nhất của Opcode lệnh sẽ xác định R0 hay R1 được dùng con trỏ Pointer.

Nếu dữ liệu ở bên trong CPU thì chỉ các thanh ghi R0 và R1 được sử dụng cho mục đích này. Hay nói cách khác các thanh ghi R2 - R7 không có thể dùng được để giữ địa chỉ của toán hạng nằm trong RAM khi sử dụng chế độ đánh địa chỉ này. Khi R0 và R1 được dùng như các con trỏ, nghĩa là khi chúng giữ các địa chỉ của các ngăn nhớ RAM thì trước chúng phải đặt dấu (@) như chỉ ra dưới đây.

MOV A, @ R0; Chuyển nội dung của ngăn nhớ RAM có địa chỉ trong R0 và A

MOV @ R1, B ; Chuyển nội dung của B vào ngăn nhớ RAM có địa chỉ ở R1

Lưu ý rằng R0 cũng như R1 luôn có dấu “@” đứng trước. Khi không có dấu này

thì đó là lệnh chuyển nội dung các thanh ghi R0 và R1 chứ không phải dữ liệu ngăn nhớ mà địa chỉ có trong R0 và R1.

Ví dụ

Page 112: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

113

Viết chương trình để sao chép giá trị 55H vào ngăn nhớ RAM tại địa chỉ 40H đến 44H sử dụng:

a) Chế độ đánh địa chỉ trực tiếp

b) Chế độ đánh địa chỉ gián tiếp thanh ghi không dùng vòng lặp

c) Chế độ b có dùng vòng lặp

Lời giải:

a) MOV A, #55H ; Nạp A giá trị 55H

MOV 40H, A ; Sao chép A vào ngăn nhớ RAM 40H

MOV 41H, A ; Sao chép A vào ngăn nhớ RAM 41H

MOV 42H, A ; Sao chép A vào ngăn nhớ RAM 42H

MOV 43H, A ; Sao chép A vào ngăn nhớ RAM 43H

MOV 44H, A ; Sao chép A vào ngăn nhớ RAM 44H

b)

MOV A, # 55H ; Nạp vào A giá trị 55H

MOV R0, #40H ; Nạp con trỏ R0 = 40 H

MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ đến

INC R0 ; Tăng con trỏ. Bây gì R0 = 41H

MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ

INC R0 ; Tăng con trỏ. Bây giờ R0 = 42H

MOV @R0,A ; Sao chép Avào vị trí ngăn nhớ RAM do R0 chỉ

INC R0 ; Tăng con trỏ. Bây giờ R0 = 43H

Page 113: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

114

MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ

MOV @R0, A ;Tăng con trỏ. Bây gờ R0 = 44H

MOV @R0, A

c)

MOV A, # 55H ; Nạp vào A giá trị 55H

MOV R0, #40H ; Nạp con trỏ địa chỉ ngăn nhớ RAM R0 = 40H

MOV R2, #05 ; Nạp bộ đếm R2 = 5

AGAIN: MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ \ đến

INC ; Tăng con trỏ R0

DJNZ R2, AGAIN; Lặp lại cho đến khi bộ đếm = 0.

Nhận xét

+ ưu điểm của chế độ đánh địa chỉ gián tiếp thanh ghi.

Một trong những ưu điểm của chế độ đánh địa chỉ gián tiếp thanh ghi là nó làm cho việc truy cập dữ liệu năng động hơn so với chế độ đánh địa chỉ trực tiếp.

+ Hạn chế của chế độ đánh địa chỉ gián tiếp thanh ghi trong 8051

R0 và R1 là các thanh ghi duy nhất có thể được dùng để làm các con trỏ trong chế độ đánh địa chỉ gián tiếp thanh ghi. Vì R0 và R1 là các thanh ghi 8 bit, nên việc sử dụng của chúng bị hạn chế ở việc truy cập mọi thông tin trong các ngăn nhớ RAM bên trong (các ngăn nhớ từ 30H đến 7FH và các thanh ghi SFR). Tuy nhiên, nhiều khi ta cần truy cập dữ liệu được cất trong RAM ngoài hoặc trong không gian mã lệnh của ROM trên chip. Hoặc là truy cập bộ nhớ RAM ngoài hoặc ROM trên chíp thì ta cần sử dụng thanh ghi 16 bit đó là DPTR.

3.3.2.4. Sự định địa chỉ tức thời (Immediate Addressing)

Page 114: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

115

Opcode

Immediate Data

Opcode

Relative Offset

Sự định địa chỉ tức thời được tượng trưng bởi ký hiệu # được đứng trước một hằng số, 1 biến ký hiệu hoặc một biểu thức số học được sử dụng bởi các hằng, các ký hiệu, các hoạt động do người điều khiển. Trình biên dịch tính toán giá trị và thay thế dữ liệu tức thời. Byte lệnh thêm vào chứa trị số dữ liệu tức thời như sau:

Ví dụ: MOV A, #12 sẽ nạp giá trị 12(0CH) vào thanh chứa A.

Tất cả các lệnh sử dụng kiểu định địa chỉ tức thời đều sử dụng hằng dữ liệu 8 bit làm dữ liệu tức thời. Có một ngoại lệ khi ta sử dụng con trỏ dữ liệu 16 bit DPTR, hằng địa chỉ 16 bit được cần đến. Ví dụ: DPTR, #8000H.

3.3.2.5. Sự định địa chỉ tương đối

Sự định địa chỉ tương đối chỉ sử dụng với những lệnh nhảy nào đó. Một địa chỉ tương đối (hoặc Offset) là một giá trị 8 bit mà nó được cộng vào bộ đếm chương trình PC để tạo thành địa chỉ một lệnh tiếp theo được thực thi. Phạm vi của sự nhảy nằm trong khoảng -128 - 127. Offset tương đối được gắn vào lệnh như một byte thêm vào như sau:

Page 115: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

116

Addr10 - Addr8 Opcode

Addr7 - Addr0

Những nơi nhảy đến thường được chỉ rõ bởi các nhãn và trình biên dịch xác định Offset Relative cho phù hợp.

Sự định vị tương đối đem lại thuận lợi cho việc cung cấp mã vị trí độc lập, nhưng bất lợi là chỉ nhảy ngắn trong phạm vi -128 - 127 byte.

3.3.2.3. Sự định địa chỉ tuyệt đối (Absolute Addressing)

Sự định địa chỉ tuyệt đối được dùng với các lệnh ACALL và AJMP. Các lệnh 2 byte cho phép phân chia trong trang 2K đang lưu hành của bộ nhớ mã của việc cung cấp 11 bit thấp để xác định địa chỉ trong trang 2K (A0…A10 gồm A10…A8 trong Opcode và A7…A0 trong byte) và 5 bit cao để chọn trang 2K (5 bit cao đang lưu hành trong bộ đếm chương trình là 5 bit Opcode).

Sự định vị tuyệt đối đem lại thuận lợi cho các lệnh ngắn (2 byte), nhưng bất lợi trong việc giới hạn phạm vi nơi gởi đến và cung cấp mã có vị trí độc lập.

3.3.2.7. Sự định vị dài (Long Addressing)

Sự định vị dài được dùng với lệnh LCALL và LJMP. Các lệnh 3 byte này bao

Opcode

Addr15 - Addr8

Addr7 - Addr0

Page 116: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

117

gồm một địa chỉ nơi gởi tới 16 bit đầy đủ là 2 byte và 3 byte của lệnh.

Ưu điểm của sự định vị dài là vùng nhớ mã 64K có thể được dùng hết, nhược điểm là các lệnh đó dài 3 byte và vị trí lệ thuộc. Sự phụ thuộc vào vị trí sẽ bất lợi bởi chương trình không thể thực thi tại địa chỉ khác.

3.3.2.8. Chế độ đánh địa chỉ theo chỉ số và truy cập bộ nhớ ROM trên chíp

Chế độ đánh địa chỉ theo chỉ số được sử dụng rộng rãi trongviệc truy cập các phần tử dữ liệu của bảng trong không gian ROM chương trình của 8051. Lệnh được dùng cho mục đích này là “MOVC A, @ A + DPTR”. Thanh ghi 16 bit DPTR là thanh ghi A được dùng để tạo ra địa chỉ của phân tử dữ liệu được lưu cất trong ROM trên chíp.

Do các phân tử dữ liệu được cất trong không gian mã (chương trình) của ROM trên chip của 8051, nó phải dùng lệnh MOVC thay cho lệnh MOV (chữ C ở cuối lệnh là chỉ mà lệnh Code). Trong lệnh này thì nội dung của A được bổ sung vào thanh ghi 16 bit DPTR để tạo ra địa chỉ 16 bit của dữ liệu cần thiết.

Xét ví dụ Giả sử từ “VSA” được lưu trong ROM có đĩa chỉ bắt đầu từ 200H và chương

trình được ghi vào ROM bắt đầu từ địa chỉ 0. Hãy phân tích cách chương trình hoạt động và hãy phát biểu xem từ “VSA” sau chương trình này được cất vào đâu?

ORG 0000H ; Bắt đầu đốt ROM tại địa chỉ 00H

MOV DPTR, #200H ; Địa chỉ bẳng trình bày DPTR = 200H

CLA A ; Xoá thanh ghi A (A = 0)

MOVC A, @A + DPTR ; Lấy ký tự từ không gian nhớ chương trình

MOV R0, A ; Cất nó vào trong R0

INC DPTR ; DPTR = 201, chỉ đến ký tự kế tiếp

CLR A ; Xoá thanh ghi A

MOVC A, @A + DPTR ; Lấy ký tự kế tiếp

Page 117: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

118

MOV R1, A ; Cất nó vào trong R1

INC DPTR ; DPTR = 202 con trỏ chỉ đến ký tự sau đó

CLA A ; Xoá thanh ghi A

MOVC A, @A + DPTR ; Nhận ký tự kế tiếp

MOV R2, A ; Cắt nó vào R2

HERE: SJMP HERE ; Dừng lại ở đây.

; Dữ liệu được đốt trong không gian mã lệnh tại địa chỉ 200H

ORG 200H

MYDATA: DB “VSA”

END ; Kết thúc chương trình

* Bảng sắp xếp và sử dụng chế độ đánh địa chỉ theo chỉ số

Bảng sắp xếp là khái niệm được sử dụng rất rộng rãi trong lập trình các bộ vi xử lý. Nó cho phép truy cập các phần tử của một bảng thường xuyên được sử dụng với thao tác cực tiểu.

Ví dụ: Giả thiết rằng đối với một ứng dụng nhất định ta cần x2 giá trị trong phạm vi 0 đến 9. Ta có thể sử dụng một bảng sắp xếp thay cho việc tính toán nó.

Hãy viết một chương trình để lấy x giá trị cống P1 và gửi giá trị x2 tới cổng P2 liên tục.

Lời giải:

ORG 00H

MOV DPTR, #300 H ; Nạp địa chỉ bảng sắp xếp

MOV A, #0FFH ; Nạp A giá trị FFH

MOV P1, A ; Đặt cổng P1 là đầu vào

Page 118: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

119

BACK: MOV A, P1 ; Lấy giá trị X từ P1

MOVC A, @A + DPTR ; Lấy giá trị X từ bảng XSDQ-TABLE

MOV P2, A ; Xuất nó ra cổng P2

SJMP BACK ; Lặp lại

ORG 300H

XSQR - TABLE:

DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81

END

Lưu ý bảng lệnh đầu tiên có thể thay bằng “MOV DPTR, #XSQR - TABLE”.

3.3.3. Các lệnh nhảy, vòng lặp và lệnh gọi

3.3.3.1. Vòng lặp và các lệnh nhảy

a.Tạo vòng lặp trong 8051

Quá trình lặp lại một chuỗi các lệnh với một số lần nhất định được gọi là vòng lặp. Vòng lặp là một trong những hoạt động được sử dụng rộng rãi nhất mà bất kỳ bộ vi xử lý nào đều thực hiện. Trong 8051 thì hoạt động vòng lặp được thực hiện bởi lệnh “DJNZ thanh ghi, nhãn”. Trong lệnh này thanh ghi được giảm xuống, nếu nó không bằng không thì nó nhảy đến địa chỉ đích được tham chiếu bởi nhãn. Trước khi bắt đầu vòng lặp thì thanh ghi được nạp với bộ đếm cho số lần lặp lại. Lưu ý rằng, trong lệnh này việc giảm thanh ghi và quyết định để nhảy được kết hợp vào trong một lệnh đơn.

Ví dụ

Viết một chương trình để: a) xoá ACC và sau đó b) cộng 3 vào ACC 10 lần.

Lời giải:

Page 119: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

120

MOV A, #0 ; Xoá ACC, A = 0

MOV R2, #10 ; Nạp bộ đếm R2 = 10

AGAIN: ADD A, #10 ; Cộng 03 vào ACC

DJNZ R2, AGAIN ; Lặp lại cho đến khi R2 = 0 (10 lần)

MOV R5, A ; Cắt A vào thanh ghi R5

Trong chương trình trên đây thanh ghi R2 được sử dụng như là bộ đếm. Bộ đếm lúc đầu được đặt bằng 10. Mỗi lần lặp lại lệnh DJNZ giảm R2 không bằng 0 thì nó nhảy đến địa chỉ đích gắn với nhãn “AGAIN”. Hoạt động lặp lại này tiếp tục cho đến khi R2 trở về không. Sau khi R2 = 0 nó thoát khỏi vòng lặp và thực hiện lệnh đứng ngay dưới nó trong trường hợp này là lệnh “MOV R5, A”.

Lưu ý rằng trong lệnh DJNZ thì các thanh ghi có thể là bất kỳ thanh ghi nào trong các thanh ghi R0 - R7.

b. Vòng lặp bên trong một vòng lặp

Vì thanh ghi R2 chứa số đếm và nó là thanh ghi 8 bit nên nó có thể chứa được giá trị cực đại là FFH hay 255. Do vậy số lần lặp lại cực đại mà vòng lặp ở ví dụ trên có thể thực hiện là 256.

Nếu ta muốn lặp một hành động nhiều hơn 256 lần, sử dụng một vòng lặp bên trong một vòng lặp được gọi là vòng lặp lồng (Nested Loop). Trong một vòng lặp lồng ta sử dụng 2 thanh ghi để giữ số đếm.

Ví dụ

Hãy viết một chương trình a) nạp thanh ghi ACC với giá trị 55H và b) bù ACC 700 lần.

Lời giải:

Vì 700 lớn hơn 256 (là số cực đại mà một thanh ghi vó thể chứa được) nên ta phải dùng hai thanh ghi để chứa số đếm. Đoạn mã dưới đây trình bày cách sử dụng hai thanh ghi R2 và R3 để chứa số đếm.

Page 120: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

121

MOV A, #55H ; Nạp A = 55H

MOV R3, #10 ; Nạp R3 = 10 số đếm vòng lặp ngoài

NEXT: MOV R2, #70 ; Nạp R2 = 70 số đếm vòng lặp trong

AGAIN: CPL A ; Bù thanh ghi A

DJNZ R2, AGAIN ; Lặp lại 70 lần (vòng lặp trong)

DJNZ R3, NEXT

c. Các lệnh nhảy có điều kiện

+ Lệnh JZ (nhảy nếu A = 0). Trong lệnh này nội dung của thanh ghi A được kiểm tra. Nếu nó bằng không thì nó nhảy đến địa chỉ đích.

Ví dụ

MOV A, R0 ; Nạp giá trị của R0 vào A

JZ OVER ; Nhảy đến OVER nếu A = 0

MOV A, R1 ; Nạp giá trị của R1 vào A

JZ OVER ; Nhảy đến OVER nếu A = 0

OVER ...

Trong chương trình này nếu R0 hoặc R1 có giá trị bằng 0 thì nó nhảy đến địa chỉ có nhãn OVER. Lưu ý rằng lệnh JZ chỉ có thể được sử dụng đối với thanh ghi A. Nó chỉ có thể kiểm tra xem thanh ghi A có bằng không không và nó không áp dụng cho bất kỳ thanh ghi nào khác.

+ Lệnh JNZ là lệnh nhảy nếu không = 0.

+ Lệnh JNC (nhảy nếu không có nhớ, cờ CY = 0)

Trong lệnh này thì bit cờ nhớ trong thanh ghi cờ PSW được dùng để thực hiện quyết định nhảy. Khi thực hiện lệnh “JNC nhãn” thì bộ xử lý kiểm tra cờ nhớ xem nó

Page 121: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

122

có được bật không (CY = 1). Nếu nó không bật thì CPU bắt đầu nạp và thực hiện các lệnh từ địa chỉ của nhãn. Nếu cờ CY = 1 thì nó sẽ không nhảy và thực hiện lệnh kế tiếp dưới JNC.

+ Lệnh “JC, nhãn”. Trong lệnh JC thì nếu CY = 1, nó nhảy đến địa chỉ đích là nhãn.

+ Ngoài ra còn có lệnh JB (nhảy nếu bit có mức cao) và JNB (nhảy nếu bit có mức thấp).

Bảng 3.6.Các lệnh nhảy có điều kiện

Lệnh Hoạt động

JZ Nhảy nếu A = 0

JNZ Nhảy nếu A <> 0

DJNZ Giảm và nhảy nếu A = 0

CJNE A, byte Nhảy nếu A <> byte

CJNE re, # data Nhảy nếu Byte <> data

JC Nhảy nếu CY = 1

JNC Nhảy nếu CY = 0

JB Nhảy nếu bit = 1

JNB Nhảy nếu bit = 0

JBC Nhảy nếu bit = 1 và xoá nó

Lưu ý: Tất cả các lệnh nhảy có điều kiện đều là các phép nhảy ngắn, có nghĩa là địa chỉ của đích đều phải nằm trong khoảng -127 đến +127 byte của nội dung bộ đếm chương trình PC.

d. Các lệnh nhảy không điều kiện

Page 122: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

123

Lệnh nhảy không điều kiện là một phép nhảy trong đó điều khiển được truyền không điều kiện đến địa chỉ đích. Trong 8051 có hai lệnh nhảy không điều kiện đó là: LJMP - nhảy xa và SJMP - nhảy gần.

+ Nhảy xa LJMP

Nhảy xa LJMP là một lệnh 3 byte trong đó byte đầu tiên là mã lệnh còn hai byte còn lại là địa chỉ 16 bit của đích. Địa chỉ đích 02 byte có phép một phép nhảy đến bất kỳ vị trí nhớ nào trong khoảng 0000 - FFFFH.

+ Lệnh nhảy SJMP

Trong 2 byte này thì byte đầu tiên là mã lệnh và byte thứ hai là địa chỉ tương đối của địa chỉ đích. Đích chỉ tương đối trong phạm vi 00 - FFH được chia thành các lệnh nhảy tới và nhảy lùi: Nghĩa là -128 đến +127 byte của bộ nhớ tương đối so với địa chỉ hiện thời của bộ đếm chương trình. Nếu là lệnh nhảy tới thì địa chỉ đích có thể nằm trong khoảng 127 byte từ giá trị hiện thời của bộ đếm chương trình. Nếu địa chỉ đích ở phía sau thì nó có thể nằm trong khoảng -128 byte từ giá trị hiện hành của PC.

e. Tính toán địa chỉ lệnh nhảy gần

Ngoài lệnh nhảy gần SJMP thì tất cả mọi lệnh nhảy có điều kiện như JNC, JZ và DJNZ đều là các lệnh nhảy gần bởi một thực tế là chúng đều là lệnh 2 byte. Trong những lệnh này thì byte thứ nhất đều là mã lệnh, còn byte thứ hai là địa chỉ tương đối. Địa chỉ đích là tương đối so với giá trị của bộ đếm chương trình. Để tính toán địa chỉ đích byte thứ hai được cộng vào thanh ghi PC của lệnh đứng ngay sau lệnh nhảy.

f. Tính toán địa chỉ đích nhảy lùi

Trong khi ở trường hợp nhảy tới thì giá trị thay thế là một số dương trong khoảng từ 0 đến 127 (00 đến 7F ở dạng Hex) thì đối với lệnh nhảy lùi giá trị thay thế là một số âm nằm trong khoảng từ 0 đến -128.

Cần phải nhấn mạnh rằng, bất luận SJMP nhảy tới hay nhảy lùi thì đối với một lệnh nhảy bất kỳ địa chỉ của địa chỉ đích không bao giờ có thể lớn hơn -128 đến +127 byte so với địa chỉ gắn liền với lệnh đứng ngay sau lệnh SJMP. Nếu có vi phạm luật này thì hợp ngữ sẽ tạo ra một lỗi báo rằng lệnh nhảy ngoài phạm vi.

3.3.3.2. Các lệnh gọi CALL

Page 123: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

124

Một lệnh chuyển điều khiển khác là lệnh CALL được dùng để gọi một chương trình con. Các chương trình con thường được sử dụng để thực thi các công việc cần phải được thực hiện thường xuyên. Điều này làm cho chương trình trở nên có cấu trúc hơn ngoài việc tiết kiệm được thêm không gian bộ nhớ. Trong 8051 có 2 lệnh để gọi đó là: gọi xa CALL và gọi tuyệt đối ACALL mà quyết định sử dụng lệnh nào đó phụ thuộc vào địa chỉ đích.

a. Lệnh gọi xa LCALL

Trong lệnh 3 byte này thì byte đầu tiên là mã lệnh, còn hai byte sau được dùng cho địa chỉ của chương trình con đích. Do vậy LCALL có thể được dùng để gọi các chương trình con ở bất kỳ vị trí nào trong phạm vi 64k byte không gian địa chỉ của 8051. Để đảm bảo rằng sau khi thực hiện một chương trình được gọi để 8051 biết được chỗ quay trở về thì nó tự động cất vào ngăn xếp địa chỉ của lệnh đứng ngay sau lệnh gọi LCALL. Khi một chương trình con được gọi, điều khiển được chuyển đến chương trình con đó và bộ xử lý cất bộ đếm chương trình PC vào ngăn xếp và bắt đầu nạp lệnh vào vị trí mới. Sau khi kết thúc thực hiện chương trình con thì lệnh trở về RET chuyển điều khiển về cho nguồn gọi. Mỗi chương trình con cần lệnh RET như là lệnh cuối cùng.

b. Sử dụng lệnh PUSH và POP trong các chương trình con

Khi gọi một chương trình con thì ngăn xếp phải bám được vị trí mà CPU cần trở về. Sau khi kết thúc chương trình con vì lý do này chúng ta phải cẩn thận mỗi khi thao tác với các nội dung của ngăn xếp. Nguyên tắc là số lần đẩy vào (PUSH) và kéo ra (POP) luôn phải phù hợp trong bất kỳ chương trình con được gọi vào. Hay nói cách khác đối với mỗi lệnh PUSH thì phải có một lệnh POP.

c. Gọi các chương trình con

Trong lập trình hợp ngữ thường có một chương trình chính và rất nhiều chương trình con mà chúng được gọi từ chương trình chính. Điều này cho phép ta tạo mới chương trình con trong một mô-đun riêng biệt. Mỗi mô-đun có thể được kiểm tra tách biệt và sau đó được kết hợp với nhau cùng với chương trình chính.

Trong việc sử dụng LCALL thì địa chỉ đích của các chương trình con có thể ở đâu đó trong phạm vi 64k byte không gian bộ nhớ của 8051. Điều này không áp dụng cho tất cả mọi lệnh gọi CALL chẳng hạn như đối với ACALL.

Page 124: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

125

d. Lệnh gọi tuyệt đối ACALL (Absolute call)

Lệnh ACALL là lệnh 2 byte khác với lệnh LCALL dài 3 byte. Do ACALL chỉ có 2 byte nên địa chỉ đích của chương trình con phải nằm trong khoảng 2k byte địa chỉ vì chỉ có 11bit của 2 byte được sử dụng cho địa chỉ. Không có sự khác biệt nào giữa ACALL và LCALL trong khái niệm cất bộ đếm chương trình vào ngăn xếp hay trong chức năng của lệnh trở về RET. Sự khác nhau duy nhất là địa chỉ đích của lệnh LCALL có thể nằm bất cứ đâu trong phạm vi 64k byte không gian địa chỉ của 8051, còn trong khi đó địa chỉ của lệnh ACALL phải nằm trong khoảng 2 byte. Trong nhiều biến thế của 8051 do các hãng cung cấp thì ROM trên chíp chỉ có 1k byte.. Trong những trường hợp như vậy thì việc sử dụng ACALL thay cho LCALL có thể tiết kiệm được một số byte bộ nhớ của không gian ROM chương trình.

3.3.3.3. Tạo và tính toán thời gian trễ

a. Chu kỳ máy

Đối với CPU để thực hiện một lệnh thì mất một chu kỳ đồng hồ này được coi như các chu kỳ máy. Trong họ 8051 thì độ dài của chu kỳ máy phụ thuộc vào tần số của bộ dao động thạch anh được nối vào hệ thống 8051. Bộ dao động thạch anh cùng với mạch điện trên chip cung cấp xung đồng hồ cho CPU của 8051. Tần số của tinh thể thạch anh được nối tới họ 8051 dao động trong khoảng 4MHz đến 30 MHz phụ thuộc vào tốc độ chíp và nhà sản xuất. Thường xuyên nhất là bộ dao động thạch anh tần số 11.0592MHz được sử dụng để làm cho hệ 8051 tương thích với cổng nối tiếp của PC IBM. Trong 8051, một chu kỳ máy kéo dài 12 chu kỳ dao động. Do vậy, để tính toán chu kỳ máy ta lấy 1/12 của tần số tinh thể thạch anh,, sau đó lấy giá trị nghịch đảo. Như vậy ta có thể tính được chu kỳ máy cho hệ thống 8051 có tần số đồng hồ là 11.0592MHz là 1.085s. Vậy ta có:

Bảng 3.7. Chu kỳ máy của một số lệnh

Lệnh Chu kỳ máy Thời gian thực hiện

(a) MOV R3, #55 1 1 1.085 s = 1.085 s

(b) DEC R3 1 1 1.085 s = 1.085 s

Page 125: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

126

(c) DJNZ R2, target 2 2 1.085 s = 2.17 s

(d) LJMP 2 2 1.085 s = 2.17 s

(e) SJMP 2 2 1.085 s = 2.17 s

(f) NOP 1 1 1.085 s = 1.085 s

(g) MUL AB 4 4 1.085 s = 4.34 s

b. Tính toán độ trễ

Một chương trình con giữ delay gồm có hai phần: (1) thiết lập bộ đếm và (2) một vòng lặp. Hầu hết thời gian delay được thực hiện bởi thân vòng lặp.

Thông thường ta tính thời gian delay dựa trên các lệnh bên trong vòng lặp và bỏ qua các chu kỳ đồng hồ liên quan với các lệnh ở ngoài vòng lặp.

Một cách tăng độ trễ là sử dụng lệnh NOP (không làm gì 1 chu kỳ máy) trong vòng lặp để tiêu tốn thời gian một cách đơn giản.

Một cách khác để nhận được giá trị từ độ trễ lớn là sử dụng một vòng lặp bên trong vòng lặp và cũng được gọi là vòng lặp lồng nhau.

3.3.4. Các lệnh số học và các chương trình

3.3.4.1. Phép cộng và trừ không dấu

Các số không dấu được định nghĩa như những dữ liệu mà tất cả mọi bit của chúng đều được dùng để biểu diễn dữ liệu và không có bit dành cho dấu âm hoặc dương. Điều này có nghĩa là toán hạng có thể nằm giữa 00 và FFH (0 đến 255 hệ thập phân) đối với dữ liệu 8 bit.

a. Phép cộng các số không dấu

Trong 8051 để cộng các số với nhau thì thanh ghi tổng (A) phải được dùng đến. Dạng lệnh ADD là:

ADD A, nguồn; A = A + nguồn

Page 126: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

127

Lệnh ADD được dùng để cộng hai toán hạng. Toán hạng đích luôn là thanh ghi A trong khi đó toán hạng nguồn có thể là một thanh ghi dữ liệu trực tiếp hoặc là ở trong bộ nhớ.

Ví dụ

Hãy biểu diễn xem cá lệnh dưới đây tác động đến thanh ghi cờ như thế nào?

MOV A, # 0F5H ; A = F5H

MOV A, # 0BH ; A = F5 + 0B = 00

Lời giải

F5H 1111 0101

+ 0BH + 0000 1011

100H 0000 0000

Sau phép cộng, thanh ghi A (đích) chứa 00 và các cờ sẽ như sau:

CY = 1 vì có phép nhớ từ D7

PF = 1 vì số các số 1 là 0 (một số chẵn) cờ PF được đặt lên 1.

AC = 1 vì có phép nhớ từ D3 sang D4

b. Phép cộng có nhớ và phép cộng các số 16 bit

Khi cộng hai toán hạng dữ liệu 16 bit thì ta cần phải quan tâm đến phép truyền của cờ nhớ từ byte thấp đến byte cao. Lệnh ADDC (cộng có nhớ) được sử dụng trong những trường hợp như vậy. Ví dụ, xét phép cộng hai số sau: 3CE7H + 3B8DH, khi byte thứ nhất được cộng (E7 + 8D = 74, CY = 1). Cờ nhớ được truyền lên byte cao tạo ra kết quả 3C + 3B + 1 = 78.

c. Hệ thống số BCD

Có một vấn đề khi cộng các số BCD mà cần phải được khắc phục. Vấn đề đó là sau khi cộng các số BCD đóng gói thì kết quả không còn là số BCD.

Page 127: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

128

Lệnh DA (Decimal Adjust for Addition điều chỉnh thập phân đối với phép cộng) trong 8051 để dùng hiệu chỉnh sự sai lệch đã nói trên đây liên quan đến phép cộng các số BCD. Lệnh giả “DA”. Lệnh DA sẽ cộng 6 vào 4 bit thấp hoặc 4 bit cao nếu cần. Còn bình thường nó để nguyên kết quả tìm được.

Lệnh “DA” chỉ làm việc với thanh ghi A. Hay nói cách khác trong thanh ghi nguồn có thể là một toán hạng của chế độ đánh địa chỉ bất kỳ thì đích phải là thanh ghi A để DA có thể làm việc được. Cũng cần phải nhấn mạnh rằng lệnh DA phải được sử dụng sau phép cộng các toán hạng BCD và các toán hạng BCD không bao giờ có thể có số lớn hơn 9. Nói cách khác là không cho phép có các số A - F. Điều quan trọng cũng phải lưu ý là DA chỉ làm việc sau phép cộng ADD, nó sẽ không bao giờ làm việc theo lệnh tăng INC.

Tóm tắt về hoạt động của lệnh DA :

Hoạt động sau lệnh ADD hoặc ADDC.

1. Nếu 4 bi t thấp lớn hơn 9 hoặc nếu AC = 1 thì nó cộng 0110 vào 4 bít thấp. 2. Nếu 4 bit cao lớn hơn 9 hoặc cờ CY = 1 thì nó cộng 0110 vào 4 bit cao.

d. Phép trừ các số không dấu

Cú pháp: SUBB A, nguồn; A = A - nguồn - CY.

Trong rất nhiều các bộ xử lý có hai lệnh khác nhau cho phép trừ đó là SUB và SUBB (trừ có mượn - Subtract with Borrow). Trong 8051 ta chỉ có một lệnh SUBB duy nhất. Để thực hiện SUB từ SUBB, do vậy có hai trường hợp cho lệnh SUBB là: với CY = 0 và với CY = 1. ở đây ta dùng cờ CY để mượn.

+ Lệnh SUBB với CY = 0

Trong phép trừ thì các bộ vi xử lý 8051 (thực tế là tất cả mọi CPU hiện đại) đều sử dụng phương pháp bù 2. Mặc dù mỗi CPU đều có mạch cộng, nó có thể quá cồng kềnh (và cần nhiều bóng bán dẫn) để thiết kế mạch trừ riêng biệt. Vì lý do đó mà 8051 sử dụng mạch cộng để thực hiện lệnh trừ. Giả sử 8051 sử dụng mạch cộng để thực hiện lệnh trừ và CY = 0 trước khi thực hiện lệnh thì ta có thể tóm tắt các bước mà phần cứng CPU thực hiện lệnh SUBB đối với các số không dấu như sau:

1. Thực hiện lấy bù 2 của số trừ (toán hạng nguồn) 2. Cộng nó vào số bị trừ (A) 3. Đảo nhớ

Page 128: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

129

Đây là 3 bước thực hiện bởi phần cứng bên trong của CPU 8051 đối với mỗi lệnh trừ SUBB bất kể đến nguồn của các toán hạng được cấp có được hỗ trợ chế độ đánh địa chỉ hay không? Sau ba bước này thì kết quả có được và các cờ được bật.

Nếu sau khi thực hiện SUBB mà CY = 0 thì kết quả là dương. Nếu CY = 1 thì kết quả âm và đích có giá trị bù 2 của kết quả.

+ Lệnh SUBB khi CY = 1

Lệnh này được dùng đối với các số nhiều byte và sẽ theo dõi việc mượn của toán hạng thấp. Nếu CY = 1 trước khi xem thực hiện SUBB thì nó cũng trừ 1 từ kết quả.

3.3.4.2. Nhân và chia các số không dấu

Khi nhân và chia hai số trong 8051 cần phải sử dụng hai thanh ghi A và B vì các lệnh nhân và chia chỉ hoạt động với những thanh ghi này.

a. Nhân hai số không dấu

Bộ vi điều khiển chỉ hỗ trợ phép nhân byte với byte. Các byte được giả thiết là dữ liệu không dấu. Cấu trúc lệnh như sau:

MUL AB ; Là phép nhân A B và kết quả 16 bit được đặt trong A và B.

Khi nhân byte với byte thì một trong các toán hạng phải trong thanh ghi A và toán hạng thứ hai phải ở trong thanh ghi B. Sau khi nhân kết quả ở trong các thanh ghi A và B. Phần thấp ở trong A, còn phần cao ở trong B.

b. Chia hai số không dấu

8051 cùng chỉ hỗ trợ phép chia hai số không dấu byte cho byte với cú pháp DIV AB ; Chia A cho B

Khi chia một byte cho một byte thì tử số (số bị chia) phải ở trong thanh ghi A và mẫu số (số chia) phải ở trong thanh ghi B. Sau khi lệnh chia DIV được thực hiện thì thương số được đặt trong A, còn số dư được đặt trong B.

Lưu ý các điểm sau khi thực hiện “DIV AB”, lệnh này luôn bắt CY = 0 và OV = 0 nếu tử số không phải là số 0. Nếu tử số là số 0 (B = 0) thì OV =1 báo lỗi và CY = 0. Thực tế chuẩn trong tất cả mọi bộ vi xử lý khi chia một số cho 0 là bằng cách nào đó báo có kết quả không xác định. Trong 8051 thì cờ OV được thiết lập lên 1.

Page 129: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

130

3.3.5. Các lệnh lô - gíc và các chương trình

3.3.5.1. Các lệnh lô-gíc và so sánh

a. Lệnh Và (AND)

Cú pháp: ANL đích, nguồn; đích = đích Và nguồn

Lệnh này sẽ thực hiện một phép Và lô-gíc trên hai toán hạng đích và nguồn và đặt kết quả vào đích. Đích thường là thanh ghi tổng (tích luỹ). Toán hạng nguồn có thể là thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Lệnh ANL đối với toán hạng theo byte không có tác động lên các cờ. Nó thường được dùng để che (đặt về 0) những bit nhất định của một toán hạng.

b. Lệnh Hoặc (OR)

Cú pháp ORL đích = đích Hoặc nguồn

Các toán hạng đích và nguồn được Hoặc với nhau và kết quả được đặt vào đích. Phép Hoặc có thể được dùng để thiết lập những bit nhất định của một toán hạng 1. Đích thường là thanh ghi tổng, toán hạng nguồn có thể là một thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Lệnh ORL đối với các toán hạng đánh địa chỉ theo byte sẽ không có tác động đến bất kỳ cờ nào.

c. Lệnh XOR (OR loại trừ)

Cú pháp: XRL đích, nguồn; đích = đích Hoặc loại trừ nguồn.

Lệnh này sẽ thực hiện phép XOR trên hai toán hạng và đặt kết quả vào đích. Đích thường là thanh ghi tổng. Toán hạng nguồn có thể là một thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Lệnh XRL đối với các toán hạng đánh địa chỉ theo byte sẽ không có tác động đến bất kỳ cờ nào.

Lệnh XRL có thể được dùng để xoá nội dung của một thanh ghi bằng cách XOR nó với chính nó.

Lệnh XRL cũng có thể được dùng để xem nếu hai thanh ghi có giá trị giống nhau không? Lệnh “XRL A, R1” sẽ hoặc loại trừ với thanh ghi R1 và đặt kết quả vào A. Nếu cả hai thanh ghi có cùng giá trị thì trong A sẽ là 00.

Page 130: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

131

Một ứng dụng khác của bộ xử lý là chọn các bit của một toán hạng. Ví dụ để chọn 2 bit của thanh ghi A ta có thể sử dụng mã sau. Mã này ép bit D2 của thanh ghi A chuyển sang giá trị nghịch đảo, còn các bit khác không thay đổi.

XRL A, #04H ; Nghĩa hoặc loại trừ thanh ghi A với

; Giá trị 0000 0100

c. Lệnh bù thanh ghi tổng CPL A

Lệnh này bù nội dung của thanh ghi tổng A. Phép bù là phép biến đổi các số 0 thành các số 1 và đổi các số 1 sang số 0. Đây cũng còn được gọi là phép bù 1.

Để nhận được kết quả bù 2 thì tất cả mọi việc ta cần phải làm là cộng 1 vào kết quả bù 1. Trong 8051 thì không có lệnh bù 2 nào cả. Lưu ý rằng trong khi bù một byte thì dữ liệu phải ở trong thanh ghi A. Lệnh CPL không hỗ trợ một chế độ đánh địa chỉ nào cả.

d. Lệnh so sánh

8051 có một lệnh cho phép so sánh. Nó có cú pháp như sau:

CJNE đích, nguồn, địa chỉ tương đối.

Trong 8051 thì phép so sánh và nhảy được kết hợp thành một lệnh có tên là CJNE (so sánh và nhảy nếu kết quả không bằng nhau). Lệnh CJNE so sánh hai toán hạng nguồn và đích và nhảy đến địa chỉ tương đối nếu hai toán hạng không bằng nhau. Ngoài ra nó thay đổi cờ nhớ CY để báo nếu toán hạng đích lớn hơn hay nhỏ hơn. Điều quan trọng cần là các toán hạng vẫn không thay đổi. Ví dụ, sau khi thực hiện lệnh “CJNE A, #67H, NEXT” thì thanh ghi A vẫn có giá trị ban đầu của nó (giá trị trước lệnh CJNE). Lệnh này so sánh nội dung thanh ghi A với giá trị 67H và nhảy đến giá trị đích NEXT chỉ khi thanh ghi A có giá trị khác 67H.

Để ý rằng trong lệnh CJNE thì không có thanh ghi Rn nào có thể được so sánh với giá trị cho sẵn. Do vậy không cần phải nói đến thanh ghi A.

Lệnh so sánh thực sự là một phép trừ, ngoại trừ một điều là giá trị của các toán hạng không thay đổi. Các cờ được thay đổi tuỳ theo việc thực hiện lệnh trừ SUBB. Cần phải được nhấn mạnh lại rằng, trong lệnh CJNE các toán hạng không bị tác động

Page 131: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

132

bất kể kết quả so sánh là như thế nào. Chỉ có cờ CY là bị tác động, Điều này bị chi phối bởi thực tế là lệnh CJNE sử dụng phép trừ để bật và xoá cờ CY.

3.3.5.2. Các lệnh quay vào trao đổi

a. Quay các bit của thanh ghi A sang trái hoặc phải

+ Quay phải: RR A; Quay các bit thanh ghi A sang phải.

Trong phép quay phải, 8 bit của thanh ghi tổng được quay sang phải một bit và bit D0 rời từ vị trí bit thấp nhất và chuyển sang bit cao nhất D7.

MOV A, #36H ; A = 0011 0110

RR A ; A = 0001 1011

RR A ; A = 1000 1101

RR A ; A = 1100 0110

RR A ; A = 0110 0011

+ Quay trái

Cú pháp: RL A ; Quay trái các bit của thanh ghi A

Trong phép quay trái thì 8 bit của thanh ghi A được quay sang trái 1 bit và bit D7 rời khỏi vị trí bit cao nhất chuyển sang vị trí bit thấp nhất D0.

MOV A, #72H ; A = 0111 0010

RL A ; A = 1110 0100

RL A ; A = 1100 1001

Trong các lệnh RR và RL thì không có cờ nào bị tác động.

b. Quay có nhớ

MSB LSB

MSB LSB

Page 132: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

133

+ Quay phải có nhớ: RRC A

Trong quay phải có nhớ thì các bit của thanh ghi A được quay từ trái sang phải 1 bit và bit thấp nhất được đưa vào cờ nhớ CY và sau đó cờ CY được đưa vào vị trí bit cao nhất. Hay nói cách khác, trong phép RRC A thì LSB được chuyển vào CY và CY được chuyển vào MSB. Trong thực tế thì cờ nhớ CY tác động như là một bit bộ phận của thanh ghi A làm nó trở thành thanh ghi 9 bit.

CLR C ; make CY = 0

MOVA #26H ; A = 0010 0110

RRC A ; A = 0001 0011 CY = 0

RRC A ; A = 0000 1001 CY = 1

RCC A ; A = 1000 0100 CY = 1

+ Quay trái có nhớ : RLC A

Trong RLC A thì các bit được dịch phải một bit và đẩy bit MSB vào cờ nhớ CY, sau đó CY được chuyển vào bit LSB. Hay nói cách khác, trong RLC thì bit MSB được chuyển vào CY và CY được chuyển vào LSB.

SETB C ; Make CY = 1

MOV A #15H ; A = 0001 0101

RRC A ; A = 0101 1011 CY = 0

RRC A ; A = 0101 0110 CY = 0

RCC A ; A = 1010 1100 CY = 0

LSB CY MSB

MSB LSB CY

Page 133: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

134

RCC A ; A = 1000 1000 CY = 1

c. Lệnh trao đổi thanh ghi A: SWAP A

Một lệnh khác nữa là lệnh trao đổi SWAP. Nó chỉ hoạt động trên thanh ghi A, nó trao đổi nửa phần cao của byte và nửa phần thấp của byte với nhau. Hay nói cách khác 4 bit cao được chuyển thành 4 bit thấp và 4 bit thấp thành 4 bit cao.

3.3.6. Các lệnh một bít và lập trình

3.3.6.1.Lập trình với các lệnh một bít

Trong hầu hết các bộ vi xử lý thì dữ liệu được truy cập theo từng byte. Trong các bộ vi xử lý định địa chỉ theo byte này thì các nội dung của một thanh ghi, bộ nhớ RAM hay cổng đều phải được truy cập từng byte một. Hay nói cách khác, lượng dữ liệu tối thiểu có thể được truy cập là một byte. Ví dụ, trong bộ vi xử lý Pentium cổng vào/ ra (I/O) được định hướng theo byte, có nghĩa là để thay đổi một bít thì ta phải truy cập toàn bộ 8 bít. Trong khi đó có rất nhiều ứng dụng thì ta phải chỉ cần thay đổi giá trị của một bít chẳng hạn như là bật hoặc tắt một thiết bị. Do vậy khả năng đánh địa chỉ đến từng bít của 8051 rất thích hợp cho ứng dụng này. . Vì ROM chỉ đơn giản giữ mã chương trình thực thi nên nó không cần khả năng đánh địa chỉ theo bít. Tất cả mọi mã lệnh đều định hướng theo byte chỉ có các thanh ghi, RAM và các cổng I/O là cần được đánh địa chỉ theo bít. Trong 8051 thì rất nhiều vị trí của RAM trong một số thanh ghi và tất cả các cổng I/O là có thể đánh địa chỉ theo từng bít.

a. Các lệnh một bít

Các lệnh dùng các phép tính một bít được cho ở bảng 3.8

Bảng 3.8: Các lệnh một bít của 8051

D7 - D4 D3 - D0 D3 - D0 D7 - D0 after: before:

0111 0010 0010 0111 after: before:

Page 134: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

135

Lệnh Chức năng

SETB bít Thiết lập bít (bít bằng 1)

CLR bít Xoá bít về không (bít = 0)

CPL bít Bù bít (bít = NOT bít)

JB bít, đích Nhảy về đích nếu bít = 1

JNB bít, đích Nhảy về đích nếu bít = 0

JBC bít, đích Nhảy về đích nếu bít = 1 và sau đó xoá bít

b. Các cổng I/O và khả năng đánh địa chỉ theo bít

Bộ vi điều khiển 8051 có bốn cổng I/O 8 bít là P0, P1, P2 và P3. Chúng ta có thể truy cập toàn bộ 8 bít hoặc theo một bít bất kỳ mà không làm thay đổi các bít khác còn lại. Khi truy cập một cổng theo từng bít, chúng ta sử dụng các cú pháp “SETB X, Y” với X là số của cổng 0, 1, 2 hoặc 3, còn Y là vị trí bít từ 0 đến 7 đối với các bít dữ liệu đo đến 7. Ví dụ “SETB P1.5” là thiết lập bít cao số 5 của cổng 1. Hãy nhớ rằng D0 là bít có nghĩa thấp nhất LSB và D7 là bít có nghĩa là cao nhất MSB.

c. Kiểm tra một bít đầu vào

Lệnh JNB (nhảy nếu bít = 0) và JB (nhảy nếu bít bằng 1) cũng là các phép thao tác đơn bít được sử dụng rộng rãi. Chúng cho phép ta hiển thị một bít và thực hiện quyết định phụ thuộc vào việc liệu nó là 0 hay là 1.

Các lệnh JNB và JB có thể được dùng đối với các bít bất kỳ của các cổng I/O 0,1,2 và 3 vì tất cả các cổng này đều có khả năng đánh địa chỉ theo bít. Tuy nhiên, cổng 3 hầu như để dùng cho các tín hiệu ngắt và truyền thông nối tiếp và thông thường không dùng cho bất cứ vào/ ra theo bít hoặc theo byte nào.

d. Các thanh ghi và khả năng đánh địa chỉ theo bít

Trong tất cả các cổng I/O đều có khả năng đánh địa chỉ theo bít thì các thanh ghi lại không được như vậy. Chỉ thanh ghi B, PSW, IP, IE, ACC, SCON và TCON là có thể đánh địa chỉ theo bít.

e. Vùng nhớ RAM có thể đánh địa chỉ theo bít

Page 135: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

136

Trong 128 byte RAM trong của 8051 thì chỉ có 16 byte của nó là có thể đánh địa chỉ theo bít được. Phần còn lại được định dạng byte. Các vùng RAM có thể đánh địa chỉ theo bít là 20H đến 2FH. Với 16 byte này của RAM có thể cung cấp khả năng đánh địa chỉ theo bít là 128 bít, vì 16 8 = 128. Chúng được đánh địa chỉ từ 0 đến 127. Do vậy, những địa chỉ bít từ 0 đến 7 dành cho byte đầu tiên, vị trí RAM trong 20H và các bít từ 8 đến OFH là địa chỉ bít của byte thứ hai của vị trí RAM trong 21H v.v... Byte cuối cùng của 2FH có địa chỉ bít từ 78H đến 7FH. Lưu ý rằng các vị trí RAM trong 20H đến 2FH vừa có thể đánh địa chỉ theo byte vừa có thể đánh địa chỉ theo bít.

Page 136: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

137

Hình 3.11: Địa chỉa theo Byte và bít của bộ nhớ RAM các thanh ghi chức năng đặc biệt.

Byte

address

Bit address

FF

F0 E7 F6 F5 F4 F3 F2 F1 F0 B

E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC

D0 D7 D6 D5 D4 D3 D2 D1 D0 PSW

B8 - - - - - - BC BB BA B9 B8 IP

B0 B7 B6 B5 B4 B3 B2 B1 B0 F3

A8 AF - - - - AC AB AA A9 A8

IE

A0 A7 A6 A5 A4 A3 A2 A1 A0

P2

99 not bit addressable SBUF

98 9F 9E 9D 9C 9B 9A 99 99 SCON

90 97 96 95 94 93 92 91 90 P1

Page 137: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

138

3.3.6.2. Các phép toán một bít với cờ nhớ CY

Ngoài một thực tế là cờ nhớ CY được thay đổi bởi các lệnh lô-gíc và số học thì trong 8051 còn có một số lệnh mà có thể thao tác trực tiếp cờ nhớ CY. Các lệnh này được cho trong bảng 3.9.

Bảng 3.9: Các lệnh liên quan đến cờ nhớ CY

Lệnh Chức năng

SETB C Thực hiện (tạo) CY = 1

CLR C Xoá bít nhớ CY = 0

CPL C Bù bít nhớ

MOV b, C Sao chép trạng thái bít nhớ vào vị trí bít b = CY

MOV C, b Sao chép bít b vào trạng thái bít nhớ CY = b

JNC đích Nhảy tới đích nếu CY = 0

JC đích Nhảy tới đích nếu CY = 1

ANL C. bít Thực hiện phép AND với bít b và lưu vào CY

ANL C./ bít Thực hiện phép AND với bít đảo và lưu vào CY

ORL C. bít Thực hiện phép OR với bít và lưu vào CY

ORL C./ bít Thực hiện phép OR với bít đảo và lưu vào CY

3.3.6.3. Đọc các chân đầu vào thông qua chốt cổng

Trong việc đọc cổng thì một số lệnh đọc trạng thái của các chân cổng, còn một số lệnh khác thì đọc một số trạng thái của chốt cổng trong. Do vậy, khi đọc các cổng thì có hai khả năng:

1. Đọc trạng thái của chân vào.

Page 138: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

139

2. Đọc chốt trong của cổng ra. Chúng ta phải phân biệt giữa hai dạng lệnh này vì sự lẫn lộn giữa chúng là nguyên nhân chính của các lỗi trong lập trình cho 8051, đặc biệt khi đã kết nối với phần cứng bên ngoài.

a. Các lệnh đọc cổng vào

Để biến một bít bất kỳ của cổng 8051 nào đó thành một cổng đầu vào, chúng ta phải ghi (lô-gíc cao) vào bít đó. Sau khi cấu hình các bít của cổng là đầu vào, ta có thể sử dụng những lệnh nhất định để nhận dữ liệu ngoài trên các chân vào trong CPU.

Bảng 3.10: Các lệnh đọc một cổng vào

Giả lệnh Ví dụ Mô tả

MOV A, PX MOV A, P2 Chuyển dữ liệu ở chân P2 vào ACC

JNB PX.Y, ...

JNB P2.1, đích Nhảy tới đích nếu, chân P2.1 = 0

JB PX.Y, JB P1.3, đích Nhảy đích nếu, chân P1.3 = 1

MOV C, PX.Y

MOV C, P2.4 Sao trạng thái chân P2.4 vào CY

b. Đọc chốt cho cổng đầu ra

Một số lệnh nội dung của một chốt cổng trong thay cho việc đọc trạng thái của một chân ngoài. Bảng 8.5 cung cấp danh sách những lệnh này. Ví dụ, xét lệnh “ANL P1, A”. Trình tự thao tác được thực hiện bởi lệnh này như sau:

1. Nó đã chốt trong của một cổng và chuyển dữ liệu đó vào trong CPU. 2. Dữ liệu này được AND với nội dung của thanh ghi A. 3. Kết quả được ghi ngược lại ra chốt cổng. 4. Dữ liệu tại chân cổng được thay đổi và có cùng giá trị như chốt cổng.

Từ những bàn luận trên ta kết luận rằng, các lệnh đọc chốt cổng thường đọc một giá trị, thực hiện một phép tính (và có thể thay đổi nó) sau đó ghi ngược lại ra chốt

Page 139: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

140

cổng. Điều này thường được gọi“Đọc-sửa-ghi”, (“Read-Modify-Write”). Bảng 3.11 liệt kê các lệnh đọc-sửa-ghi sử dụng cổng như là toán hạng đích hay nói cách khác, chúng ta chỉ được dùng cho các cổng được cấu hình như các cổng ra.

Bảng 3.11. Các lệnh đọc một chốt (Đọc-sửa-ghi)

Giả lệnh Ví dụ

ANL PX ANL P1, A

ORL PX ORL P2, A

XRL PX XRL P0, A

JBC PX.Y, đích JBC P1.1, đích

CPL PX CPL P1.2

INC PX INC P1

DEC PX DEC P2

DJN2 PX.Y, đích DJN2 P1, đích

MOV PX.Y, C MOV P1.2, C

CLR PX.Y CLR P2.3

SETB PX.Y SETB P2.3

3.4. Lập trình cho bộ đếm/ bộ định thời trong 8051

3.4.1 Lập trình các bộ định thời gian của 8051

3.4.1.1 Các thanh ghi cơ sở của bộ định thời

Cả hai bộ định thời Timer 0 và Timer 1 đều có độ dài 16 bít được truy cập như hai thanh ghi tách biệt byte thấp và byte cao.

a. Các thanh ghi của bộ Timer 0

Thanh ghi 16 bít của bộ Timer 0 được truy cập như byte thấp và byte cao. Thanh ghi byte thấp được gọi là TL0 (Timer 0 low byte) và thanh ghi byte cao là TH0

Page 140: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

141

(Timer 0 High byte). Các thanh ghi này có thể được truy cập như mọi thanh ghi khác chẳng hạn như A, B, R0, R1, R2 v.v... Ví dụ, lệnh “MOV TL0, #4FH” là chuyển giá trị 4FH vào TL0, byte thấp của bộ định thời 0. Các thanh ghi này cũng có thể được đọc như các thanh ghi khác. Ví dụ “MOV R5, TH0” là lưu byte cao TH0 của Timer 0 vào R5.

Hình 3.12: Các thanh ghi của bộ Timer 0.

b. Các thanh ghi của bộ Timer 1

Bộ định thời gian Timer 1 cũng dài 16 bít và thanh ghi 16 bít của nó được

chia ra thành hai byte là TL1 và TH1. Các thanh ghi này được truy cập và đọc giống như các thanh ghi của bộ Timer 0 ở trên.

Hình 3.13: Các thanh ghi của bộ Timer 1

c. Thanh ghi TMOD (chế độ của bộ định thời)

Cả hai bộ định thời Timer 0 và Timer 1 đều dùng chung một thanh ghi được gọi là TMOD để thiết lập các chế độ làm việc khác nhau của bộ định thời. Thanh ghi TMOD là thanh ghi 8 bít gồm có 4 bít thấp được thiết lập dành cho bộ Timer 0 và 4 bít cao dành cho Timer 1. Trong đó hai bít thấp của chúng dùng để thiết lập chế độ của bộ định thời, còn 2 bít cao dùng để xác định phép toán.

D15 D14 D13 D12 D11 D10 D9 D8

TH0

D7 D6 D5 D4 D3 D2 D1 D0

TL0

D15 D14 D13 D12 D11 D10 D9 D8

TH1

D7 D6 D5 D4 D3 D2 D1 D0

TL1

Page 141: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

142

Hình 3.13. Thanh ghi TMOD

+ Các bít M1, M0

Là các bít chế độ của các bộ Timer 0 và Timer 1. Chúng chọn chế độ của các bộ định thời: 0, 1, 2 và 3. Các chế độ được thiết lập theo trạng thái của M1 và M0 như sau:

Bảng 3.12. Các bit M0M1 của thanh ghi TMOD

M1 M0 Chế độ Chế độ hoạt động

0 0 0 Bộ định thời 13 bít gồm 8 bít là bộ định thời/ bộ đếm 5 bít đặt trước

0 1 1 Bộ định thời 16 bít (không có đặt trước)

1 0 2 Bộ định thời 8 bít tự nạp lại

1 1 3 Chế độ bộ định thời chia tách

+ C/ T (đồng hồ/ bộ định thời)

Bít này trong thanh ghi TMOD được dùng để quyết định xem bộ định thời được dùng như một máy tạo độ trễ hay bộ đếm sự kiện. Nếu bít C/T = 0 thì nó được dùng như một bộ định thời tạo độ trễ thời gian. Nguồn đồng hồ cho chế độ trễ thời gian là tần số thạch anh của 8051.

+ Nguồn xung đồng hồ cho bộ định thời

Như chúng ta biết, mỗi bộ định thời cần một xung đồng hồ để giữ nhịp. Vậy nguồn xung đồng hồ cho các bộ định thời trên 8051 lấy ở đâu? Nếu C/T = 0 thì tần số thạch anh đi liền với 8051 được làm nguồn cho đồng hồ của bộ định thời. Điều đó có nghĩa là độ lớn của tần số thạch anh đi kèm với 8051 quyết định tốc độ nhịp của các bộ

(MSB)

GATE C/T M1 M0

Timer1

GATE C/T M1 M0

Timer0

(LSB)

Page 142: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

143

định thời trên 8051. Tần số của bộ định thời luôn bằng 1/12 tần số của thạch anh gắn với 8051.

Mặc dù các hệ thống dựa trên 8051 khác với tần số thạch anh từ 10 đến 40MHz, song ta chỉ tập chung vào tần số thạch anh 11,0592MHz. Lý do đằng sau một số lẻ như vậy là ta phải làm việc với tần suất baud đối với truyền thông nối tiếp của 8051. Tần số XTAL = 11,0592MHz cho phép hệ 8051 truyền thông với IBM PC mà không có lỗi.

+ Bít cổng GATE

Mỗi bộ định thời thực hiện điểm khởi động và dừng. Một số bộ định thời thực hiện điều này bằng phần mềm, một số khác bằng phần cứng và một số khác vừa bằng phần cứng vừa bằng phần mềm. Các bộ định thời trên 8051 có cả hai. Việc khởi động và dừng bộ định thời được khởi động bằng phần mềm bởi các bít khởi động bộ định thời TR là TR0 và TR1. Điều này có được nhờ các lệnh “SETB TR1” và “CLR TR1” đối với bộ Timer1 và “SETB TR0” và “CLR TR0” đối với bộ Timer0. Lệnh SETB khởi động bộ định thời và lệnh CLR dùng để dừng nó. Các lệnh này khởi động và dừng các bộ định thời khi bít GATE = 0 trong thanh ghi TMOD. Khởi động và ngừng bộ định thời bằng phần cứng từ nguồn ngoài bằng cách đặt bít GATE = 1 trong thanh ghi TMOD. Tuy nhiên, để tránh sự lẫn lộn ngay từ bây giờ ta đặt GATE = 0 có nghĩa là không cần khởi động và dừng các bộ định thời bằng phần cứng từ bên ngoài. Để sử dụng phần mềm để khởi động và dừng các bộ định thời phần mềm để khởi động và dừng các bộ định thời khi GATE = 0. Chúng ta chỉ cần các lệnh “SETB TRx” và “CLR TRx”.

3. 4.1.2. Lập trình cho chế độ Mode1

a. Đặc tính và những phép toán của chế độ Mode1

1. Nó là bộ định thời 16 bít, do vậy nó cho phép các giá trị 0000 đến FFFFH được nạp vào các thanh ghi TL và TH của bộ định thời.

2. Sau khi TL và TH được nạp một giá trị khởi tạo 16 bít thì bộ định thời phải được khởi động. Điều này được thực hiện bởi “SETB TR0” đối với Timer 0 và “SETB TR1” đối với Timer1.

3. Sau khi bộ định thời được khởi động, nó bắt đầu đếm lên. Nó đếm lên cho đến khi đạt được giới hạn FFFFH của nó. Khi nó quay qua từ FFFFH về 0000 thì nó bật lên bít cờ TF được gọi là cờ bộ định thời. Cờ bộ định thời này có thể được hiển thị. Khi cờ bộ định thời này được thiết lập từ một trong các phương án để dừng bộ

Page 143: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

144

định thời bằng các lệnh “CLR TR0” đối với Timer0 hoặc “CLR TR1” đối với Timer1. Đối với bộ định thời đều có cờ TF riêng của mình: TF0 đối với Timer0 và TF1 đối víi Timer1.

4. Sau khi bộ định thời đạt được giới hạn của nó và quay đến giá trị FFFFH, muốn lặp lại quá trình thì các thanh ghi TH và TL phải được nạp lại với giá trị ban đầu và TF phải được duy trì về 0.

b. Các bước lập trình ở chế độ Mode 1

Để tạo ra một độ trễ thời gian dùng chế độ 1 của bộ định thời thì cần phải thực hiện các bước dưới đây.

1) Nạp giá trị TMOD cho thanh ghi báo độ định thời nào (Timer0 hay Timer1) được sử dụng và chế độ nào được chọn.

2) Nạp các thanh ghi TL và TH với các giá trị đếm ban đầu.

3) Khởi động bộ định thời.

4) Duy trì hiển thị cờ bộ định thời TF bằng lệnh “JNB TFx, đích” để xem nó được bật không. Thoát vòng lặp khi TF được lên cao.

5) Dừng bộ định thời.

XTAL

oscillator

12 TH TL TF

TF goes high

when FFFF 0

overflow

flag TR

0T/C

Hình 6.14. Bộ định thời làm việc ở chế độ Mode1

Page 144: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

145

6) Xoá cờ TF cho vòng kế tiếp.

7) Quay trở lại bước 2 để nạp lại TL và TH.

Ta có thể phát triển một công thức tính toán độ trễ sử dụng chế độ Mode1(16 bít) của bộ định thời đối với tần số thạch anh XTAL = 11, 0592MHz.

Bảng 3.13. Công thức tính toán độ trễ thời gian đối với tần số XTAL=

11, 0592MHz.

a) Tính theo số Hex b) Tính theo số thập phân

(FFFF - YYXX + 1). 1,085s trong đó YYXX là các giá trị khởi tạo của TH, TL tương ứng. Lưu ý rằng các giá trị YYXX là theo số Hex.

Chuyển đổi các giá trị YYXX của TH, TL về số thập phân để nhận một số thập phân NNNNN sau đó lấy (65536 - NNNNN).1,085s.

Ví dụ

MOV TMOD, #01 ; Sử dụng Timer0 và chế độ 1(16 bít)

HERE: MOV TL0, #0F2H ; TL0 = F2H, byte thấp

MOV TH0, #0FFH ; TH0 = FFH, byte cao

CPL P1.5 ; Sử dụng chân P1.5

ACALL DELAY

SJMP HERE ; Nạp lại TH, TL

; delay using timer0.

DELAY:

SETB TR0 ; Khởi động bộ định thời Timer0

AGAIN: JNB TF0, AGAIN;Hiển thị cờ bộ định thời cho đến khi nó vượt qua FFFFH.

Page 145: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

146

CLR TR0 ; Dừng bộ Timer

CLR TF0 ; Xoá cờ bộ định thời 0

RET

Số đếm bằng FFFFH - FFF2H = 0DH (13 theo số thập phân). Tuy nhiên, ta phải cộng 1 vào 13 vì cần thêm một nhịp đồng hồ để nó quay từ FFFFH về 0 và bật cờ TF. Do vậy, ta có 14 1,085s = 15,19s cho nửa chu kỳ và cả chu kỳ là T = 2 15,19s =

30,38s là thời gian trễ được tạo ra bởi bộ định thời.

c. Tìm các giá trị cần được nạp vào bộ định thời

Giả sử rằng chúng ta biết lượng thời gian trễ mà ta cần thì câu hỏi đặt ra là làm thế nào để tìm ra được các giá trị cần thiết cho các thanh thi TH và TL. Để tính toán các giá trị cần được nạp vào các thanh ghi TH và TL chúng ta hãy nhìn vào ví dụ sau với việc sử dụng tần số dao động XTAL = 11. 0592 MHz đối với hệ 8051.

Ta có thể sử dụng những bước sau để tìm các giá trị của các thanh ghi TH và TL.

1. Chia thời gian trễ cần thiết cho 1.085s 2. Thực hiện 65536 - n với n là giá trị thập phân nhận được từ bước 1. 3. Chuyển đổi kết quả ở bước 2 sang số Hex với yyxx là giá trị hex ban đầu cần phải nạp vào các thanh ghi bộ định thời. 4. Đặt TL = xx và TH = yy.

Ví dụ

Giả sử tần số XTAL = 11.0592MHz. Hãy tìm các giá trị cần được nạp vào các thanh ghi vào các thanh ghi TH và TL nếu ta muốn độ thời gian trễ là 5s. Hãy trình bày chương trình cho bộ Timer0 để tạo ra bộ xung với độ rộng 5s trên chân P2.3.

Lời giải:

Vì tần số XTAL = 11.0592MHz nên bộ đếm tăng sau mỗi chu kỳ 1.085s. Điều đó có nghĩa là phải mất rất nhiều khoảng thời gian 1,085s để có được một xung 5s. Để có được ta chia 5ms cho 1.085s và nhận được số n = 4608 nhịp. Để nhận được giá trị

Page 146: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

147

cần được nạp vào TL và TH thì ta tiến hành lấy 65536 trừ đi 4608 bằng 60928. Ta đổi số này ra số hex thành EE00H. Do vậy, giá trị nạp vào TH là EE Và TL là 00.

CLR P2.3 ; Xoá bít P2.3

MOV TMOD, #01 ; Chọn Timer0, chế độ 1 (16 bít)

HERE: MOV TL0, #0 ; Nạp TL = 00

MOV TH0, #EEH ; Nạp TH = EEH

SETB P2.3 ; Bật P2.3 lên cao

SETB TR0 ; Khởi động bộ định thời Timer0

AGAIN: JNB TF0, AGAIN ; Hiển thị cờ TF0 cho đến khi bộ đếm quay về 0

CLR TR0 ; Dừng bộ định thời.

CLR TF0 ; Xoá cờ TF0 cho vòng sau.

d. Tạo một độ trễ thời gian lớn

Ví dụ

Hãy kiểm tra chương trình sau và tìm độ trễ thời gian theo giây, không tính đến tổng phí các lệnh trong vòng lặp.

MOV TMOD, #10H ; Chọn bộ Timer1, chế độ 1 (16 bít)

AGAIN: MOV R3, #200 ; Chọn bộ đếm độ giữ chậm lớn

MOV TL1, #08 ; Nạp byte thấp TL1 = 08

MOV TH1, #08 ; Nạp byte cao TH1 = 01

SETB TR1 ; Khởi động Timer1

BACK: JNB TF1, BACK ; Giữ nguyên cho đến khi bộ định thời quay về 0

Page 147: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

148

CLR TR1 ; Dừng bộ định thời.

CLR TF1 ; Xoá cờ bộ định thời TF1

DJNZ R3, AGAIN ; Nếu R3 không bằng không thì nạp lại bộ định

thời.

3.4.1.3. Chế độ 0

Chế độ 0 hoàn toàn giống chế độ 1 chỉ khác là bộ định thời 16 bít được thay bằng 13 bít. Bộ đếm 13 bít có thể giữ các giá trị giữa 0000 đến 1FFFF trong TH - TL. Do vậy khi bộ định thời đạt được giá trị cực đại của nó là 1FFFH thì nó sẽ quay trở về 0000 và cờ TF được bật lên.

3.4.1.4. Lập trình chế độ 2

a. Các đặc trưng và các phép tính của chế độ 2

1. Nó là một bộ định thời 8 bít, do vậy nó chỉ cho phép các giá trị từ 00 đến FFH được nạp vào thanh ghi TH của bộ định thời.

2. Sau khi TH được nạp với giá trị 8 bít thì 8051 lấy một bản sao của nó đưa vào TL. Sau đó bộ định thời phải được khởi động. Điều này được thực hiện bởi lệnh “SETB TR0” đối với Timer0 và “SETB TR1” đối với Timer1 giống như ở chế độ 1.

3. Sau khi bộ định thời được khởi động, nó bắt đầu đếm tăng lên bằng cách tăng thanh ghi TL. Nó đếm cho đến khi đạt giá trị giới hạn FFH của nó. Khi nó quay trở về 00 từ FFH, nó thiết lập cờ bộ định thời TF. Nếu ta sử dụng bộ định thời Timer0 thì đó là cờ TF0, còn Timer1 thì đó là cờ TF1.

Hình 6.15. Bộ định thời làm việc ở chế độ 2

XTAL

12

TL TF

TF goes high

when FFFF 0

reload

TR 0T/C

TF

Page 148: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

149

4. Khi thanh ghi TL quay trở về 00 từ FFH thì TF được bật lên 1 thì thanh ghi TL được tự động nạp lại với giá trị ban đầu được giữ bởi thanh ghi TH. Để lặp lại quá trình chúng ta đơn giản chỉ việc xoá cờ TF và để cho nó chạy mà không cần sự can thiệp của lập trình viên để nạp lại giả trị ban đầu. Điều này làm cho chế độ 2 được gọi là chế độ tự nạp lại so với chế độ 1 thì ta phải nạp lại các thanh ghi TH và TL.

Cần phải nhấn mạnh rằng, chế độ 2 là bộ định thời 8 bít. Tuy nhiên, nó lại có khả năng tự nạp. Khi tự nạp lại thì TH thực chất là không thay đổi với giá trị ban đầu (được giữ nguyên), còn TL được nạp lại giá trị được sao từ TH.

b. Các bước lập trình cho chế độ 2

Để tạo ra một thời gian trễ sử dụng chế độ 2 của bộ định thời cần thực hiện các bước sau:

1. Nạp thanh ghi giá trị TMOD để báo bộ định thời gian nào (Timer0 hay Timer1) được sử dụng và chế độ làm việc nào của chúng được chọn.

2. Nạp lại các thanh ghi TH với giá trị đếm ban đầu. 3. Khởi động bộ định thời. 4. Duy trì hiển thị cờ bộ định thời TF sử dụng lệnh “JNB TFx, đích” để xem nó

sẽ được bật chưa. Thoát vòng lặp khi TF lên cao. 5. Xoá cờ TF. 6. Quay trở lại bước 4 vì chế độ 2 là chế độ tự nạp lại. Ví dụ

MOV TMOD, #20H ; Chọn Timer1/ chế độ 2/ 8 bít/ tự nạp lại.

MOV TH1, #5 ; TH1 = 5

SETB TR1 ; Khởi động Timer1

BACK: JNB TF1, BACK ; Giữ nguyên cho đến khi bộ định thời quay về 0

CPL P1.0 ; Dừng bộ định thời.

CLR TF1 ; Xoá cờ bộ định thời TF1

SJMP BACK ; Chế độ 2 tự động nạp lại.

Page 149: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

150

Trước hết để ý đến đích của lệnh SJMP. Trong chế độ 2 ta không cần phải nạp lại TH vì nó là chế độ tự nạp. Bây giờ ta lấy (256 - 05).1.085s = 2511.085s = 272.33s là

phần cao của xung. Cả chu kỳ của xung là T = 544.66s và tần số là .kHz83597,1T1

Để nhận tần số nhỏ nhất có thể ta cần tạo T chu kỳ lớn nhất có thể có nghĩa là TH = 00. Trong trường hợp này ta có T = 2 256 1.085s = 555.52s và tần số nhỏ nhất

sẽ là .kHz8,1T1

c. Các trình hợp ngữ và các giá trị âm

Vì bộ định thời là 8 bít trong chế độ 2 nên ta có thể để cho trình hợp ngữ tính giá trị cho TH. Ví dụ, trong lệnh “MOV TH0, # - 100” thì trình hợp ngữ sẽ tính toán – 100 = 9C và gán TH = 9CH.

3.4.2. Lập trình cho bộ đếm

Các bộ định thời cũng có thể được dùng như các bộ đếm các sự kiện xảy ra bên ngoài 8051. Đối với bộ định thời/ bộ đếm khi dùng nó như bộ định thời thì nguồn tần số là tần số thạch anh của 8051. Tuy nhiên, khi nó được dùng như một bộ đếm thì nguồn xung để tăng nội dung các thanh ghi TH và TL là từ bên ngoài 8051. ở chế độ bộ đếm, hãy lưu ý rằng các thanh ghi TMOD và TH, TL cũng giống như đối với bộ định thời được bàn ở phần trước, thậm chí chúng vẫn có cùng tên gọi. Các chế độ của các bộ định thời cũng giống nhau.

3.4.2.1. Bít C/T trong thanh ghi TMOD

Bít C/T trong thanh ghi TMOD quyết định nguồn xung đồng hồ cho bộ định thời. Nếu bít C/T = 0 thì bộ định thời nhận các xung đồng hồ từ bộ dao động thạch anh của 8051. Ngược lại, khi C/T = 1 thì bộ định thời được sử dụng như bộ đếm và nhận các xung đồng hồ từ nguồn bên ngoài của 8051. Do vậy, khi bít C/T = 1 thì bộ đếm lên, khi các xung được đưa đến chân 14 và 15. Các chân này có tên là T0 (đầu vào của bộ định thời Timer0) và T1 (đầu vào của bộ Timer1). Lưu ý rằng hai chân này thuộc về cổng P3. Trong trường hợp của bộ Timer0 khi C/T = 1 thì chân P3.4 cấp xung đồng hồ và bộ đếm tăng lên đối với mỗi xung đồng hồ đi đến từ chân này. Tương tự như vậy đối với bộ Timer1 thì khi C/T = 1 với mỗi xung đồng hồ đi đến từ P3.5 bộ đếm sẽ đếm tăng lên 1.

Bảng 3.14: Các chân chọn cổng P3 được dựng cho Timer0 và Timer1

Page 150: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

151

Chân Chân cổng Chức năng Mô tả

14 P3.4 T0 Đầu vào ngoài của bộ đếm 0

15 P3.5 T1 Đầu vào ngoài của bộ đếm 1

Ví dụ

Giả sử rằng xung đồng hồ được cấp tới chân T1, hãy viết chương trình cho bộ đếm 1 ở chế độ 2 để đếm các xung và hiển thị trạng thái của số đếm TL1 trên cổng P2.

Lời giải:

MOV TMOD, #01100000B ; Chọn bộ đếm 1, chế độ 2, bít C/T = 1 xung ngoài.

MOV TH1, #0 ; Xoá TH1

SETB P3.5 ; Lấy đầu vào T1

AGAIN: SETB TR1 ; Khởi động bộ đếm

BACK: MOV A, TL1 ; Lấy bản sao số đếm TL1

MOV P2, A ; Đưa TL1 hiển thị ra cổng P2.

JNB TF1, Back ; Duy trì nó nếu TF = 0

CLR TR1 ; Dừng bộ đếm

CLR TF1 ; Xoá cờ TF

SJMP AGAIN ; Tiếp tục thực hiện

3.4.2.2.Thanh ghi TCON

Trong các ví dụ trên đây ta đã thấy công dụng của các cờ TR0 và TR1 để bật/ tắt các bộ định thời. Các bít này là một bộ phận của thanh ghi TCON (điều khiển bộ định thời). Đây là thanh ghi 8 bít, bốn bít cao được dùng để lưu cất các bít TF và TR cho cả Timer0 và Timer1. Còn bốn bít thấp được thiết lập dành cho điều khiển các bít ngắt. Thanh ghi TCON là thanh ghi có thể đánh địa chỉ theo bít được. Nên ta có thể thay các lệnh như “SETB TR1” là “CLR TR1” bằng các lệnh tương ứng như “SET TCON.6” và “CLR TCON.6”

3.4.3. Bộ định thời khi các bit GATE khác nhau

Khi GATE = 0 thì bộ định thời được khởi động bằng các lệnh “SETB TR0” và “SETB TR1” đối với Timer0 và Timer1 tương ứng. Nếu GATE = 1 thì việc khởi động

Page 151: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

152

và dừng bộ định thời được thực hiện từ bên ngoài qua chân P2.3 và P3.3 đối với Timer0 và Timer1 tương ứng. Mặc dù rằng TRx được bật lên bằng lệnh “SETB TRx” thì cũng cho phép ta khởi động và dừng bộ định thời từ bên ngoài tại bất kỳ thời điểm nào thông qua công tắc chuyển mạch đơn giản. Phương pháp điều khiển phần cứng để dừng và khởi động bộ định thời này có thể có rất nhiều ứng dụng. Ví dụ, chẳng hạn 8051 được dùng trong một sản phẩm phát báo động mỗi giây dùng bộ Timer0 theo nhiều việc khác. Bộ Timer0 được bật lên bằng phần mềm qua lệnh “SETB TR0” và nằm ngoài sự kiểm soát của người dùng sản phẩm đó. Tuy nhiên, khi nối một công tắc chuyển mạch tới chân P3.2 ta có thể dừng và khởi động bộ định thời gian bằng cách đó để tắt báo động.

Hình 3.16: Bộ định thời/ bộ đếm 0.

XTAL

oscillator

12

0T/C

1T/C T1 Pin

Pin 3.5

Gate

TR0

3.3PinPin1INT

XTAL

oscillator

12

0T/C

1T/C T0 Pin

Pin 3.4

Gate

TR0

2.3PinPinINTO

Page 152: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

153

Hình 3.17: Bộ định thời/ bộ đếm 1.

3.5. Lập trình truyền thông nối tiếp cho 8051

Ta chủ yếu tập trung vào truyền thông nối tiếp của 8051 với cổng COM của PC. Để cho phép truyền dữ liệu giữa máy tính PC và hệ thống 8051 mà không có bất kỳ lỗi nào thì chúng ta phải biết chắc rằng tốc độ baud của hệ 8051 phải phù hợp với tốc độ baud của cổng COM máy tính PC.

3.5.1. Tốc độ baud trong 8051

8051 chia tần số thạch anh cho 12 để lấy tần số chu trình máy. Trong trường hợp XTAL = 11.0592MHz thì tần số chu trình là 921.6kHz (11.0592MHz : 12 = 921.6kHz). Mạch điện UART truyền thông nối tiếp của 8051 lại chia tần số chu trình máy cho 32 một lần nữa trước khi nó được dùng bởi bộ định thời gian Timer1 để tạo ra tốc độ baud. Do vậy, 921.6kHz : 32 = 28.800Hz. Đây là số ta sẽ dùng trong cả phần này để tìm giá trị của Timer1 để đặt tốc độ baud. Muốn Timer1 đặt tốc độ baud thì nó phải được lập trình về chế độ làm việc mode2, đó là chế độ thanh ghi 8 bít tự động nạp lại. Để có tốc độ baud tương thích với PC ta phải nạp TH1 theo các giá trị cho trong bảng 3.15

Bảng 3.15: Các giá trị của thanh ghi Timer1 cho các tốc độ baud khác nhau.

Tốc độ baud TH1 (thập phân) TH1 (số Hex)

9600

4800

2400

1200

- 3 - 6

- 12 - 24

FD

FA

F4

F8

3.5.2. Thanh ghi SBUF

SBUF là thanh ghi 8 bít được dùng riêng cho truyền thông nối tiếp trong 8051. Đối với một byte dữ liệu cần phải được truyền qua đường TxD thì nó phải được đặt trong thanh ghi SBUF. Tương tự như vậy SBUF giữ một byte dữ liệu khi nó được

Page 153: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

154

nhận bởi đường RxD của 8051. SBUF có thể được truy cập bởi mọi thanh ghi bất kỳ trong 8051.

MOV SBUF, # “D” ; Nạp vào SBUF giá trị 44H mã ACSII của ký tự D.

MOV SBUF, A ; Sao thanh ghi A vào SBUF.

MOV A, SBUF ; Sao SBUF vào thanh ghi A.

Khi một byte được ghi vào thanh ghi SBUF nó được đóng khung với các bít Start và Stop và đường truyền nối tiếp qua chân TxD. Tương tự như vậy, khi các bít được nhận nối tiếp từ RxD thì 8051 mở khung để loại trừ các bít Start và Stop để lấy ra một byte từ dữ liệu nhận được và đặt nó vào thanh ghi SBUF.

3.5.3. Thanh ghi điều khiển nối tiếp SCON

Thanh ghi SCON là thanh ghi 8 bít được dùng để lập trình việc đóng khung bít bắt đầu Start, bít dừng Stop và các bít dữ liệu cùng với việc khác.

Dưới đây là mô tả các bít khác nhau của SCON:

SM SM1 SM2 REN TB8 RB8 TI RI

SM0 SCON.7 Số xác định chế độ làm việc cổng nối tiếp

SM1 SCON.6 Số xác định chế độ làm việc cổng nối tiếp

SM2 SCON.5 Dùng cho truyền thông giữa các bộ vi xử lý (SM2 = 0) REN SCON.4 Bật/xoá bằng phần mềm để cho phép/ không cho thu

TB8 SCON.3 Không sử dụng rộng rãi

RB8 SCON.2 Không sử dụng rộng rãi

TI SCON.1 Cờ ngắt truyền đặt bằng phần cứng khi bắt đầu bít Stop ở chế

độ 1.

Page 154: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

155

3.5.3.1 Các bít SM0, SM1

Đây là các bít D7 và D6 của thanh ghi SCON. Chúng được dùng để xác định chế độ đóng khung dữ liệu bằng cách xác định số bít của một ký tự và các bít Start và Stop. Các tổ hợp của chúng là:

SM0 SM1

0 0 Chế độ nối tiếp 0

0 1 Chế độ nối tiếp 1, 8 bít dữ liệu, Start, Stop

1 0 Chế độ nối tiếp 2

1 1 Chế độ nối tiếp 3

Trong bốn chế độ ta chỉ quan tâm đến chế độ 1. Trong thanh ghi SCON khi chế độ 1 được chọn thì dữ liệu được đóng khung gồm 8 bít dữ liệu, 1 bít Start, 1 bít Stop để tương thích với cổng COM của IBM PC và các PC tương thích khác. Quan trọng hơn là chế độ nối tiếp 1 cho phép tốc độ baud thay đổi và được thiết lập bởi Timer1 của 8051. Trong chế độ nối tiếp 1 thì mỗi ký tự gồm có 10 bít được truyền trong đó có bít đầu là bít Start, sau đó là 8 bít dữ liệu và cuối cùng là bít Stop.

3.5.3.2. Bít SM2

Bít SM2 là bít D5 của thanh ghi SCON. Bít này cho phép khả năng đa xử lý của 8051. Đối với các ứng dụng của chúng ta đặt SM2 = 0 vì ta không sử dụng 8051 trong môi trường đa xử lý.

3.5.3.3 Bít REN

Đây là bít cho phép thu (Receive Enable), bít D4 của thanh ghi SCON. Bít REN cũng được tham chiếu như là SCON.4 vì SCON là thanh ghi có thể đánh địa chỉ theo bít. Khi bít REN cao thì nó cho phép 8051 thu dữ liệu trên chân RxD của nó. Và kết quả là nếu ta muốn 8051 vừa truyền và nhận dữ liệu thì bít REN phải được đặt lên 1. Khi đặt REN thì bộ thu bị cấm. Việc đặt REN = 1 hay REN = 0 có thể đạt được bằng lệnh “SETB SCON.4” và “CLR SCON.4” tương ứng. Lưu ý rằng các lệnh này sử dụng đặc điểm đánh địa chỉ theo bít của thanh ghi SCON. Bít này có thể được dùng để

Page 155: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

156

khống chế mọi việc nhận dữ liệu nối tiếp và nó là bít cực kỳ quan trọng trong thanh ghi SCON.

3.5.3.4. Bít TB8 và RB8

Bít TB8 là bít SCON.3 hay là bít D3 của thanh ghi SCON. Nó được dùng để chọn chế độ nối tiếp 2 và 3.

Bít RB8 (bít thu 8) là bít D2 của thanh ghi SCON. Trong chế độ nối tiếp 1 thì bít này nhận một bản sao của bít Stop khi một dữ liệu 8 bít được nhận. Bít này cũng như bít TB8 rất hiếm khi được sử dụng. Trong các ứng dụng của mình ta đặt RB8 = 0 vì nó được sử dụng cho chế độ nối tiếp 2 và 3.

3.5.3.5. Các bít TI và RI

Các bít ngắt truyền TI và ngắt thu RI là các bít D1 và D0 của thanh ghi SCON. Các bít này là cực kỳ quan trọng của thanh ghi SCON. Khi 8051 kết thúc truyền một ký tự 8 bít thì nó bật TI để báo rằng nó sẵn sàng truyền một byte khác. Bít TI được bật lên trước bít Stop. Còn khi 8051 nhận được dữ liệu nối tiếp qua chân RxD và nó tách các bít Start và Stop để lấy ra 8 bít dữ liệu để đặt vào SBUF, sau khi hoàn tất nó bật cờ RI để báo rằng nó đã nhận xong một byte và cần phải lấy đi kẻo nó bị mất cờ RI được bật khi đang tách bít Stop.

3.5.4. Lập trình 8051 để truyền dữ liệu nối tiếp

Khi lập trình 8051 để truyền các byte ký tự nối tiếp thì cần phải thực hiện các bước sau đây:

1. Nạp thanh ghi TMOD giá trị 20H báo rằng sử dụng Timer1 ở chế độ 2 để thiết lập chế độ baud.

2. Nạp thanh ghi TH1 các giá trị cho trong bảng 10.4 để thiết lập chế độ baud truyền dữ liệu nối tiếp (với giả thiết tần số XTAL = 11.0592MHz).

3. Nạp thanh ghi SCON giá trị 50H báo chế độ nối tiếp 1 để đóng khung 8 bít dữ liệu, 1 bít Start và 1 bít Stop.

4. Bật TR1 = 1để khởi động Timer1. 5. Xoá bít TI bằng lệnh “CLR TI” 6. Byte ký tự cần phải truyền được ghi vào SBUF. 7. Bít cờ TI được hiển thị bằng lệnh “JNB TI, xx” để báo ký tự đã được truyền

hoàn tất chưa.

Page 156: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

157

8. Để truyền ký tự tiếp theo quay trở về bước 5. Ví dụ 1

Hãy viết chương trình cho 8051 để truyền nối tiếp một ký tự “A” với tốc độ 4800 baud liên tục.

Lời giải:

MOV TMOD, #20H ; Chọn Timer1, chế độ 2 (tự động nạp lại)

MOV TH1, # - 6 ; Chọn tốc độ 4800 baud

MOV SCON, #A” ; Truyền 8 bít dữ liệu, 1 bít Stop cho phép thu

SETB TR1 ; Khởi động Timer1

AGAIN: MOV SBUF, #”A” ; Cần truyền ký tự “A”

HERE: JNB TI, HERE ; Chờ đến bít cuối cùng

CLR TI ; Xoá bít TI cho ký tự kế tiếp

SJMP AGAIN ; Tiếp tục gửi lại chữ A

Ví dụ 2

Hãy viết chương trình để truyền chữ “YES” nối tiếp liên tục với tốc độ 9600 baud (8 bít dữ liệu, 1 bít Stop).

Lời giải:

MOV TMOD, #20H ; Chọn bộ Timer1, chế độ 2

MOV TH1, # - 3 ; Chọn tốc độ 9600 baud

MOV SCON, #50H ; Truyền 8 bít dữ liệu, 1 bít Stop cho phép thu

SETB TR1 ; Khởi động Timer1

AGAIN: MOV A, # "Y" ; Truyền ký tự “Y”

ACALL TRANS

Page 157: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

158

MOV A, # "E" ; Truyền ký tự “E”

ACALL TRANS

MOV A, # "S" ; Truyền ký tự “S”

ACALL TRANS

SJMP AGAIN ; Tiếp tục

; Chương trình con truyền dữ liệu nối tiếp.

TRANS: MOV SBUF, A ; Nạp SBUF

HERE: JNB TI, HERE ; Chờ cho đến khi truyền bít cuối cùng

CLR TI ; Chờ sẵn cho một byte kế tiếp

RET

Tầm quan trọng của cờ TI

Để hiểu tầm quan trọng của cờ ngắt TI ta hãy xét trình tự các bước dưới đây mà 8051 phải thực hiện khi truyền một ký tự quan đường TxD:

1. Byte ký tự cần phải truyền được ghi vào SBUF. 2. Truyền bít Start 3. Truyền ký tự 8 bít lần lượt từng bít một. 4. Bít Stop được truyền xong, trong quá trình truyền bít Stop thì cờ TI được bật

(TI = 1) bởi 8051 để báo sẵn sàng để truyền ký tự kế tiếp. 5. Bằng việc hiển thị cờ TI ta biết chắc rằng ta không nạp quá vào thanh ghi

SBUF. Nếu ta nạp một byte vào SBUF trước ghi TI được bật thì phần dữ liệu của byte trước chưa truyền hết sẽ bị mất. Hay nói cách khác là 8051 bật cờ TI khi đã truyền xong một byte và nó sẵn sàng để truyền byte kế tiếp.

6. Sau khi SBUF được nạp một byte mới thì cờ TI nhằm để báo có thể truyền byte mới này.

Bằng việc kiểm tra bít cờ ngắt TI ta biết được 8051 có sẵn sàng để truyền một byte khác không. Quan trọng hơn cần phải nói ở đây là bít cờ TI được bật bởi từ 8051 khi nó hoàn tất việc truyền một byte dữ liệu, còn việc xoá nó thì phải được lập trình viên thực hiện bằng lệnh “CLR TI”. Lưu ý rằng, nếu ta ghi một byte vào thanh ghi

Page 158: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

159

SBUF trước khi cờ TI được bật thì sẽ có nguy cơ mất phần dữ liệu đang truyền. Bít cờ TI có thể kiểm tra bằng lệnh “JNB TI …” hoặc có thể sử dụng ngắt.

3.5.5. Lập trình 8051 để nhận dữ liệu

3.5.5.1. Các bước lập trình của 8051 để nhận các byte ký tự nối tiếp

1. Nạp giá trị 20H vào thanh ghi TMOD để báo sử dụng bộ Timer1, chế độ 2 (8 bít, tự động nạp lại) để thiết lập tốc độ baud.

2. Nạp TH1 các giá trị cho để tạo ra tốc độ baud với giả thiết XTAL = 11.0592MHz.

3. Nạp giá trị 50H vào thanh ghi SCON để báo sử dụng chế độ truyền nối tiếp 1 là dữ liệu được đóng gói bởi 8 bít dữ liệu, 1 bít Start và 1 bít Stop.

4. Bật TR1 = 1 để khởi động Timer1. 5. Xoá cờ ngắt RI bằng lệnh “CLR RI”. 6. Bít cờ RI được hiển thị bằng lệnh “JNB RI, xx” để xem toàn bộ ký tự đã được

nhận chưa. 7. Khi RI được thiết lập thì trong SBUF đã có 1 byte. Các nội dung của nó được

cất lưu vào một nơi an toàn. 8. Để nhận một ký tự tiếp theo quay trở về bước 5. Ví dụ

Hãy lập trình cho 8051 để nhận các byte dữ liệu nối tiếp và đặt chúng vào cổng P1. Đặt tốc độ baud là 4800, 8 bít dữ liệu và 1 bít Stop.

Lời giải:

MOV TMOD, #20H ; Chọn bộ Timer1, chế độ 2 (tự động nạp lại)

MOV TH1, # - 6 ; Chọn tốc độ 4800 baud

MOV SCON, #50H ; Chọn khung dữ liệu 8 bít Stop, bít.

SETB TR1 ; Khởi động bộ Timer1

HERE: JNB R1, HERE ; Đợi nhận toàn bộ lý tự vào hết

MOV A, SBUF ; Lưu cất ký tự vào thanh A

MOV P1, A ; Gửi ra cổng P.1

Page 159: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

160

CLR RI ; Sẵn sàng nhận byte kế tiếp

SJMP HERE ; Tiếp tục nhận dữ liệu

3.5.5.2. Tầm quan trọng của cờ RT

Khi nhận các bít qua chân RxD của nó thì 8051 phải đi qua các bước sau:

1. Nó nhận bít Start báo rằng bít sau nó là bít dữ liệu đầu tiên cần phải nhận. 2. Ký tự 8 bít được nhận lần lượt từng bít một. Khi bít cuối cùng được nhận

thì một byte được hình thành và đặt vào trong SBUF. 3. Khi bít Stop được nhận thì 8051 bật RI = 1 để báo rằng toàn bộ ký tự được

nhận và phải lấy đi trước khi nó bị byte mới nhận về ghi đè lên. 4. Bằng việc kiểm tra bít cờ RI khi nó được bật lên chúng ta biết rằng một ký

tự đã được nhận và đang nằm trong SBUF. Ta sao nội dung SBUF vào nơi an toàn trong một thanh ghi hay bộ nhớ khác trước khi nó bị mất.

5. Sau khi SBUF được ghi vào nơi an toàn thì cờ RI được xoá về 0 bằng lệnh “CLR RI” nhằm cho các ký tự kế tiếp nhận được đưa vào SBUF. Nếu không làm được điều này thì gây ra mất ký tự vừa nhận được.

Bằng việc kiểm tra cờ RI ta biết 8051 đã nhận được một byte ký tự chưa. Nếu ta không sao được nội dung của thanh ghi SBUF vào nơi an toàn thì có nguy cơ ta bị mất ký tự vừa nhận được. Quan trọng hơn là phải nhớ rằng cờ RI được 8051 bật lên như lập trình viên phải xoá nó bằng lệnh “CLR RI”. Bít cờ RI có thể được kiểm tra bởi lệnh “JNB RI, xx” hoặc bằng ngắt.

3.5.6 Nhân đôi tốc độ baud trong 8051

Có hai cách để tăng tốc độ baud truyền dữ liệu trong 8051.

1. Sử dụng tần số thạch anh cao hơn. 2. Thay đổi một bít trong thanh ghi điều khiển công suất PCON (Power Control)

như chỉ ra dưới đây.

SM0D GF0 GF0 PD IDL

D7 D0

Page 160: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

161

Phương án một là không thực thi trong nhiều trường hợp vì tần số thạch anh của hệ thống là cố định. Nó không khả thi vì tần số thạch anh mới không tương thích với tốc độ baud của các cổng COM nối tiếp của IBM PC. Do vậy, ta sẽ tập trung thăm dò phương án hai, có một cách nhân đôi tần số baud bằng phần mềm trong 8051 với tần số thạch anh không đổi. Điều này được thực hiện nhờ thanh ghi PCON, đây là thanh ghi 8 bít. Trong 8 bít này thì có một số bít không được dùng để điều khiển công suất của 8051. Bít dành cho truyền thông là D7, bít SMOD (chế độ nối tiếp - serial mode). Khi 8051 được bật nguồn thì bít SMOD của thanh ghi PCON ở mức thấp 0. Chúng ta có thể đặt nó lên 1 bằng phần mềm và do vậy nhân đôi được tốc độ baud. Thứ tự các lệnh được sử dụng để thiết lập bít D7 của PCON lên cao như sau (thanh ghi PCON là thể đánh địa chỉ theo bít).

MOV A, PCON ; Đặt bản sao của PCON vào ACC

SETB ACC.7 ; Đặt D7 của ACC lên 1.

MOV PCON, A ; Bây giờ SMOD = 1 mà không thay đổi bất kỳ bít nào khác.

Xét vai trò của bít SMOD trong PCON khi nó là 0 và 1.

a) Khi SMOD = 0

Khi SMOD = 0 thì 8051 chia 1/12 tần số thạch anh cho 32 và sử dụng nó cho bộ Timer1 để thiết lập tốc độ baud. Trong trường hợp XTAL = 11.0592MHz thì tacó:

Tần số chu trình máy kHz6.92112

MHz0592.11 và Hz800.28

32kHz6.921

vì SMOD =

0.

Đây là tần số được Timer1 sử dụng để đặt tốc độ baud. nó là giá trị mặc định của 8051 khi bật nguồn.

b) Khi SMOD = 1

Với tần số cố định thạch anh ta có thể nhân đôi tốc độ baud bằng cách đặt bít SMOD = 1. Khi bít D7 của PCON (bít SMOD) được đưa lên 1 thì 1/12 tần số XTAL được chia cho 16 (thay vì chia cho 32 như khi SMOD = 0) và đây là tần số được Timer dùng để thiết lập tốc độ baud. Trong trường hợp XTAL = 11.0592MHz ta có:

Page 161: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

162

Tần số chu trình máy kHz6.92112

MHz0592.11 và kHz600.57

16kHz6.921

SMOD = 1.

Đây là tần số mà Timer1 dùng để đặt tốc độ baud. Bảng 3.16 là các giá trị cần được nạp vào TH1 cùng với các tốc độ baud của 8051 khi SMOD = 0 và 1.

Bảng 3.16 : So sánh tốc độ baud khi SMOD thay đổi.

TH1 (thập phân) TH1 (Hex) Tốc độ baud

SMOD = 0 SMOD = 1

-3

-6

-12

-24

FD

DA

F4

E8

9600

4800

2400

1200

19200

9600

4800

2400

3.5.7. Truyền dữ liệu dựa trên các ngắt

Ta phải thấy rằng thật lãng phí để các bộ vi điều khiển phải bật lên xuống các cờ TI và RI. Do vậy, để tăng hiệu suất của 8051 ta có thể lập trình các cổng truyền thông nối tiếp của nó bằng các ngắt.

3.6. Lập trình các ngắt

3.6.1. Các ngắt của 8051

3.6.1.1. Trình phục vụ ngắt

Đối với mỗi ngắt thì phải có một trình phục vụ ngắt ISR hay trình quản lý ngắt. Khi một ngắt được gọi thì bộ vi điều khiển chạy trình phục vụ ngắt. Đối với mỗi ngắt thì có một vị trí cố định trong bộ nhớ để giữ địa chỉ ISR của nó. Nhóm các vị trí nhớ được dành riêng để gửi các địa chỉ của các ISR được gọi là bảng véc tơ ngắt.

3.6.1.2. Các bước khi thực hiện một ngắt

Khi kích hoạt một ngắt bộ vi điều khiển đi qua các bước sau:

1. Nó kết thúc lệnh đang thực hiện và lưu địa chỉ của lệnh kế tiếp (PC) vào ngăn xếp.

Page 162: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

163

2. Nó cũng lưu tình trạng hiện tại của tất cả các ngắt vào bên trong (nghĩa là không lưu vào ngăn xếp).

3. Nó nhảy đến một vị trí cố định trong bộ nhớ được gọi là bảng véc tơ ngắt nơi lưu giữ địa chỉ của một trình phục vụ ngắt.

4. Bộ vi điều khiển nhận địa chỉ ISR từ bảng véc tơ ngắt và nhảy tới đó. Nó bắt đầu thực hiện trình phục vụ ngắt cho đến lệnh cuối cùng của ISR là RETI (trở về từ ngắt).

5. Khi thực hiện lệnh RETI bộ vi điều khiển quay trở về nơi nó đã bị ngắt. Trước hết nó nhận địa chỉ của bộ đếm chương trình PC từ ngăn xếp bằng cách kéo hai byte trên đỉnh của ngăn xếp vào PC. Sau đó bắt đầu thực hiện các lệnh từ địa chỉ đó.

Lưu ý ở bước 5 đến vai trò nhạy cảm của ngăn xếp, vì lý do này mà chúng ta phải cẩn thận khi thao tác các nội dung của ngăn xếp trong ISR. Đặc biệt trong ISR cũng như bất kỳ chương trình con CALL nào số lần đẩy vào ngăn xếp (PUSH) và số lần lấy ra từ nó (POP) phải bằng nhau.

3.6.1.3. Sáu ngắt trong 8051

Thực tế chỉ có 5 ngắt dành cho người dùng trong 8051 nhưng nhiều nhà sản xuất đưa ra các bảng dữ liệu có sáu ngắt vì họ tính cả lệnh tái thiết lập lại RESET. Sáu ngắt của 8051 được phân bố như sau:

1. RESET: Khi chân RESET được kích hoạt từ 8051 nhảy về địa chỉ 0000. Đây là địa chỉ bật lại nguồn.

2. Gồm hai ngắt dành cho các bộ định thời: 1 cho Timer0 và 1 cho Timer1. Địa chỉ của các ngắt này là 000B H và 001B H trong bảng véc tơ ngắt dành cho Timer0 và Timer1 tương ứng.

3. Hai ngắt dành cho các ngắt phần cứng bên ngoài chân 12 (P3.2) và 13 (P3.3) của cổng P3 là các ngắt phần cứng bên ngoài INT0 và INT1 tương ứng. Các ngắt ngoài cũng còn được coi như EX1 và EX2 vị trí nhớ trong bảng véc tơ ngắt của các ngắt ngoài này là 0003H và 0013H gán cho INT0 và INT1 tương ứng.

4. Truyền thông nối tiếp có một ngắt thuộc về cả thu và phát. Địa chỉ của ngắt này trong bảng véc tơ ngắt là 0023H.

Bảng 3.17. Bảng vectơ ngắt

Ngắt Địa chỉ ROM Chân

Page 163: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

164

Bật lại nguồn (RESET) 0000 9

Ngắt phần cứng ngoài (INT0) 0003 12 (P3.2)

Ngắt bộ Timer0 (TF0) 000B

Ngắt phần cứng ngoài 1 (INT1) 0013 13 (P3.3)

Ngắt bộ Timer1 (TF1) 001B

Ngắt COM nối tiếp (RI và TI) 0023

Chú ý rằng trong bảng 3.17 có một số giới hạn các byte dành riêng cho mỗi ngắt. Ví dụ, đối với ngắt INT0 ngắt phần cứng bên ngoài 0 thì có tổng cộng là 8 byte từ địa chỉ 0003H đến 000AH dành cho nó. Tương tự như vậy, 8 byte từ địa chỉ 000BH đến 0012H là dành cho ngắt bộ định thời 0 là T0. Nếu trình phục vụ ngắt đối mặt với một ngắt đã cho mà ngắt đủ đặt vừa không gian nhớ được. Nếu không vừa thì một lệnh LJMP được đặt vào trong bảng véc tơ ngắt để chỉ đến địa chỉ của ISR, ở trường hợp này thì các byte còn lại được cấp cho ngắt này không dùng đến.

Từ bảng 3.17 ta để ý thấy một thực tế rằng chỉ có 3 byte của không gian bộ nhớ ROM được gán cho chân RESET. Đó là những vị trí địa chỉ 0, 1 và 2 của ROM. Vị trí địa chỉ 3 thuộc về ngắt phần cứng bên ngoài 0 với lý do này trong chương trình chúng ta phải đặt lệnh LJMP như là lệnh đầu tiên và hướng bộ xử lý lệnh khỏi bảng véc tơ ngắt.

3.6.1.4. Cho phép và cấm ngắt

Khi bật lại nguồn thì tất cả mọi ngắt đều bị cấm (bị che) có nghĩa là không có ngắt nào sẽ được bộ vi điều khiển đáp ứng nếu chúng được kích hoạt. Các ngắt phải được kích hoạt bằng phần mềm để bộ vi điều khiển đáp ứng chúng. Có một thanh ghi được gọi là cho phép ngắt IE (Interrupt Enable) chịu trách nhiệm về việc cho phép (không che) và cấm (che) các ngắt. IE là thanh ghi

có thể đánh địa chỉ theo bít.

EA IE.7 Nếu EA = 0 thì mọi ngắt bị cấm

EA -- ET2 ES ET1 EX1 ET0 EX0

D0 D7

Page 164: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

165

Nếu EA = 1 thì mỗi nguồn ngắt được cho phép hoặc bị cấm bằng các bật hoặc xoá bít cho phép của nó.

- - IE.6 Dự phòng cho tương lai.

ET2 IE.5 Cho phép hoặc cấm ngắt tràn hoặc thu của Timer2 (8051).

ES IE.4 Cho phép hoặc cấm ngắt cổng nối tiếp.

ET1 IE.3 Cho phép hoặc cấm ngắt tràn của Timer1.

EX1 IE.2 Cho phép hoặc cấm ngắt ngoài 1.

ET0 IE.1 Cho phép hoặc cấm ngắt tràn của Timer0.

EX0 IE.0 Cho phép hoặc cấm ngắt ngoài 0.

Ta thấy rằng D7 của thanh ghi IE được gọi là bít cho phép tất cả các ngắt EA (Enable All). Bít này phải được thiết lập lên 1 để phần còn lại của thanh ghi hoạt động được. Bít D6 chưa được sử dụng. Bít D5 được dành cho 8051, còn bít D4 dùng cho ngắt nối tiếp v.v…

3.6.1.5. Các bước khi cho phép ngắt

Để cho phép một ngắt ta phải thực hiện các bước sau

1. Bít D7 của thanh ghi IE là EA phải được bật lên cao để cho phép các bít còn lại của thanh ghi nhận được hiệu ứng.

2. Nếu EA = 1 thì tất cả mọi ngắt đều được phép và sẽ được đáp ứng nếu các bít tương ứng của chúng trong IE có mức cao. Nếu EA = 0 thì không có ngắt nào sẽ được đáp ứng cho dù bít tương ứng của nó trong IE có giá trị cao.

3.6.2. Lập trình các ngắt bộ định thời

3.6.2.1. Cờ quay về 0 của bộ định thời và ngắt

Ta thấy rằng cờ bộ định thời TF được đặt lên cao khi bộ định thời đạt giá trị cực đại và quay về 0 (Roll - Over). Trong chương trình này chúng ta cũng chỉ ra cách hiển thị cờ TF bằng lệnh “JNB TF, đích”. Khi thăm dò cờ TF thì ta phải đợi cho đến khi cờ TF được bật lên.Vấn đề với phương pháp này là bộ vi điều khiển bị trói buộc khi cờ TF được bật lên và không thể làm được bất kỳ việc gì khác. Sử dụng các ngắt giải quyết được vấn đề này và tránh được sự trói buộc của bộ vi điều khiển. Nếu bộ ngắt định thời trong thanh ghi IE được phép thì mỗi khi nó quay trở về 0 cờ TF được bật lên và bộ vi điều khiển bị ngắt tại bất kỳ việc gì nó đang thực hiện và nhảy tới bảng

Page 165: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

166

véc tơ ngắt để phục vụ ISR. Bằng cách này thì bộ vi điều khiển có thể làm những công việc khác cho đến khi nào nó được thông báo rằng bộ định thời đã quay về 0.

Hình 3.18: Ngắt bộ định thời TF0 và TF1

3.6.2.2.Ví dụ

Hãy viết chương trình nhân liên tục dữ liệu 8 bít ở cổng P0 và gửi nó đến cổng P1 trong khi nó cùng lúc tạo ra một sóng vuông chu kỳ 200s trên chân P2.1. Hãy sử dụng bộ Timer0 để tạo ra sóng vuông, tần số của 8051 là XTAL = 11.0592MHz.

Lời giải:

Ta sử dụng bộ Timer0 ở chế độ 2 (tự động nạp lại) giá trị nạp cho TH0 là 100/1.085s = 92.

; - - Khi khởi tạo vào chương trình main tránh dùng không gian.

; Địa chỉ dành cho bảng véc tơ ngắt.

ORG 0000H

CPL P2.1 ; Nhảy đến bảng véc tơ ngắt.

; - - Trình ISR dành cho Timer0 để tạo ra sóng vuông.

ORG 0030H ; Ngay sau địa chỉ bảng véc-tơ ngắt

MAIN: MOV TMOD, #02H ; Chọn bộ Timer0, chế độ 2 tự nạp lại

MOV P0, #0FFH ; Lấy P0 làm cổng vào nhận dữ liệu

1 000BH

TF0

Jumps to

Timer 0 Interruptor

1 001BH

TF1

Jumps to

Timer 1 Interruptor

Page 166: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

167

MOV TH0, # - 92 ; Đặt TH0 = A4H cho – 92

MOV IE, #82H ; IE = 1000 0010 cho phép Timer0

SETB TR0 ; Khởi động bộ Timer0

BACK: MOV A, P0 ; Nhận dữ liệu vào từ cổng P0

MOV P1, A ; Chuyển dữ liệu đến cổng P1

SJMP BACK ; Tiếp tục nhận và chuyển dữ liệu

; Chừng nào bị ngắt bởi TF0

END

Lưu ý những điểm dưới đây của chương trình.

1. Chúng ta phải tránh sử dụng không gian bộ nhớ dành cho bảng véc tơ ngắt. Do vậy, ta đặt tất cả mã khởi tạo tại địa chỉ 30H của bộ nhớ. Lệnh LJMP là lệnh đầu tiên mà 8051 thực hiện khi nó được cấp nguồn. Lệnh LJMP lái bộ điều khiển tránh khỏi bảng véc tơ ngắt.

2. Trình phục vụ ISR của bộ Timer0 được đặt ở trong bộ nhớ bắt đầu tự địa chỉ 000BH và vì nó quá nhỏ đủ cho vào không gian nhớ dành cho ngắt này.

3. Chúng ta cho phép ngắt bộ Timer0 với lệnh “MOV IE, #1000 010H” trong chương trình chính MAIN.

4. Trong khi dữ liệu ở cổng P0 được nhận vào và chuyển liên tục sang công việc P1 thì mỗi khi bộ Timer0 trở về 0, cờ TF0 được bật lên và bộ vi điều khiển thoát ra khỏi vòng lặp BACK và đi đến địa chỉ 000BH để thực hiện ISR gắn liền với bộ Timer0.

Trong trình phục vụ ngắt ISR của Timer0 ta thấy rằng không cần đến lệnh “CLR TF0” trước khi lệnh RETI. Lý do này là vì 8051 xoá cờ TF bên trong khi nhảy đến bảng véc tơ ngắt.

3.6.3. Lập trình các ngắt phần cứng bên ngoài

Bộ vi điều khiển 8051 có hai ngắt phần cứng bên ngoài là chân 12 (P3.2) và chân 13 (P3.3) dùng cho ngắt INT0 và INT1. Khi kích hoạt những chân này thì 8051 bị ngắt tại bất kỳ công việc nào mà nó đang thực hiện và nó nhảy đến bảng véc tơ ngắt để thực hiện trình phục vụ ngắt.

Page 167: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

168

3.6.3.1 Các ngắt ngoài INT0 và INT1

Chỉ có hai ngắt phần cứng ngoài trong 8051 là INT0 và INT1. Chúng được bố trí trên chân P3.2 và P3.3 và địa chỉ của chúng trong bảng véc tơ ngắt là 0003H và 0013H. Chúng được ghép và bị cấm bằng việc sử dụng thanh ghi IE. Có hai mức kích hoạt cho các ngắt phần cứng ngoài: Ngắt theo mức và ngắt theo sườn.

3.6.3.2 Ngắt theo mức

ở chế độ ngắt theo mức thì các chân INT0 và INT1 bình thường ở mức cao (giống như tất cả các chân của cổng I/O) và nếu một tín hiệu ở mức thấp được cấp tới chúng thì nó ghi nhãn ngắt. Sau đó bộ vi điều khiển dừng tất cả mọi công việc nó đang thực hiện và nhảy đến bảng véc tơ ngắt để phục vụ ngắt. Điều này được gọi là ngắt được kích hoạt theo mức hay ngắt theo mức và là chế độ ngắt mặc định khi cấp nguồn lại cho 8051. Tín hiệu mức thấp tại chân INT phải được lấy đi trước khi thực hiện lệnh cuối cùng của trình phục vụ ngắt RETI, nếu không một ngắt khác sẽ lại được tạo ra. Hay nói cách khác, nếu tín hiệu ngắt mức thấp không được lấy đi khi ISR kết thúc thì

IE0

(TCON.1)

INTO

(Pin 3.2)

Level -

Edge - triggered

0003 IT0 0 1

IE0

(TCON.3)

INTO

(Pin 3.3)

Level -

Edge - triggered

0013 IT1 0 1

Page 168: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

169

nó không thể hiện như một ngắt khác và 8051 nhảy đến bảng véc tơ ngắt để thực hiện ISR.

Ví dụ

Giả sử chân INT1 được nối đến công tắc bình thường ở mức cao. Mỗi khi nó xuống thấp phải bật một đèn LED. Đèn LED được nối đến chân P1.3 và bình thường ở chế độ tắt. Khi nó được bật lên nó phải sáng vài phần trăm giây. Chừng nào công tắc được ấn xuống thấp đèn LED phải sáng liên tục.

Lời giải:

ORG 0000H

LJMP MAIN ; Nhảy đến bảng véc tơ ngắt

; - - Chương trình con ISR cho ngắt cứng INT1 để bật đèn LED.

ORG 0013H ; Trình phục vụ ngắt ISR cho INT1

SETB P1.3 ; Bật đèn LED

MOV R3, # 255

BACK: DJNZ R3, BACK ; Giữ đèn LED sáng một lúc

CLR P1.3 ; Tắt đèn LED

RETI ; Trở về từ ISR

; - - Bắt đầu chương trình chính Main.

ORG 30H

MAIN: MOV IE, #10000100B ; Cho phép ngắt dài

SJMP HERE ; Chờ ở đây cho đến khi được ngắt

END

Nhấn công tắc xuống sẽ làm cho đèn LED sáng. Nếu nó được giữ ở trạng thái được kích hoạt thì đèn LED sáng liên tục.

Page 169: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

170

Trong chương trình này bộ vi điều khiển quay vòng liên tục trong vòng lặp HERE. Mỗi khi công tắc trên chân P3.3 (INT1) được kích hoạt thì bộ vi điều khiển thoát khỏi vòng lặp và nhảy đến bảng véc tơ ngắt tại địa chỉ 0013H. Trình ISR cho INT1 bật đèn LED lên giữ nó một lúc và tắt nó trước khi trở về. Nếu trong lúc nó thực hiện lệnh quay trở về RETI mà chân INT1 vẫn còn ở mức thấp thì bộ vi điều khiển khởi tạo lại ngắt. Do vậy, để giải quyết vấn đề này thì chân INT1 phải được đưa lên cao tại thời điểm lệnh RET1 được thực hiện.

3. 6.3.3. Trích mẫu ngắt theo mức

Các chân P3.2 và P3.3 bình thường được dùng cho vào - ra nếu các bít INT0 và INT1 trong thanh ghi IE không được kích hoạt. Sau khi các ngắt phần cứng trong thanh ghi IE được kích hoạt thì bộ vi điều khiển duy trì trích mẫu trên chân INTn đối với tín hiệu mức thấp một lần trong một chu trình máy. Theo bảng dữ liệu của nhà sản xuất của bộ vi điều khiển thì “chân ngắt phải được giữ ở mức thấp cho đến khi bắt đầu thực hiện trình phục vụ ngắt ISR. Nếu chân INTn được đưa trở lại mức cao trước khi bắt đầu thực hiện ISR thì sẽ chẳng có ngắt nào xảy ra”. Tuy nhiên trong quá trình kích hoạt ngắt theo mức thấp nên nó lại phải đưa lên mức cao trước khi thực hiện lệnh RETI và lại theo bảng dữ liệu của nhà sản xuất thì “nếu chân INTn vẫn ở mức thấp sau lệnh RETI của trình phục vụ ngắt thì một ngắt khác lại sẽ được kích hoạt sau khi lệnh RETI được thực hiện”. Do vậy, để bảo đảm việc kích hoạt ngắt phần cứng tại các chân INTn phải khẳng định rằng thời gian tồn tại tín hiệu mức thấp là khoảng 4 chu trình máy và không được hơn. Điều này là do một thực tế là ngắt theo mức không được chốt. Do vậy chân ngắt phải được giữ ở mức thấp cho đến khi bắt đầu thực hiện ISR.

1 chu trình m¸y

1.085s 4 chu trình máy (4MC)

4 1.085s

đến chân INT0 hoặc INT1

Ghi chú: Khi bật lại nguồn (RESET) thì cả hai chân INT0 và INT1 đều ở mức thấp

INTI

8051

P1.3 to

LED

Vcc

Page 170: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

171

Hình 3.19: Thời gian tối thiểu của ngắt theo mức thấp (XTAL = 11.0592MHz)

3. 6.3.4. Các ngắt theo sườn

Trong quá trình bật lại nguồn thì 8051 làm các chân INT0 và INT1 là các ngắt theo mức thấp. Để biến các chân này trở thành các ngắt theo sườn thì chúng ta phải viết chương trình cho các bít của thanh ghi TCON. Thanh thi TCON giữ các bít cờ IT0 và IT1 xác định chế độ ngắt theo sườn hay ngắt theo mức của các ngắt phần cứng IT0 và IT1 là các bít D0 và D2 của thanh ghi TCON tương ứng. Chúng có thể được biểu diễn như TCON.0 và TCON.2 vì thanh ghi TCON có thể đánh địa chỉ theo bít. Khi bật lại nguồn thì TCON.0 (IT0) và TCON.2 (IT1) đều ở mức thấp (0) nghĩa là các ngắt phần cứng ngoài của các chân INT0 và INT1 là ngắt theo mức thấp. Bằng việc chuyển các bít TCON.0 và TCON.2 lên cao qua các lệnh “SETB TCON.0” và “SETB TCON.2” thì các ngắt phần cứng ngoài INT0 và INT1 trở thành các ngắt theo sườn. Ví dụ, lệnh “SETB TCON.2” làm cho INT1 mà được gọi là ngắt theo sườn trong đó khi một tín hiệu chuyển từ cao xuống thấp được cấp đến chân P3.3 thì ở trường hợp này bộ vi điều khiển sẽ bị ngắt và bị cưỡng bức nhảy đến bảng véc tơ ngắt tại địa chỉ 0013H để thực hiện trình phục vụ ngắt. Tuy nhiên là với giải thiết rằng bít ngắt đã được cho phép trong thanh ghi IE.

Hình 3.20: Thanh ghi TCON

Bít TF1 hay TCON.7 là cờ tràn của bộ Timer1. Nó được lập bởi phần cứng khi bộ đếm/ bộ định thời 1 tràn, nó được xoá bởi phần cứng khi bộ xử lý chỉ đến trình phục vụ ngắt.

Bít TR1 hay TCON.6 là bít điều khiển hoạt động của Timer1. Nó được thiết lập và xoá bởi phần mềm để bật/ tắt Timer1.

Bít TF0 hay TCON.5 tương tự như TF1 dành cho Timer0.

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

D0 D7

Page 171: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

172

Bít TR0 hay TCON.4 tương tự như TR1 dành cho Timer0. Bít IE1 hay TCON.3 cờ ngắt ngoài 1 theo sườn. Nó được thiết lập bởi

CPU khi sườn ngắt ngoài (chuyển từ cao xuống thấp) được phát hiện. Nó được xóa bởi CPU khi ngắt được xử lý. Lưu ý: Cờ này không chốt những ngắt theo mức thấp.

Bít IT1 hay TCON.2 là bít điều khiển kiểu ngắt. Nó được thiết lập và xoá bởi phần mềm để xác định kiểu ngắt ngoài theo sườn xuống hay mức thấp.

Bít IE0 hay TCON.1 tương tự như IE1 dành cho ngắt ngoài 0. Bít IT0 hay TCON.0 tương tự như bít IT1 dành cho ngắt ngoài 0.

Ví dụ

Giả thiết chân P3.3 (INT1) được nối với một máy tạo xung, hãy viết một chương trình trong đó sườn xuống của xung sẽ gửi một tín hiệu cao đến chân P1.3 đang được nối tới đèn LED (hoặc một còi báo). Hay nói cách khác, đèn LED được bật và tắt cùng tần số với các xung được cấp tới chân INT1.

Lời giải:

ORG 0000H

LJMP MAIN

; - - Trình phục vụ ngắt ISR dành cho ngắt INT1 để bật đèn LED

ORG 0013H ; Nhảy đến địa chỉ của trình phục vụ ngắt INT1

SETB P1.3 ; Bật đèn LED (hoặc còi)

MOV R3, #225

BACK: DJNZ R3, HERE ; giữ đèn LED (hoặc còi) một lúc

CLR P1.3 ; Tắt đèn LED (hoặc còi)

RETI ; Quay trở về từ ngắt

; - - Bắt đầu chương trình chính

ORG 30H

SETB TCON.2 ; Chuyển ngắt INT1 về kiểu ngắt theo sườn xung

MOV IE, #10001B ; Cho phép ngắt ngoài INT1

HERE: SJMP HERE ; Dừng ở đây cho đến khi bị ngắt

Page 172: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

173

END

Chú ý rằng sự khác nhau duy nhất giữa ví dụ này và ví dụ ở mục 6.3.2 là ở trong hàng đầu tiên của MAIN khi lệnh “SETB TCON.2” chuyển ngắt INT1 về kiểu ngắt theo sườn. Khi sườn xuống của tín hiệu được cấp đến chân INT1 thì đèn LED sẽ bật lên một lúc. Đèn LED có thời gian sáng phụ thuộc vào độ trễ bên trong ISR của INT1. Để bật lại đèn LED thì phải có một sườn xung xuống khác được cấp đến chân P3.3. Điều này ngược với ví dụ mục 3.3.2. Trong ví dụ 3.3.2 do bản chất ngắt theo mức của ngắt thì đèn LED còn sáng chừng nào tín hiệu ở chân INT1 vẫn còn ở mức thấp. Nhưng trong ví dụ này để bật lại đèn LED thì xung ở chân INT1 phải được đưa lên cao rồi sau đó bị hạ xuống thấp để tạo ra một sườn xuống làm kích hoạt ngắt.

3.6.3.5. Trình mẫu ngắt theo sườn

Trong các ngắt theo sườn, nguồn ngoài phải giữ ở mức cao tối thiểu là một chu trình máy nữa để đảm bảo bộ vi điều khiển nhìn thấy được sự chuyển dịch từ cao xuống thấp của sườn xung.

Hình 3.21. Thời hạn xung tối thiểu để phát hiện ra các ngắt theo sườn xung với tần số XTAL = 11.0592MHz

Sườn xuống của xung được chốt bởi 8051 và được giữ bởi thanh ghi TCON. Các bít TCON.1 và TCON.3 giữ các sườn được chốt của chân INT0 và INT1 tương ứng. TCON.1 và TCON.3 cũng còn được gọi là các bít IE0 và IE1. Chúng hoạt động như các cờ “ngắt đang được phục vụ” (Interrupt-in-server). Khi một cờ “ngắt đang được phục vụ” bật lên thì nó báo cho thế giới thực bên ngoài rằng ngắt hiện nay đang được xử lý và trên chân INTn này sẽ không có ngắt nào được đáp ứng chừng nào ngắt này chưa được phục vụ xong. Cần phải nhấn mạnh các điểm dưới đây khi quan tâm đến các bít IT0 và IT1 của thanh ghi TCON.

1.085s 1.085s

1M

1M

Page 173: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

174

+ Khi các trình phục vụ ngắt ISR kết thúc (nghĩa là trong thanh ghi thực hiện lệnh RETI). Các bít này (TCON.1 và TCON.3) được xoá để báo rằng ngắt được hoàn tất và 8051 sẵn sàng đáp ứng ngắt khác trên chân đó. Để ngắt khác được nhận thì tín hiệu trên chân đó phải trở lại mức cao và sau đó nhảy xuống thấp để được phát hiện như một ngắt theo sườn.

+ Trong thời gian trình phục vụ ngắt đang được thực hiện thì chân INTn bị làm ngơ không quan tâm đến nó có bao nhiêu lần chuyển dịch từ cao xuống thấp. Trong thực tế nó là một trong các chức năng của lệnh RETI để xoá bít tương ứng trong thanh ghi TCON (bít TCON.1 và TCON.3). Nó báo cho ta rằng trình phục vụ ngắt sắp kết thúc. Vì lý do này mà các bít TCON.1 và TCON.3 được gọi là các cờ báo “ngắt đang được phục vụ” cờ này sẽ lên cao khi một sườn xuống được phát hiện trên chân INT và dừng ở mức cao trong toàn bộ quá trình thực hiện ISR. Nó chỉ bị xoá bởi lệnh RETI là lệnh cuối cùng của ISR. Do vậy, sẽ không cần đến các lệnh xoá bít này như “CLR TCON.1” hay “CLR TCON.3” trước lệnh RETI trong trình phục vụ ngắt đối với các ngắt cứng INT0 và INT1.

+ Các hai lệnh RET và RETI đều thực thi các hành vi giống nhau là lấy hai byte trên đỉnh ngăn xếp vào bộ đếm chương trình và đưa 8051 trở về nơi đó đã bỏ đi. Tuy nhiên, lệnh RETI còn thực thi một nhiệm vụ khác nữa là xoá cờ “ngắt đang được phục vụ” để báo rằng ngắt đã kết thúc và 8051 có thể nhập một ngắt mới trên chân này. Nếu ta dùng lệnh RET thay cho RETI như là lệnh cuối cùng của trình phục vụ ngắt như vậy là ta đã vô tình khoá mọi ngắt mới trên chân này sau ngắt đầu tiên vì trạng thái của chân báo rằng ngắt vẫn đang được phục vụ. Đây là trường hợp mà các cờ TF0, TF1, TCON.1 và TCON.3 được xoá bởi lệnh RETI.

3. 6.3.6. Một số điều bổ sung về thanh ghi TCON

a. Các bít IT0 và IT1

Các bít TCON.0 và TCON.2 được coi như là các bít IT0 và IT1 tương ứng. Đây là các bít xác định kiểu ngắt theo sườn xung hay theo mức xung của các ngắt phần cứng trên chân INT.0 và INT.1 tương ứng. Khi bật lại nguồn cả hai bít này đều có mức 0 để biến chúng thành ngắt theo tín hiệu mức thấp. Lập trình viên có thể điều khiển một trong số chúng lên cao để chuyển ngắt phần cứng bên ngoài thành ngắt theo ngưỡng. Trong một hệ thống dựa trên 8051 đã cho thì một khi ta đã đặt về 0 hoặc 1 thì các bít này sẽ không thay đổi vì người thiết kế đã cố định kiểu ngắt là ngắt theo sườn hay theo mức.

Page 174: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

175

b. Các bít IE0 và IE1

Các bít TCON.1 và TCON.3 còn được gọi là IE0 và IE1 tương ứng. Các bít này được 8051 dùng để bám kiểu ngắt theo sườn xung. Nói các khác là nếu IT0 và IT1 bằng 0 thì có nghĩa là các ngắt phần cứng là ngắt theo mức thấp, các bít IE0 và IE1 không dùng đến làm gì. Các bít IE0 và IE1 được 8051 chỉ dùng để chốt sườn xung từ cao xuống thấp trên các chân INT0 và INT1. Khi có chuyển dịch sườn xung trên chân INT0 (hay INT1) thì 8051 đánh dấu (bật lên cao) các bít IEx trên thanh ghi TCON nhảy đến bảng véc tơ ngắt và bắt đầu thực hiện trình phục vụ ngắt ISR. Trong khi 8051 thực hiện ISR thì không có một sườn xung nào được ghi nhận trên chân INT0 (hay INT1) để ngăn mọi ngắt trong ngắt. Chỉ trong khi thực hiện lệnh RETI ở cuối trình phục vụ ngắt ISR thì các bít IEx mới bị báo rằng một sườn xung cao xuống thấp mới trên chân INT0 (hay INT1) sẽ kích hoạt ngắt trở lại. Ta thấy rằng các bít IE0 và IE1 được 8051 sử dụng bên trong để báo có một ngắt đang được xử lý hay không. Nói cách khác là lập trình viên không phải quan tâm đến các bít này.

c.Các bít TR0 và TR1

Đây là những bít D4 và D6 (hay TCON.4 và TCON.6) của thanh ghi TCON. Các bít này được dùng để khởi động và dừng các bộ định thời Timer0 và Timer1 tương ứng. Vì thanh ghi TCON có thể đánh địa chỉ theo bít nên có thể sử dụng các lệnh “SETB TRx” và “CLR TRx” cũng như các lệnh “SETB TCON.4” và “CLR TCON.4”.

d.Các bít TF0 và TF1

Các bít này là D5 (TCON.5) và D7 (TCON.7) của thanh ghi TCON. Chúng được sử dụng bởi các bộ Timer0 và Timer1 tương ứng để báo rằng các bộ định thời bị tràn hay quay về không. Mặc dù ta đã dùng các lệnh “JNB TFx, đích” và “CLR TFx” nhưng chúng ta cũng không thể sử dụng các lệnh như “SETB TCON.5, đích” và “CLR TCON.5” vì TCON là thanh ghi có thể đánh địa chỉ theo bít.

3.6.4. Lập trình ngắt truyền thông nối tiếp

3.6.4.1. Các cờ RI và TI và các ngắt

Cờ ngắt truyền TI (Transfer Interrupt) được bật lên khi bít cuối cùng của khung dữ liệu, bít stop được truyền đi báo rằng thanh ghi SBUF sẵn sàng truyền byte kế tiếp. Trong trường hợp cờ RI (Receive Interrupt) thì nó được bật lên khi toàn bộ khung dữ liệu kể cả bít stop đã được nhận. Hay nói cách khác khi thanh ghi SBUF đã có một

Page 175: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

176

byte thì cờ RI bật lên báo rằng byte dữ liệu nhận được cần lấy đi cất vào nơi an toàn trước khi nó bị mất (bị ghi đè) bởi dữ liệu mới nhận được. Trong phương pháp thăm dò thì chúng ta phải đợi cho cờ (TI hay RI) bật lên và trong lúc chờ đợi thì ta không thể làm gì được cả. Còn trong phương pháp ngắt thì ta được báo khi 8051 đã nhận được một byte hoặc nó sẵn sàng chuyển (truyền) byte kế tiếp và ta có thể làm các công việc khác trong khi truyền thông nối tiếp đang được phục vụ.

Trong 8051 chỉ có một ngắt dành riêng cho truyền thông nối tiếp. Ngắt này được dùng cho cả truyền và nhận dữ liệu. Nếu bít ngắt trong thanh gi IE (là bít IE.4) được phép khi RI và TI bật lên thì 8051 nhận được ngắt và nhảy đến địa chỉ trình phục vụ ngắt dành cho truyền thông nối tiếp 0023H trong bảng véc tơ ngắt để thực hiện nó. Trong trình ISR này chúng ta phải kiểm tra các cờ TI và RI để xem cờ nào gây ra ngắt để đáp ứng một cách phù hợp.

Hình 3.22. Ngắt truyền thông có thể do hai cờ TI và RI gọi.

3.6.4.2 Sử dụng cổng COM nối tiếp trong 8051

Trong phần lớn các ứng dụng, ngắt nối tiếp chủ yếu được sử dụng để nhận dữ liệu và không bao giờ được sử dụng để truyền dữ liệu nối tiếp.

Ví dụ

Hãy viết chương trình trong đó 8051 đọc dữ liệu từ cổng P1 và ghi nó tới cổng P2 liên tục trong khi đưa một bản sao dữ liệu tới cổng COM nối tiếp để thực hiện truyền nối tiếp giả thiết tần số XTAL là 11.0592MHz và tốc độ baud là 9600.

Lời giải:

ORG 00H

LJMP MAIN

ORG 23H

RI TI 0023H

Page 176: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

177

LJMP SERIAL ; Nhảy đến trình phục vụ ngắt truyền thông nối tiếp

MAIN: MOV P1, # 0FFH ; Lấy cổng P1 làm cổng đầu vào

MOV TMOD, # 20h ; Chọn Timer1, chế độ 2 tự nạp lại

MOV TH1, # 0FDH ; Chọn tốc độ baud = 9600

MOV SCON, # 50H ; Khung dữ liệu: 8 bít dữ liệu, 1 stop à cho phép REN

MOV IE, # 10010000B ; Cho phép ngắt nối tiếp

SETB TR1 ; Khởi động Timer1

BACK: MOV A, P1 ; Đọc dữ liệu từ cổng P1

MOV SBUF, A ; Lấy một bản sao tới SBUF

MOV P2, A ; Gửi nó đến cổng P2

SJMP BACK ; ở lại trong vòng lặp

;

; --------------------------Trình phục vụ ngắt cổng nối tiếp

ORG 100H

SERIAL: JB TI, TRANS ; Nhảy đến cờ TI cao

MOV A, SBUF ; Nếu không tiếp tục nhận dữ liệu

CLR RI ; Xoá cờ RI vì CPU không làm điều này

RETI ; Trở về từ trình phục vụ ngắt

TRANS: CLR TI ; Xoá cờ TI vì CPU không làm điều này

RETI ; Trở về từ ISR

END

Trong vấn đề trên thấy chú ý đến vai trò của cờ TI và RI. Thời điểm một byte được ghi vào SBUF thì nó được đóng khung và truyền đi nối tiếp. Kết quả là khi bít cuối cùng (bít stop) được truyền đi thì cờ TI bật lên cao và nó gây ra ngắt nối tiếp được gọi khi bít tương ứng của nó trong thanh ghi IE được đưa lên cao. Trong trình phục vụ

Page 177: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

178

ngắt nối tiếp, ta phải kiểm tra cả cờ TI và cờ RI vì cả hai đều có thể gọi ngắt hay nói cách khác là chỉ có một ngắt cho cả truyền và nhận.

3.6.4.3 Xoá cờ RI và TI trước lệnh RETI

Lệnh cuối cùng trước khi trở về từ ISR là RETI là lệnh xoá các cờ RI và TI. Đây là điều cần thiết bởi vì đó là ngắt duy nhất dành cho nhận và truyền 8051 không biết được nguồn gây ra ngắt là nguồn nào, do vậy trình phục vụ ngắt phải được xoá các cờ này để cho phép các ngắt sau đó được đáp ứng sau khi kết thúc ngắt. Điều này tương phản với ngắt ngoài và ngắt bộ định thời đều được 8051 xoá các cờ. Các lệnh xoá các cờ ngắt bằng phần mềm qua các lệnh “CLR TI” và “CLR RI”.

3.6.5. Các mức ưu tiên ngắt trong 8051

3.6.5.1 Các mức ưu tiên trong quá trình bật lại nguồn

Khi 8051 được cấp nguồn thì các mức ưu tiên ngắt được gán theo bảng 3.18. Từ bảng này ta thấy ví dụ nếu các ngắt phần cứng ngoài 0 và 1 được kích hoạt cùng một lúc thì ngắt ngoài 0 sẽ được đáp ứng trước. Chỉ sau khi ngắt INT0 đã được phục vụ xong thì INT1 mới được phục vụ vì INT1 có mức ưu tiên thấp hơn. Trong thực tế sơ đồ mức ưu tiên ngắt trong bảng không có ý nghĩa gì cả mà một quy trình thăm dò trong đó 8051 thăm dò các ngắt theo trình tự cho trong bảng 3.18 và đáp ứng chúng một cách phù hợp.

Bảng 3.18: Mức ưu tiên các ngắt trong khi cấp lại nguồn.

Mức ưu tiên cao xuống thấp

Ngắt ngoài 0 INT0

Ngắt bộ định thời 0 TF0

Ngắt ngoài 1 INT1

Ngắt bộ định thời 1 TF1

Ngắt truyền thông nối tiếp (RI + TI)

3.6.5.2 Thiết lập mức ưu tiên ngắt với thanh ghi IP

Chúng ta có thể thay đổi trình tự trong bảng 3.18 bằng cách gán mức ưu tiên cao hơn cho bất kỳ ngắt nào. Điều này được thực hiện bằng cách lập trình một thanh ghi gọi là thanh ghi mức ưu tiên ngắt IP (Interrupt Priority).

Page 178: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

179

Hình 3.23: Thanh ghi mức ưu tiên ngắt IP, bít ưu tiên = 1 là mức ưu tiên cao, bít ưu tiên = 0 là mức ưu tiên thấp.

- Bít D7 và D6 hay IP.7 và IP.6 - chưa dùng. - Bít D5 hay IP.5 là bít ưu tiên ngắt Timer2 (dùng cho 8052) - Bít D4 hay IP.4 là bít ưu tiên ngắt cổng nối tiếp - Bít D3 hay IP.3 là bít ưu tiên ngắt Timer1 - Bít D2 hay IP.2 là mức ưu tiên ngắt ngoài 1 - Bít D1 hay IP.1 là mức ưu tiên ngắt Timer 0 - Bít D0 hay IP.0 là mức ưu tiên ngắt ngoài 0

Người dùng không được viết phần mềm ghi các số 1 vào các bít chưa dùng vì chúng dành cho các ứng dụng tương lai.

Trên hình 3.23 là các bít của thanh ghi này, khi bật lại nguồn thì thanh ghi IP chứa hoàn toàn các số 0 để tạo ra trình tự ưu tiên ngắt theo bảng 3.23. Để một ngắt nào đó mức ưu tiên cao hơn ta thực hiện đưa bít tương ứng lên cao.

Một điểm khác nữa cần được làm sáng tỏ là mức ưu tiên ngắt khi hai hoặc nhiều bít ngắt trong thanh ghi IP được đặt lên cao. Trong trường hợp này thì trong khi các ngắt này có mức ưu tiên cao hơn các ngắt khác chúng sẽ được phục vụ theo trình tự cho trong bảng 3.18.

3. 6.5.3 Ngắt trong ngắt

Điều gì xảy ra nếu 8051 đang thực hiện một trình phục vụ ngắt thuộc một ngắt nào đó thì lại có một ngắt khác được kích hoạt? Trong những trường hợp như vậy thì một ngắt có mức ưu tiên cao hơn có thể ngắt một ngắt có mức ưu tiên thấp hơn. Đây gọi là ngắt trong ngắt. Trong 8051 một ngắt ưu tiên thấp có thể bị ngắt bởi một ngắt có mức ưu tiên cao hơn chứ không bị ngắt bởi một ngắt có mức ưu tiên thấp hơn. Mặc dù tất cả mọi ngắt đều được chốt và gửi bên trong nhưng không có ngắt mức thấp nào được CPU quan tâm ngay tức khắc nếu 8051 chưa kết thúc phục vụ các ngắt mức cao.

3.6.5.4. Ngắt bằng phần mềm (Triggering)

Có nhiều lúc ta cần kiểm tra một trình phục vụ ngắt bằng con đường mô phỏng. Điều này có thể được thực hiện bằng các lệnh đơn giản để thiết lập các ngắt lên cao và

-- -- PT2 PS PT1 PX1 PT0 PX0

D0 D7

Page 179: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

180

bằng cách đó buộc 8051 nhảy đến bảng véc tơ ngắt. Ví dụ, nếu bít IE dành cho bộ Timer1 được bật lên 1 thì một lệnh như “SETB TF1” sẽ ngắt 8051 ngừng thực hiện công việc đang làm bất kỳ và buộc nó nhảy đến bảng véc tơ ngắt. Hay nói cách khác, ta không cần đợi cho Timer1 quay trở về 0 mới tạo ra ngắt. Chúng ta có thể gây ra một ngắt bằng các lệnh đưa các bít của ngắt tương ứng lên cao.

Page 180: Mục lục - ect.ictu.edu.vnect.ictu.edu.vn/attachments/article/215/KyThuatLapTrinhNhung- ngo... · Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI XỬ LÝ 8086 ... Lệnh ADC(Add

181

Tài liệu tham khảo

1) Văn Thế Minh, Kỹ thuật vi xử lý , NXB Giáo dục, 1997.

2) Đỗ Xuân Tiến, Kỹ thuật vi xử lý và lập trình assembly cho hệ vi xử lý, NXB Khoa học và kỹ thuật, 2000.

3) Giáo trình lập trình hợp ngữ và máy vi tính IBM – PC, NXB Giáo dục, 1998.

4) Tống Văn On, Hoàng Đức Hải, Họ vi điều khiển 8051, Nhà xuất bản khoa học kỹ thuật.