KHỞI TẠO VAØ TRUY XUẤT CÁC THANH GHI CỦA TIMER/COUNTE R:

Một phần của tài liệu Chương 4: Hệ vi điều khiển 8 bit MCS51 potx (Trang 64 - 65)

Các Timer thường được khởi tạo 1 lần ở đầu chương trình để thiết lập mode hoạt động phục vụ cho các ứng dụng điều khiển liên quan đến định thời hay đếm xung ngoại. Tùy thuộc vào yêu cầu điều khiển cụ thể mà ta điều khiển các timer bắt đầu đếm, ngừng hay khởi động đếm lại từ đầu …

Thanh ghi TMOD là thanh ghi đầu tiên cần phải khởi tạo để thiết lập mode hoạt động cho các Timer. Ví dụ khởi động cho Timer0 hoạt động ở mode 1 (mode Timer 16 bit) và hoạt động định thời đếm xung nội bên trong thì ta khởi tạo bằng lệnh: MOV TMOD, #00000001B. Trong lệnh này M1 = 0, M0 = 1 để vào mode 1 vàC/T= 0, GATE = 0 để cho phép đếm xung nội bên trong đồng thời xóa các bit mode của Timer 1. Sau lệnh trên Timer 0 vẫn chưa đếm và timer 0 chỉ đếm khi set bit điềàu khiểân chạy TR0.

Nếu ta không thiết lập các giá trị bắt đầu đếm cho các thanh ghi TLx/THx thì Timer sẽ bắt đầu đếm từ 0000H lên và khi chuyển trạng thái từ FFFFH sang 0000H sẽ sinh ra tràn làm cho bit TFx = 1 rồi tiếp tục đếm từ 0000H lên tiếp . . .

Nếu ta thiết lập giá trị bắt đầu đếm cho TLx/THx khác 0000H, thì Timer sẽ bắt đầu đếm từ giá trị thiết lập đó lên nhưng khi chuyển trạng thái từ FFFFH sang 0000H thì timer lại đếm từ 0000H lên.

Để timer luôn bắt đầu đếm từ giá trị ta gán thì ta có thể lập trình chờ sau mỗi lần tràn ta sẽ xóa cờ TFx và gán lại giá trị cho TLx/THx để Timer luôn luôn bắt đầu đếm từ giá trị khởi gán lên.

Đặc biệt nếu bộ định thời hoạt động trong phạm vi nhỏ hơn 256 μs thì ta nên dùng Timer ở mode 2 (tự động nạp 8 bit). Sau khi khởi tạo giá trị đầu cho thanh ghi THx, và TLx, khi set bit TRx thì Timer sẽ bắt đầu đếm từ giá trị đã gán trong TLX và khi tràn từ FFH sang 00H trong TLx, thì cờ tràn TFx tự động được set, đồng thời giá trị trong Thx tự động nạp sang cho TLx và Timer bắt đầu đếm từ giá trị khởi gán này lên. Nói cách khác, sau mỗi lần tràn ta không cần khởi gán lại cho các thanh ghi Timer mà chúng vẫn đếm được lại từ giá trị đã gán.

Ví dụ 47: Chương trình tạo xung vuông tần số 1kHz sử dụng timer1 mode1:

Tần số 1KHz = 1000Hz thì chu kỳ T = 1ms = 1000μs. Thời gian ở mức 0 bằng thời gian ở mức 1 bằng 500μs. Sử dụng thạch anh 12 MHz nên mỗi chu kỳ là 1μs, để đếm 500 xung thì ta có thể chọn định cấu hình timer ở mode 0 hoặc mode 1 đều được. Ngõ ra xung là bit P1.0.

MOV TMOD,#01H ;chọn mode 1 timer 0 đếm 16 bit

LOOP1: MOV TH0,#HIGH(-500) ;độ rộng xung 500μs

MOV TL0,#LOW(-500) ;

SETB TR0 ;cho timer bắt đầu đếm

JNB TF0,$ ;chờ báo ngắt

CLR TF0 ;xóa cờ ngắt

CPL P1.0 ;nghịch đảo bit p1.0

SJMP LOOP1 ;quay trở lại thực hiện tiếp

Ví dụ 48: Chương trình tạo xung vuông tần số 10 kHz sử dụng timer mode2:

Tần số 10KHz = 10000Hz thì chu kỳ T = 100μs. Thời gian ở mức 0 bằng thời gian ở mức 1 bằng 50μs. Sử dụng thạch anh 12 MHz nên mỗi chu kỳ là 1μs, để đếm 50 xung thì ta có thể chọn định cấu hình timer ở mode 2.

MOV TMOD,#02H ;chọn mode 2 chế độ tự động nạp laiï 8 bit

MOV TH0,#-50 ;tạo độ rộng xung 50μs

SETB TR0 ;cho timer bắt đầu đếm

LOOP: JNB TF0,$ ;chờ báo ngắt

CLR TF0 ;xóa cờ ngắt

CPL P1.0 ;nghịch đảo bit p1.0

SJMP LOOP ;trở lại loop

Một phần của tài liệu Chương 4: Hệ vi điều khiển 8 bit MCS51 potx (Trang 64 - 65)