Trong thực tế viết chương trình điều khiển cho một số thiết bị ta hay tạo một khoảng thời gian trễ.
Ví dụ: sự kiện 1
Chờ một khoảng thời gian sự kiện 2
Vì vậy địi hỏi ta phải có một chương trình con để tạo thời gian trễ này. Ý tưởng để có một chương trình con tạo thời gian trễ là:
Muốn tạo ra một khoảng thời gian trễ n (micro giây) ta tạo một chương trình mà thời gian để thực hiện xong nó là n (micro giây)
Ta đã biết: một lệnh thực hiện trong 1 chu kì lệnh (trừ một số lệnh đặc biệt), một chu kì lệnh tính theo đơn vị micro giây.
Ví dụ: nếu dùng bộ dao động ngoài sử dụng thạch anh có tần số fosc=4Mhz Suy ra, chu kì lệnh= 4*chu kì xung= 4/tần số xung= 4/4Mhz=1 mico giây
Như vậy để tạo ra khoảng thời gian n micro giây đơn giản ta tạo ra một chương trình mà thời gian thực hiện nó là n chu kì lệnh
Ví dụ: để tạo thời gian trễ 20 mico giây Ta dùng 20 lệnh NOP:
NOP NOP -------
NOP
Tuy nhiên cách làm đó thì hơi thủ cơng, và ta cũng khơng có thời gian để mà đánh n dịng NOP như vậy (ví dụ: n=200.000!!!!)
Ta phải dùng các lệnh khác với thuật toán phức tạp hơn. Ta đi vào từng bước khảo sát phương pháp này.
3.10.1 Vịng 1:
decfsz vong1,F goto $-1
Trong đó vong1 là biến đã được tạo ra trước đó Ta tính thử thời gian thực hiện 2 lệnh trên:
Như đã bàn ở các mục trước lệnh goto mất 2 chu kì lệnh, lệnh DECFSZ f,z mất 1 chu kì lệnh khi f #0 và mất 2 chu kì lệnh khi f=0
Giả sử ban đầu: Vong1=2.
Lần 1: decfsz vong1,f -> vong1=1 -> vong1#0 (mất 1 chu kì lệnh) Goto $-1 (mất 2 chu kì lệnh)
Lần 2: dectsz vong1, f -> vong1=0 chương trình bỏ qua lệnh goto -> thốt (mất 2
chu kì lệnh)
Như vậy mất tổng cộng: (1+2)+2= 5 chu kì lệnh Giả sử ban đầu:
Vòng 1=3:
Lần 1: decfsz vong1,f -> vong1=2 -> vong1#0 (mất 1 chu kì lệnh) Goto $-1 (mất 2 chu kì lệnh)
Số chu kì lệnh mất= 3 chu kì lệnh
Lần 2: decfsz vong1,f -> vong1=1 -> vong1#0 (mất 1 chu kì lệnh) Vong1=vong1-1
Vong1=0?
Thốt YES
Goto $-1 (mất 2 chu kì lệnh) Số chu kì lệnh mất = 3 chu kì lệnh
Lần 2: dectsz vong1, f -> vong1=0 chương trình bỏ qua lệnh goto -> thốt Số chu kì lệnh mất = 2 chu kì lệnh
Tổng số chu kì lệnh mất = 3*2 +2 Cứ như vậy thì có thể qui nạp lệnh
Số chu kì lệnh mất tổng cộng với một giá trị của biến vong1 là:
3* (vong1-1) +2 =3*vong1-1 (1)
(3 chu kì lệnh cho (vong1-1) lần đầu và 2 chu kì lệnh cho lần cuối)
Số chu kì lệnh tối thiểu và tối đa tạo trễ được. - Khi vong1=1: số chu kì lệnh= 2
- Khi vong1=0: số chu kì lệnh= 3*256-1= 767