Chương trình con tạo thời gian trễ:

Một phần của tài liệu Giáo trình hợp ngữ - Lập trình PIC 16F877A (Trang 39 - 41)

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

Một phần của tài liệu Giáo trình hợp ngữ - Lập trình PIC 16F877A (Trang 39 - 41)