Khảo sát bộ định thời

Một phần của tài liệu tnvxlvdk_v2-1 (Trang 42 - 46)

Nội dung:

Khảo sát các chế độ hoạt động của các bộ định thời. Khảo sát các thanh ghi điều khiển bộ định thời. Sử dụng bộ định thời trong chương trình.

Yêu cầu:

Sử dụng bộ timer0 cứ sau 1s đếm lên 1 đơn vị rồi xuất giá trị ra led đơn.

Viết chương trình sử dụng bộ định thời làm đồng hồ điều khiể n đèn giao thông.

4.1 Các bước hiện thực yêu cầu 1

Bước 1. Tạo project mới tên timer . Bước 2. Tạo tập tin nguồn timer.asm.

Bước 3. Khởi tạo PORTB là cổng xuất.

init clrf LATB ; toàn bộ PORTB là cổng xuất

clrf TRISB return

Bước 4. Khởi tạo các vector ngắt.

Địa chỉ 0x00 bắt đầu chương trình chính.

Địa chỉ 0x08 địa chỉ của vector ngắt có độ ưu tiên cao. Địa chỉ 0x18 địa chỉ của vector ngắt có độ ưu tiên thấp.

code 0

goto main

org 0x000008 ; vector ngắt ưu tiên cao

goto isr_high

org 0x000018 ; vector ngắt ưu tiên thấp

goto isr_low ; Vùng định nghĩa dữ liệu udata bien res 1 ; Vùng bắt đầu code org 0x30 PRG code main call init . . .

; chương trình phục vụ ngắt ưu tiên cao isr_high . . .

retfie

; chương trình phục vụ ngắt ưu tiên thấp isr_low . . .

retfie

Bước 5. Khởi tạo ngắt timer0 phát ra ngắt 100ms (với xung clock 4 MHz, chọn prescaler 2:1, số đếm 50000).

Bộ mơn Kỹ Thuật Máy Tính 39 Thực hành Vi xử lý

;=====================; ; Initializing timer 0: 16BIT

;=====================;

init_timer0

bsf RCON,IPEN ; cho phép dùng ưu tiên ngắt.

bcf INTCON2,TMR0IP ; ngắt timer0 ưu tiên thấp

bcf INTCON,TMR0IF ; xóa cờ báo ngắt timer0

bsf INTCON,TMR0IE ; cho phép ngắt timer0

bsf INTCON,GIEH ; cho phép ngắt ưu tiên cao

bsf INTCON,GIEL ; cho phép ngắt ưu tiên thấ p

clrf T0CON ; prescaler 2:1

movlw HIGH(-.50000) ; nạp số đếm 50000 cho timer0

movwf TMR0H

movlw LOW(-.50000)

movwf TMR0L

bsf T0CON,TMR0ON ; cho phép timer0 đếm

return

Bước 6. Viết chương trình con chạy trong timer, sau 1s tăng giá trị hiển thị ra ngồi led đơn.

Vì cứ 100ms thì có ngắt một lần, do đó để sau 1s ta tăng lên một giá t rị thì cần 10 lần ngắt như vậy, nên ban đầu ta phải khởi tạo cho biến delay = 10. Và đây là hàm thực hiện chức năng của bài tập 1.

timer0_isr

bcf INTCON,TMR0IF ; xóa cờ báo ngắt

bcf T0CON,TMR0ON ; timer0 ngưng đếm

movlw HIGH(-.50000) ; nạp lại số đếm 50000 cho timer0

movwf TMR0H

movlw LOW(-.50000)

movwf TMR0L

bsf T0CON,TMR0ON ; timer0 đếm lại ; phần làm thêm trong ISR

decfsz delay ; đếm số lần xảy ra ngắt

bra timer0_isr_end ; chưa đủ, kết thúc ngắt

incf LATB ; đã đủ tăng PORTB lên 1

movlw .10 ; nạp lại biến đếm số lần ngắt xảy ra

movwf delay ; 10 x 100 ms = 1s timer0_isr_end return 4.2 Chương trình mẫu ;================================================== ; Name: timer.asm

; Project: Su dung bo Timer0, cu sau 1s đem len 1 đon vi roi xuat gia tri ra led don. ; Author: BM KTMT

; Creation Date: 21 - 10 - 2013

list p = 18f4520

#include p18f4520.inc

#define T0_COUNTER (-.50000) code 0

goto main

org H’00008’ ; vector ngat uu tien cao

goto isr_high

org H’00018’ ; vector ngat uu tien thap

goto isr_low ; Vung du lieu

udata

delay res 1

; Vung bat dau code

PRG code

main

rcall init

rcall init_timer0

goto $

; Ham khoi dong ban dau init clrf TRISB

clrf LATB return

;===========================================; ; Khoi dong Timer0 dem 16 bit.

; De tinh thoi khoan tao ra boi Timer0, ta can biet mot so diem ; 1. Tan so xung clock ngoai: FOSC=4Mhz

; 2. Thang dem truoc (prescaler): prescaler=2

; 3. So dem: n=50000

; thoi gian tao ra ngat tu Timer0: ttimer = (1/(FOSC/4))*prescaler*n

; =100 ms

;===========================================;

init_timer0

bsf RCON,IPEN ; cho phep uu tien ngat.

bcf INTCON2,TMR0IP ; timer0 uu tien thap

bcf INTCON,TMR0IF ; xoa co ngat timer0

bsf INTCON,TMR0IE ; cho phep ngat timer0

bsf INTCON,GIEH ; cho phep ngat uu tien cao

bsf INTCON,GIEL ; cho phep ngat uu tien thap

clrf T0CON ; prescaler 2:1

movlw HIGH T0_COUNTER ; nap so dem cho timer0

movwf TMR0H

movlw LOW T0_COUNTER

Bộ mơn Kỹ Thuật Máy Tính 41 Thực hành Vi xử lý

bsf T0CON,TMR0ON ; timer0 bat dau dem

return

;===============================================; ; chuong trinh phuc vu ngat quang uu tien cao

;===============================================;

isr_high ; khong lam gi ca

retfie

;===============================================; ; Chuong trinh phuc vu ngat quang uu tien thap

;===============================================;

isr_low

rcall timer0_isr

retfie

;===============================================; ; Chuong trinh phuc vu ngat quang Timer0

;===============================================;

timer0_isr

bcf INTCON,TMR0IF

bcf T0CON,TMR0ON ; timer0 ngung dem

movlw HIGH T0_COUNTER ; nap lai so dem cho timer0

movwf TMR0H

movlw LOW T0_COUNTER

movwf TMR0L

bsf T0CON,TMR0ON ; timer0 dem lai ; xu ly tac vu thoi gian

decfsz delay ; 10 x 100 ms = 1 s bra timer0_isr_end incf LATB movlw .10 movwf delay timer0_isr_end return end 4.3 Bài tập

a) Làm lại bài thí nghiệm nhưng sử dụng Timer1 thay vì Timer0. b) Dùng bộ định thời tạo xung vng chu kì 10ms, duty cycl e 30%.

c) Thực hiện yêu cầu 2 của bài thí nghiệm dùng timer điều khiển đèn giao thơng.

4.4 Báo cáo

a) Giải thích ý nghĩa cơng thức tính thời gian của Timer. Nếu dùng prescaler 16:1 thì cần chỉnh các thơng số nào trong bài thí nghiệm để thời gian khơng đổi.

b) Tại sao phải dùng số đếm âm ( -.50000)?

Một phần của tài liệu tnvxlvdk_v2-1 (Trang 42 - 46)

Tải bản đầy đủ (PDF)

(69 trang)