Vòng 3: Ta có đoạn lệnh sau:

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

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

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