Ta có đoạn lệnh sau: decfsz vong1,F goto $-1 decfsz vong2,F goto $-3 decfsz vong3,F goto $-5 Thuật toán: Vong1=vong1-1 Vong1=0? YES NO Vong1=0? Vong2=0? Vong2=vong2-1 NO YES Vong3=vong3-1 Vong3=0? NO
Tính tốn tương tự như trên, ta có cơng thức:
Số chu kì lệnh= 3*vong1+ 770*vong2 + 197122*vong3 - 197889 (3)
Ta cũng cần chú ý ở đây nữa là để nạp giá trị đầu cho biến vong1 ta mất 2 chu kì lệnh cho 2 lệnh sau:
Movlw d’ giá trị đầu (ví dụ: movlw d’100) Movwf vong1
Tương tự như vậy nếu dùng vòng 2 ta sẽ mất thêm 2 lệnh cho việc khởi tạo giá trị đầu biến vong2 như vậy mất 4 chu kì lệnh
Tương tự như vậy nếu dùng vịng 3 ta sẽ mất thêm 2 lệnh cho việc khởi tạo giá trị đầu biến vong3 như vậy mất 6 chu kì lệnh
Ta phải gọi chương trình con tạo thời gian trễ: call delay mất thêm 2 chu kì lệnh Trong chương trình con delay có lệnh trở về return mất thêm 2 chu kì lệnh. Như vậy công thức tổng quát cuối cùng là:
- Nếu chỉ sử dụng vịng 1:
Số chu kì lệnh = 3*vong1-1+2 (cho khởi tạo biến vong1) +2 (cho lệnh call delay) +2 (cho lệnh return)
Số chu kì lệnh= 3*vong1+5 (4)
- Nếu sử dụng vòng 1 và vòng 2:
Số chu kì lệnh = 3*vong1 +770*vong2 -769 +4 (cho khởi tạo biến
vong1, vong2) +2 (cho lệnh call delay) +2 (cho lệnh return) Số chu kì lệnh= 3*vong1+770*vong2-761 (5)
- Nếu sử dụng cả 3 vòng 1, vòng 2 và vòng 3:
Số chu kì lệnh = 3*vong1+ 770*vong2 + 197122*vong3 - 197889 +6 (cho khởi tạo biến vong1, vong2, vong3) +2 (cho lệnh call delay) +2 (cho lệnh return)
Số chu kì lệnh= 3*vong1+ 770*vong2 + 197122*vong3 -197879 (6)
Giả sử ta dùng bộ dao động thạch anh f=4Mhz, cho chân rb0 lên mức 1, tạo thời gian trễ 200ms, cho chân rb0 xuống mức 0.
Thời gian trễ ở đây là 200ms.
Giả sử ta áp dụng thuật tốn 3 vịng.
200ms= 200.000 micro giây= 200.000 chu kì lệnh Áp dụng cơng thức (6) ta có:
3*vong1+ 770*vong2 + 197122*vong3 -197879 = 200.000 Suy ra:
3*vong1+ 770*vong2 + 197122*vong3 = 397897
Vong3= 397897/197122= 2
3*vong1+770*vong2= 397897-197122*vong3= 397897-197122*2=3653 Suy ra:
Vong2= 3653/770=4
3*vong1=3643-770*vong2=563 Suy ra: vong1=563/3=187 Số dư= 563-3*187=2 Như vậy:
200.000= 3*187 +770*4+197122*2 +2 Số 2 dư ra ta dùng 2 lệnh NOP
Chương trình chính và chương trình con delay sẽ như sau:
; DUA FILE LIET KE VAO #include p16f877a.inc ; KHAI BAO CAU HINH
__CONFIG _HS_OSC & _WDT_OFF &_LVP_OFF ; KHAI BAO BIEN O DAY
; DIA CHI BIEN O VUNG NHO BIEN BANK0 cblock 0x21
endc
variable giatricong=0x25
;CHUONG TRINH VI DIEU KHIEN CHAY TAI DAY org 0x000; CHI DAN BIEN DICH
; NHAY TOI CHUONG TRINH CHINH goto main
; chi dan bien dich
; CHUONG TRINH CHINH BAT DAU TU DAY org 0x005 main banksel trisb clrf trisb banksel PORTB START: BSF PORTB,0 CALL DELAY BCF PORTB,0 CALL DELAY GOTO START DELAY: nop nop movlw d'187 movwf vong1 movlw d'4 movwf vong2 movlw d'2 movwf vong3 decfsz vong1,f
goto $-1 decfsz vong2,f goto $-3 decfsz vong3,f goto $-5
; THOAT KHOI CHUONG TRINH CON return
; KET THUC MOI CHUONG TRINH end