Chương 3 - Các lệnh nhảy, vòng lặp và lệnh gọi pptx

12 331 1
Chương 3 - Các lệnh nhảy, vòng lặp và lệnh gọi pptx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

chương Các lệnh nhảy, vòng lặp lệnh gọi Trong chuỗi lệnh cần thực thường có nhu cần cần chuyển điều khiển chương trình đến vị trí khác Có nhiều lệnh để thực điều 8051, chương ta tìm hiểu lệnh chuyển điều khiển có hợp ngữ 8051 lệnh sử dụng cho vòng lặp, lệnh nhảy có điều khiển, lệnh gọi cuối mô tả chương trình giữ chậm thời gian 3.1 Vòng lặp lệnh nhảy 3.1.1 Tạo vòng lặp 8051 Qúa trình lặp lại chuỗi lệnh với số lần định gọi vòng lặp Vòng lặp hoạt động sử dụng rộng rÃi mà vi sử lý thực Trong 8051 hoạt động vòng lặp thực hiƯn bëi lƯnh “DJNZ ghi, nh·n” Trong lƯnh nµy ghi giảm xuống, không không nhảy đến địa đích tham chiếu nhÃn Trước bắt đầu vòng lặp ghi nạp với đếm cho số lần lặp lại Lưu ý rằng, lệnh việc giảm ghi định để nhảy kết hợp vào lệnh đơn Ví dụ 3.1: Viết chương trình để: a) xoá ACC sau b) cộng vào ACC 10 lần Lời giải: BACK: MOV MOV ADD DJNZ MOV A, #0 R2, #10 A, #10 R2, AGAIN R5, A ; Xo¸ ACC, A = ; Nạp đếm R2 = 10 ; Cộng 03 vào ACC ; Lặp lại R2 = (10 lần) ; Cắt A vào ghi R5 Trong chương trình ghi R2 sử dụng đếm Bộ đếm lúc đầu đặt 10 Mỗi lần lặp lại lệnh DJNZ giảm R2 không nhảy đến địa đích gắn với nhÃn AGAIN Hoạt động lặp lại tiếp tục R2 trở không Sau R2 = thoát khỏi vòng lặp thực đứng trường hợp lÖnh “MOV R5, A” L­u ý r»ng lÖnh DJNZ ghi ghi ghi R0 - R7 Bộ đếm ngăn nhớ RAM nh­ ta sÏ thÊy ë ch­¬ng VÝ dơ 3.2: Số lần cực đại mà vòng lặp ví dụ 3.1 lặp lại bao nhiêu? Lời giải: Vì ghi R2 chứa số đếm ghi bit nên chứa giá trị cực đại FFH hay 155 Do số lần lặp lại cực đại mà vòng lặp vÝ dơ 3.1 cã thĨ thùc hiƯn lµ 256 3.2.1 Vòng lặp bền vòng lặp Như trình bày ví dụ 3.2 số đếm cực đại 256 Vậy điều xảy ta muốn lặp hành động nhiều 256 lần? Để làm điều ta sử dụng vòng lặp bên vòng lặp gọi vòng lặp lồng (Nested Loop) Trong vòng lặp lồng ta sử dụng ghi để giữ số đếm Xét ví dụ 3.3 Ví dụ 3.3: HÃy viết chương trình a) nạp ghi ACC với giá trị 55H b) bù ACC 700 lần Lời giải: Vì 700 lớn 256 (là số cực đại mà ghi vó thể chứa được) nên ta phải dùng hai ghi để chứa số đếm Đoạn mà trình bày cách sử dụng hai ghi R2 R3 để chøa sè ®Õm NEXT: AGAIN: ` MOV MOV MOV CPL DJNZ DJNZ A, #55H R3, #10 R2, #70 A R2, AGAIN R3, NEXT ; N¹p A = 55H ; N¹p R3 = 10 số đếm vòng lặp ; Nạp R2 = 70 số đếm vòng lặp ; Bù ghi A ; Lặp lại 70 lần (vòng lặp trong) Trong chương trình ghi R2 dùng để chứa số đếm vòng lặp Trong lệnh DJNZ R2, AGAIN R2 = thẳng xuống lệnh JNZ R3, NEXT thực Lệnh ép CPU nạp R2 với số đếm 70 vòng lặp bắt đầu lại trình tiếp tục R3 trở không vòng lặp kết thúc 3.1.3 Các lệnh nhảy có điều kiện Các lệnh nhảy có điều kiện 8051 tổng hợp bảng 3.1 Các chi tiết lệnh cho phụ lục AppendixA Trong b¶ng 3.1 l­u ý r»ng mét sè lƯnh nh­ JZ (nhảy A = 0) JC (nhảy có nhớ) nhảy điều kiện định thoả mÃn Kế tiếp ta xét số lệnh nhảy có điều kiện với Ví dụ minh hoạ sau a- LƯnh JZ (nh¶y nÕu A = 0) Trong lệnh nội dung ghi A kiểm tra Nếu không nhảy đến địa đích Ví dụ xét đoạn mà sau: MOV JZ MOV JZ OVER A, R0 OVER A, R1 OVER ; Nạp giá trị R0 vào A ; Nhảy đến OVER A = ; Nạp giá trị R1 vào A ; Nhảy đến OVER A = Trong chương trình R0 R1 có giá trị nhảy đến địa chØ cã nh·n OVER L­u ý r»ng lÖnh JZ chØ sử dụng ghi A Nã chØ cã thÓ kiÓm tra xem ghi A có không không không áp dụng cho ghi khác Quan trọng ta thực lệnh số học đếm giảm để sử dụng lệnh JNZ ví dụ 3.4 Ví dụ 3.4: Viết chương trình để xác định xem R5 có chứa giá trị không? Nếu nạp cho giá trị 55H Lêi gi¶i: MOV JNZ MOV A, R5 NEXT R5, #55H ; Sao nội dung R5 vào A ; Nhảy ®Õn NEXT nÕu A kh«ng b»ng ; NEXT: b- Lệnh JNC (nhảy nhớ, cờ CY = 0) Trong lệnh bit cờ nhớ ghi cờ PSW dùng để thực định nhảy Khi thực lệnh JNC nhÃn xử lý kiểm tra cờ nhớ xem có bật không (CY = 1) Nếu không bật CPU bắt đầu nạp thực lệnh từ địa nhÃn Nếu cờ CY = không nhảy thực lệnh JNC Cần phải lưu ý có lệnh “JC nh·n” Trong lƯnh JC th× nÕu CY = nhảy đến địa đích nhÃn Ta xét ví dụ lệnh ứng dụng chương sau Ngoài có lệnh JB (nhảy bit có mức cao) JNB (nhảy bit có mức thấp) Các lệnh trình bày chương nói thao tác bit Bảng 3.1: Các lệnh nhảy có điều kiÖn LÖnh JZ JNZ DJNZ CJNE A, byte CJNE re, # data JC JNC JB JNB JBC Hoạt động Nhảy A = Nhảy A Giảm nh¶y nÕu A = Nh¶y nÕu A byte Nh¶y nÕu Byte data Nh¶y nÕu CY = Nh¶y nÕu CY = Nh¶y nÕu bit = Nh¶y nÕu bit = Nhảy bit = xoá Ví dụ 3.5: HÃy tìm tổng giá trị 79H, F5H E2H Đặt vào ghi R0 (byte thấp) R5 (byte cao) Lời giải: MOV MOV ADD JNC INC N-1: ADD JNC INC N-2: ADD JNC INC OVER: MOV A, #0 R5, A A #79H N-1 R5 ; Xo¸ ghi A = ; Xoá R5 ; Cộng 79H vào A (A = + 79H = 79H) ; NÕu kh«ng cã nhí cộng ; Nếu CY = 1, tăng R5 A, #0F5H N-2 R5 A, #0E2H OVER R5 R0, A ; Céng F5H vµo A (A = 79H + F5H = 6EH) CY = ; Nhảy CY = ; Nếu CY = tăng R5 (R5 = 1) ; Céng E2H vµo A (A = GE + E2 = 50) CY = ; Nhảy CY = ; Nếu CY = tăng R5 ; Bây R0 = 50H R5 = 02 c- Tất lệnh nhảy có điều kiện phép nhảy ngắn Cần phải lưu ý tất lệnh nhảy có điều kiện phép nhảy ngắn, có nghĩa địa đích phải nằm khoảng -127 đến +127 byte nội dung đếm chương trình PC 3.1.4 Các lệnh nhảy không điều kiện Lệnh nhảy không điều kiện phép nhảy điều khiển truyền không điều kiện đến địa đích Trong 8051 có hai lệnh nhảy không điều kiện là: LJMP - nhảy xa SJMP - nhảy gần a- Nhảy xa LJMP: Nhảy xa LJMP lệnh byte byte mà lệnh hai byte lại địa 16 bit đích Địa đích 02 byte có phép phép nhảy đến vị trí nhớ khoảng 0000 - FFFFH HÃy nhớ rằng, đếm chương trình 8051 16 bit, cho không gian địa 64k byte, nhớ chương trình ROM chíp lớn 8051 có 4k byte ROM chíp cho không gian chương trình, byte quý giá Vì lý mà có lệnh nhảy gần SJMP chØ cã byte so víi lƯnh nh¶y xa LZ0MP dài byte Điều tiết kiệm ®­ỵc mét sè byte bé nhí rÊt nhiỊu øng dụng mà không gian nhớ có hạn hẹp b- Lệnh nhảy gồm SJMP Trong byte byte mà lệnh byte thứ hai tương đối địa đích Đích tương đối phạm vi 00 - FFH chia thành lệnh nhảy tới nhảy lùi: Nghĩa -128 ®Õn +127 byte cđa bé nhí t­¬ng ®èi so víi địa thời đếm chương trình Nếu lệnh nhảy tới địa đích nằm khoảng 127 byte từ giá trị thời đếm chương trình Nếu địa đích phía sau nằm khoảng -128 byte từ giá trị hành PC 3.1.5 Tính toán địa lệnh nhảy gần Ngoài lệnh nhảy gần SJMP tất lệnh nhảy có điều kiện JNC, JZ DJNZ lệnh nhảy gần thực tế chúng lệnh byte Trong lệnh byte thứ mà lệnh, byte thứ hai địa tương đối Địa đích tương đối so với giá trị đếm chương trình Để tính toán địa đích byte thứ hai cộng vào ghi PC lệnh đứng sau lệnh nhảy Để hiểu điều hÃy xét ví dụ 3.6 VÝ dơ 3.6: Sư dơng tƯp tin liƯt kª d­íi hÃy kiểm tra việc tín toán địa nhảy vỊ tr­íc 01 02 03 04 05 06 07 08 09 10 11 12 0000 0000 0002 0004 0006 0007 0008 0009 000B 000D 000E 000F 7800 7455 6003 08 04 04 2477 5005 E4 F8 F9 AGAIN: INC NEXT: ORG MOV MOV JZ NIC INC ADD JNC CLR MOV MOV A 0000 R0, #0 A, #55H NEXT R0 A A, #77h OVER A R0, A R1, A 13 14 15 16 17 18 0010 0011 0012 0013 0015 0017 FA FB 2B 50F2 80FE OVER: HERE: MOV MOV ADD JNC SJMP END R2, A R3, A A, R3 AGAIN SHERE Lời giải: Trước hết lưu ý lệnh JZ JNC lệnh nhảy trước Địa đích lệnh nhảy trước tính toán cách cộng giá trị PC lệnh sau vào byte thứ hai lệnh nhảy gần gọi địa tương đối dòng 04 lệnh JZ NEXT có mà lệnh 60 toán hạng 03 địa 0004 0005 03 địa tương đối, tương đối so với địa lệnh là: INC R0 0006 Bằng việc cộng 0006 vào địa đích nhÃn NEXT 0009 tạo Bằng cách tương tự dòng lệnh JNC OVER có mà lệnh toán hạng 50 05 50 mà lệnh 05 địa tương đối Do vậy, 05 cộng vào OD địa lệnh CLA A đứng sau lệnh JNC OVER cho giá trị 12H địa nhÃn OVER Ví dụ 3.7: HÃy kiểm tra tính toán địa lệnh nhảy lùi ví dụ 3.6 Lời giải: Trong danh sách liệt kê chương trình lệnh JNC AGAIN có mà lệnh 50 địa tương đối F2H Khi địa tương đối F2H cộng vào 15H địa lệnh đứng lệnh nhảy ta có 15H + F2H = 07 (và phần nhớ bỏ đi) Để ý 07 địa nhÃn AGAIN Và hÃy xét lệnh SJMP HERE có mà lệnh 80 địa tương đối FE giá trị PC lệnh 0017H cộng vào địa tương đối FEH ta nhận 0015H địa nhÃn HERE (17H + FEH = 15H) phần nhớ bỏ ®i) L­u ý r»ng FEH lµ -2 vµ 17h + (-2) = 15H Về phép cộng số âm bàn chương 3.1.6 Tính toán địa đích nhảy lùi Trong trường hợp nhảy tới giá trị thay số dương khoảng từ đến 127 (00 đến 7F dạng Hex) lệnh nhảy lùi giá trị thay số âm nằm khoảng từ đến -128 giải thích ví dụ 3.7 Cần phải nhấn mạnh rằng, SJMP nhảy tới hay nhảy lùi lệnh nhảy địa địa đích không lớn -128 đến +127 byte so với địa gắn liền với lệnh đứng sau lệnh SJMP Nếu có nỗ lực vi phạm luật hợp ngữ tạo lỗi báo lệnh nhảy phạm vi 3.2 Các lệnh gọi CALL Một lệnh chuyển điều khiển khác lệnh CALL dùng để gọi chương trình Các chương trình thường sử dụng để thực thi công việc cần phải thực thường xuyên Điều làm cho chương trình trở nên có cấu trúc việc tiết kiệm thêm không gian bé nhí Trong 8051 cã lƯnh ®Ĩ gäi ®ã là: Gọi xa CALL gọi tuyệt đối ACALL mà định sử dụng lệnh phụ thuộc vào ®Þa chØ ®Ých 3.2.1 LƯnh gäi xa LCALL Trong lƯnh byte byte mà lệnh, hai byte sau dùng cho địa chương trình đích Do LCALL dùng để gọi chương trình vị trí phạm vi 64k byte, không gian địa 8051 Để đảm bảo sau thực chương trình gọi để 8051 biết chỗ quay trở tự động cất vào ngăn xếp địa lệnh đứng sau lệnh gọi LCALL Khi chương trình gọi, điều khiển chuyển đến chương trình xử lý cất đếm chương trình PC vào ngăn xếp bắt đầu nạp lệnh vào vị trí Sau kết thúc thực chương trình lệnh trở RET chuyển điều khiển cho nguồn gọi Mỗi chương trình cần lệnh RET lệnh cuối (xem ví dụ 3.8) Các điểm sau cần phải lưu ý từ ví dụ 3.8 Lưu ý đến chương trình DELAY thực lệnh LCALL DELAY địa lệnh kế MOV A, #0AAH đẩy vào ngăn xếp 8051 bắt đầu thực lệnh địa 300H Trong chương trình DELAY, lúc đầu đếm R5 đặt giá trị 255 (R5 = FFH) Do vậy, vòng lặp lặp lại 256 lần Khi R5 trở điều khiển rơi xuống lệnh quay trở RET mà kéo địa từ ngăn xếp vào đếm chương trình tiếp tục thực lệnh sau lệnh gọi CALL Ví dụ 3.8: HÃy viết chương trình để chốt tất bit cổng P1 cách gửi đến giá trị 55H AAH liên tục HÃy đặt độ trễ thời gian lần xuất liệu tới cổng P1 Chương trình sử dụng để kiểm tra cổng 8051 chương Lời giải: ORG 0000 MOV A, #55H ; Nạp A với giá trị 55H MOV P1, A ; Gưi 55H ®Õn cỉng P1 LCALL DELAY ; T¹o trƠ thêi gian MOV A, #0AAH ; N¹p A với giá trị AAH MOV P1, A ; Gửi AAH đến cổng P1 LCALL DELAY ; Giữ chậm SJMP BACK ; Lặp lại vô tận ; - Đây chương trình tạo độ trễ thời gian ORG 300H ; Đặt chương trình trễ thời gian địa 300H DELAY: MOV R5, #00H ; Nạp đếm R5 = 255H (hay FFH) AGAIN: DJNZ R5, AGAIN ; Tiếp tục R5 không RET ; Trả điều khiển nguồn gọi (khi R5 = 0) END ; Kêt thúc tệp tin hợp ngữ BACK: L­ỵng thêi gian trƠ vÝ dơ 8.3 phơc thc vào tần số 8051 Cách tính xác thời gian giải thích chương Tuy nhiên ta tăng thời gian độ trễ cách sử dụng vòng lặp lồng DELAY: NEXT: AGAIN: MOV MOV DJNZ DJNZ R4, #255 R5, #255 R5, AGAIN R4, NEXT ; Vòng lặp lồng giữ chËm ; N¹p R4 = 255 (FFH d¹ng hex) ; Nạp R5 = 255 (FFH dạng hex) ; Lặp lại RT = ; Giảm R4 ;Tiếp tục nạp R5 R4 = RET ; Trë vỊ (khi R4 = 0) 3.2.2 LƯnh gäi CALL vai trò ngăn xếp Ngăn xếp trỏ ngăn xếp ta nghiên cứu chương cuối Để hiểu tầm quan trọng ngăn xếp vi điều khiển khảo sát nội dung ngăn xếp trỏ ngăn xếp ví dụ 8.3 Điều trình bày ví dụ 3.9 Ví dụ 3.9: HÃy phân tích nội dung ngăn xếp sau thực lệnh LCALL 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 0000 0000 0002 0004 0007 0009 000B 000E 0010 0010 0300 0300 0300 0302 0304 0305 7455 F590 120300 74AA F590 120300 80F0 7DFF DDFE 22 OR6 BACK: MOV A, #55H MOV P1, A LCALL DELAY MOV A, #0AAH MOV P1, A LCALL DELAY SJMP BACK ; Nạp A với giá trị 55H ; Gửi 55H tới cỉng P1 ; T¹o trƠ thêi gian ; N¹p A với giá trị AAH ; Gửi AAH tới cổng P1 ; T¹o trƠ thêi gian ; TiÕp tơc thùc hiƯn ; Đây chương trình giữ chËm MOV 300H DELAY: MOV R5, #FFH ; N¹p R5 = 255 AGAIN:DJNZ R5, AGAIN ; Dừng RET ; Trë vỊ ngn gäi END ; KÕt thóc n¹p tin hợp ngữ Lời giải: Khi lệnh LCALL thực địa lệnh MOV A, #0AAH cất vào ngăn xếp Lưu ý byte thÊp vµo tr­íc vµ byte cao vµo sau LƯnh ci chương trình gọi phải lệnh trở RET để chuyển CPU kéo (POP) byte đỉnh ngăn xếp vào đếm chương trình PC tiếp tục thực lệnh địa 07 Sơ đồ bên khung ngăn xếp sau lần gọi LCALL 0A 09 08 SP = 00 07 09 3.2.3 Sư dơng lƯnh PUSH vµ POP chương trình Khi gọi chương trình ngăn xếp phải bám vị trí mà CPU cần trở Sau kết thúc chương trình lý phải cẩn thận thao tác với nội dung ngăn xếp Nguyên tắc số lần đẩy vào (PUSH) kéo (POP) phải phù hợp chương trình gọi vào Hay nói cách khác lệnh PUSH phải có lệnh POP Xem ví dụ 3.10 3.2.4 Gọi chương trình Trong lập trình hợp ngữ thường có chương trình nhiều chương trình mà chúng gọi từ chương trình Điều cho phép ta tạo chương trình mô-đun riêng biệt Mỗi mô-đun kiểm tra tách biệt sau kết hợp với với chương trình Quan trọng chương trình lớn mô-đun phân cho lập trình viên khác nhằm rút ngắn thời gian phát triển Ví dụ 3.10: Phân tích ngăn xếp lệnh LCALL đoạn mà 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 0000 0000 7455 0002 F590 0004 7C99 0006 7D67 0008 120300 000B 74AA 000D F590 000F 120300 0012 80EC 0014 0300 0300 C004 0302 C005 0304 7CFF 0306 7DFF 0308 DDFE 030A DCFA 030C D005 030E D004 0310 22 0311 ORG MOV A, #55H ; N¹p A với giá trị 55H MOV P1, A ; Gửi 55H cæng P1 MOV R4, #99H MOV R5, #67H LCALL DELAY ; Tạo giữ chậm thời gian MOV A, #0AAH ; N¹p A víi AAH MOV P1, A ; Gưi AAH cæng P1 LCALL DELAY SJMP BACK ; TiÕp tục thực ; Đây chương trình DELAY ORG 300H PUSH ; Đẩy R4 vào ngăn xếp PUSH ; Đẩy R5 vào ngăn xếp MOV R4, 00FH ; G¸n R4 = FFH MOV R5, #00FH ; G¸n R5 = 255 DJNZ R5, AGAIN DJNZ R4, NEXT POP ; Kéo đỉnh ngăn xếp vào R5 POP ; Kéo đỉnh ngăn xếp vào R4 RET ; Trë vỊ ngn gäi END ; KÕt thóc tƯp tin hợp ngữ BACK: DELAY NEXT: AGAIN: Lời giải: Trước hết lưu ý lệnh PUSH POP ta phải xác định địa trực tiếp ghi đẩy vào, kéo từ ngăn xếp Dưới sơ đồ khung ngăn xếp Sau lÖnh LCALL thø nhÊt 0B 0A 09 00 PCH 08 0B PCL Sau lÖnh PUSH 0B 0A 09 0B 99 00 0B R4 PCH PCL 0B 0A 09 08 Sau lÖnh POSH 67 R5 09 R4 00 PCL 0B PCL Cần phải nhấn mạnh việc sử dụng LCALL địa đích chương trình phạm vi 64k byte không gian nhớ 8051 Điều không áp dụng cho tất lệnh gọi CALL chẳng hạn ACALL đây: ; MAIN program calling subroutines ORG MAIN: LCALL SUBR-1 LCALL SUBR-2 LCALL SUBR-3 HERE: SJMP ; - end of MAIN ; SUBR-1l RET ; - end of subroutinel ; SUBR-1l RET ; - end of subroutinel ; SUBR-1l RET ; - end of subroutinel END MAIN ; end of the asm file Hình 3.1: Chương trình hợp ngữ 8051 có gọi chương trình 3.2.5 Lệnh gọi tuyệt đối ACALL (Absolute call) Lệnh ACALL lệnh byte khác víi lƯnh LCALL dµi byte Do ACALL chØ cã byte nên địa đích chương trình phải nằm khoảng 2k byte địa có 11bit byte sử dụng cho địa Không có khác biệt ACALL LCALL khái niệm cất đếm chương trình vào ngăn xếp hay chức lệnh trở RET Sự khác địa đích lệnh LCALL nằm đâu phạm vi 64k byte không gian địa 8051, địa lệnh ACALL phải n»m kho¶ng byte Trong nhiỊu biÕn thÕ cđa 8051 hÃng cung cấp ROM chíp có 1k byte Trong trường hợp th× viƯc sư dơng ACALL thay cho LCALL cã thĨ tiết kiệm số byte nhớ không gian ROM chương trình Ví dụ 3.11: Một nhà phát triĨn sư dơng chÝp vi ®iỊu khiĨn Atmel AT89C1051 cho sản phẩm Chíp có 1k byte ROM Flash chíp Hỏi lệnh LCALL ACALL lệnh hữu ích lập trình cho chíp Lời giải: Lệnh ACALL hữu ích lệnh byte Nó tiết kiệm byte lần gọi sử dụng Tất nhiên, việc sư dơng c¸c lƯnh gän nhĐ, chóng ta cã thĨ lập trình hiệu cách có hiểu biết chi tiết tất lệnh hỗ trợ vi xử lý đà cho sử dụng chúng cách khôn ngoan Xét ví dụ 3.12 Ví dụ 3.12: HÃy viết lại chương trình ví dụ 3.8 cách hiệu mà bạn có thể: Lời giải: ORG MOV A, #55H ; Nạp Avới giá trị 55H BACK: MOV P1, A ; Xuất giá trị A cổng P1 ACALL DELAY ; Giữ chậm CPL A ; Bù thành ghi A SJMP BACK ; Tiếp tục thực vô hạn ; Đây chương trình giữ chËm DELAY DELAY: MOV R5, #0FFH ; N¹p R5 = 255 (hay FFH) làm cho đếm AGAIN: DJNZ R5, AGAIN ; Dừng R5 = RET ; Trë vỊ END ; KÕt thóc 3.3 Tạo tính toán thời gian giữ chậm 3.3.1 Chu kỳ máy: Đối với CPU để thực lệnh chu kỳ đồng hồ coi nh­ c¸c chu kú m¸y Phơ lơc AppendixA.2 cung cÊp danh sách liệt kê lệnh 8051 chu kỳ máy chúng Để tính toán độ trễ thời gian, ta sử dụng danh sách liệt kê Trong họ 8051 độ dài chu kỳ máy phụ thuộc vào tần số dao động thạch anh nối vào hệ thống 8051 Bộ dao động thạch anh với mạch điện chip cung cấp xung đồng hồ cho CPU 8051 (xem chương 4) Tần số tinh thể thạch anh nối tới họ 8051 dao động khoảng 4MHz đến 30 MHz phụ thuộc vào tốc độ chíp nhà sản xuất Thường xuyên dao động thạch anh tần số 10.0592MHz sử dụng để làm cho hệ 8051 t­¬ng thÝch víi cỉng nèi tiÕp cđa PC IBM (xem chương 10) Trong 8051, 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 tần số tinh thể thạch anh, sau lấy giá trị nghịch đảo nh­ chØ vÝ dô 3.13 VÝ dô 3.13: Đoạn mà trình bày tần số thạch anh cho hệ thống dựa 8051 khác HÃy tìm chu kỳ máy trường hợp: a) 11.0592MHz b) 16MHz c) 20MHz Lời giải: a) 11.0592/12 = 921.6kHz; Chu kỳ máy 1/921.6kHz = 1.085ms (micro giây) b) 16MHz/12 = 1.333MHz; Chu kú m¸y MC = 1/1.333MHz = 0.75ms c) 20MHz/12 = 1.66MHz Þ MC = 1/1.66MHz = 0.60ms VÝ dơ 3.14: §èi víi mét hƯ thèng 8051 có 11.0592MHz hÃy tìm thời gian cần thiết để thực lệnh sau a) MOV R3, #55 d) LJMP e) SJMP b) DEC R3 f) NOP g) MUL AB c) DJNZ R2 đích Lời giải: Chu kỳ máy cho hệ thống 8051 có tần số đồng hồ 11.0592MHz Là 1.085ms đà tính ví dụ 3.13 Bảng A-1 phụ lục Appendix A trình bày số chu kỳ máy lệnh Vậy ta cã: LÖnh (a) MOV (b) DEC (c) DJNZ (d) LJMP (e) SJMP (f) NOP (g) MUL Chu kú m¸y 1 2 R3, #55 R3 R2, target AB Thêi gian thùc hiÖn ´ 1.085 ms = 1.085 ms ´ 1.085 ms = 1.085 ms ´ 1.085 ms = 2.17 ms ´ 1.085 ms = 2.17 ms ´ 1.085 ms = 2.17 ms ´ 1.085 ms = 1.085 ms 1.085 ms = 4.34 ms 3.3.2 Tính toán độ trễ Như đà trình bày đây, chương trình giữ chậm gồm có hai phần: (1) thiết lập đếm (2) vòng lặp Hầu hết thời gian giữ chậm thực thân vòng lặp trình bày ví dụ 3.15 Ví dụ 3.15: HÃy tìm kích thước thời gian giữ chậm chương trình sau, tần số giao động thach anh lµ 11.0592MHz A, #55H P1, A ACALL DELAY CPL A SJMP AGAIN ; Time delay DELAY: MOV R3, #200 HERE : DJNZ R3, HERE RET AGAIN: MOV MOV Lêi gi¶i: Tõ b¶ng A-1 cđa phơ lơc Appendix A ta cã c¸c chu kú m¸y cho lệnh chương trình giữ chậm lµ: DELAY: HERE : MOV DJNZ RET R3, #200 R3, HERE Do vËy tỉng thêi gian gi÷ chËm lµ [(200 ´ 2) + + 1] ´ 1.085 = 436.17ms Thông thường ta tính thời gian giữ chậm dựa lệnh bên vòng lặp bỏ qua chu kỳ đồng hồ liên quan với lệnh vòng lặp Trong ví dụ 3.15 giá trị lớn mà R3 chứa 255, cách tăng độ trễ sử dụng lệnh UOP (không làm gì) vòng lặp để tiêu tốn thời gian cách đơn giản Điều ví dụ 3.16 Ví dụ 3.16: HÃy tìm độ trễ thời gian cho chương trình sau Giả thiết tần số dao động thạch anh lµ 11.0592MHz DELAY: MOV HERE : NOP NOP NOP NOP DJNZ R3, #250 R3, HERE RET Sè chu kú máy 1 1 Lời giải: Thời gian trễ bên vòng lặp HERE [250 (1 + + + + + 2)] 1.0851ms = 1627.5ms Cộng thêm hai lệnh vòng lặp ta có 1627.5ms 1.085ms = 1629.67ms 3.3.3 Độ trễ thời gian vòng lặp vòng lặp Một cách khác để nhận giá trị từ độ trễ lớn sử dụng vòng lặp bên vòng lặp gọi vòng lặp lồng Xem ví dụ 3.17 Ví dụ 3.17: §èi víi mét chu kú m¸y 1.085ms h·y tÝnh thêi gian giữ chậm chương trình sau: DELAY: AGAIN: HERE: MOV MOV NOP NOP DJNZ DJNZ RET R2, #200 R3, #250 R3, HERE R2, AGAIN chu kú m¸y 1 1 2 Lời giải: Đối với vòng lặp HERE ta có (4 250) 1.085ms = 1085ms Vòng lặp AGAIN lặp vòng lặp HERE 200 lần, thời gian trễ 200 1085ms 217000ms, nên ta không tính tổng phí Tuy nhiên, lệnh MOV R3, #250 DJNZ R2, AGAIN đầu cuối vòng lặp AGAIN cộng (3 200 1.085ms) = 651ms vào thời gian trễ kết ta cã 217000 + 651 = 217651ms = 217.651 miligi©y cho tổng thời gian trễ liên quan đến chương trình giữ chậm DELAY nói Lưu ý rằng, trường hợp vòng lặp lồng vòng lặp giữ chậm khác thời gian xấp xỉ gần dúng ta bỏ qua lệnh đầu cuối chương trình ... 0008 12 030 0 000B 74AA 000D F590 000F 12 030 0 0012 80EC 0014 030 0 030 0 C004 030 2 C005 030 4 7CFF 030 6 7DFF 030 8 DDFE 030 A DCFA 030 C D005 030 E D004 031 0 22 031 1 ORG MOV A, #55H ; N¹p A víi giá trị... SUBR-2 LCALL SUBR -3 HERE: SJMP ; - end of MAIN ; SUBR-1l RET ; - end of subroutinel ; SUBR-1l RET ; - end of subroutinel ; SUBR-1l RET ; - end of subroutinel... hợp chương trình gọi vào Hay nói cách khác lệnh PUSH phải có lệnh POP Xem ví dụ 3. 10 3. 2.4 Gọi chương trình Trong lập trình hợp ngữ thường có chương trình nhiều chương trình mà chúng gọi từ chương

Ngày đăng: 28/07/2014, 10:23

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan