1. Trang chủ
  2. » Thể loại khác

Chapter7 Timer&ADC GT V2q

50 232 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 1,67 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chapter7 Timer&ADC GT V2q tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh vực ki...

Trang 1

CHƯƠNG 7: BỘ ĐỊNH THỜI/BỘ ĐẾM, BỘ BIẾN ĐỔI TƯƠNG

TỰ SANG SỐ, BỘ SO SÁNH

Mục tiêu chính của chương này đối với người tham khảo:

 Hiểu rõ cấu trúc và hoạt động các bộ định thời/bộ đếm

 Hiểu rõ cấu trúc và hoạt động của bộ chuyển đổi tương tự sang số

 Hiểu rõ cấu trúc và hoạt động của bộ so sánh

 Thiết kế và lập trình được các ứng dụng dùng bộ định thời

 Thiết kế và lập trình được các ứng dụng dùng bộ đếm

 Thiết kế và lập trình được các ứng dụng dùng bộ chuyển đổi tương tự sang số

Khối Timer0 được tích hợp các tính năng sau:

− Lựa chọn chế độ hoạt động bằng phần mềm: timer hay counter, chế độ 8-bit hay 16-bit

− Có các thanh ghi có thể đọc và ghi

− Bộ chia trước tần số (prescaler) 8-bit dành riêng có thể lập trình được bằng phần mềm

− Có thể chọn nguồn xung clock (clock nội hay ngoại)

− Có thể chọn sườn kích cho nguồn xung clock ngoại

− Có hoạt động ngắt tràn

Hầu hết các bộ định thời trong PIC18 có độ rộng 16-bit Vì PIC18 có kiến trúc 8-bit,

mỗi bộ định thời 8-bit được truy xuất bằng hai thanh ghi riêng gồm byte thấp (TMRxL) và byte cao (TMRxH), chẳng hạn hình 7.1

Hình 7.1: thanh ghi TMR0 7.1.1 Thanh ghi điều khiển TIMER0 (T0CON)

Hình 7.2: thanh ghi T0CON

Trang 2

Ghi chú:

R: bit cho phép đọc

W: bit cho phép ghi

U: bit không sử dụng, xem như là bit ‘0’

‘0’: bit được xóa

‘1’: bit được set

x: bit không xác định trạng thái

Bit 7 – TMR0ON: bit điều khiển Timer0 On/Off

1 = Enable Timer0

0 = Stop Timer0

Bit 6 – T08BIT: bit điều khiển Timer0 là timer 8-bit/16-bit

1 = Timer0 được cấu hình ở chế độ timer/counter 8-bit

0 = Timer0 được cấu hình ở chế độ timer/counter 16-bit

Bit 5 – T0CS: bit chọn nguồn xung Timer0

1 = Theo sự chuyển trạng thái trên chân T0CKI

0 = Theo chu kỳ xung clock nội (CLKO)

Bit 4 – T0SE: bit chọn sườn kích cho Timer0

1 = Timer tăng khi chân T0CKI chuyển từ high xuống low

0 = Timer tăng khi chân T0CKI chuyển từ low lên high

Bit 3 – PSA: bit thiết lập cho prescaler Timer0

1 = Prescaler của Timer0 không được gán, ngõ vào clock của Timer0 bỏ qua prescaler

0 = Prescaler của Timer0 được gán, ngõ vào clock của Timer0 được cấp từ ngõ ra của prescaler

Bit 2-0 – T0PS2:T0PS0: bit chọn prescaler của Timer0

111 = 1:256 giá trị của prescaler

110 = 1:128 giá trị của prescaler

101 = 1:64 giá trị của prescaler

100 = 1:32 giá trị của prescaler

011 = 1:16 giá trị của prescaler

010 = 1:8 giá trị của prescaler

Trang 3

001 = 1:4 giá trị của prescaler

000 = 1:2 giá trị của prescaler

Ví dụ 7.1: xác định giá trị của T0CON nếu chúng ta muốn lập trình Timer0 ở chế độ 16-bit,

không dùng prescaler PIC18 có dao động FOSC/4 để tạo nguồn xung clock, gia tăng theo cạnh lên của xung

Giải pháp:

Đặt thanh ghi T0CON như sau :

T0CON = 0b00001000; //TMR0 : 16-bit, FOSC/4, no prescaler Timer0 off

Ví dụ 7.2: tính tần số xung của bộ định thời và chu kỳ của nó khi PIC18 sử dụng các thạch

anh sau đây Giả sử không sử dụng prescaler

7.1.2 Hoạt động của TIMER0

Timer0 có thể hoạt động như là một timer hoặc một counter, chế độ hoạt động được

chọn bằng cách xoá bit T0CS (T0CON<5>) Ở chế độ timer, Timer0 sẽ mặc định tăng lên

sau mỗi chu kỳ xung clock nếu giá trị của prescaler không được chọn Nếu thanh ghi TMR0 đang được ghi, hoạt động của Timer0 sẽ bị cấm trong 2 chu kỳ lệnh

Chế độ counter được chọn bằng cách set bit T0CS (T0CS = 1) ở chế độ này, Timer0 sẽ

tăng theo trạng thái sườn lên hoặc sườn xuống của chân RA4/T0CKI Sườn kích cho hoạt

động của counter được xác định thông qua bit T0SE (T0CON<4>)

Xung clock ngoại có thể được sử dụng để điều khiển Timer0, tuy nhiên nó bắt buộc phải tương thích với một số điều kiện để đảm bảo rằng nguồn xung clock này có thể đồng bộ được

với pha của xung clock nội (TOSC) Luôn có một khoảng thời gian delay giữa quá trình đồng

bộ nguồn xung và lúc timer/counter bắt đầu hoạt động

7.1.3 Đọc và ghi Timer0 ở chế độ 16-bit

TMR0H không phải là byte cao thực sự lưu giá trị của Time0 trong chế độ 16-bit, có thể xem nó như là một bộ đệm của byte cao thực của Timer0 không thể đọc hay ghi một cách trực tiếp Nội dung của TMR0H được cập nhật từ nội dung của byte cao của Timer0 trong

Trang 4

suốt quá trình đọc thanh ghi TMR0L Điều này cho phép đọc tất cả 16 bit của Timer0 mà không phải kiểm tra xem có thể đọc được byte thấp và byte cao này hay không

Tương tự cho quá trình ghi vào byte cao của Timer0 cũng phải được thực hiện thông qua thanh ghi đệm TMR0H Byte cao thực của Timer0 sẽ được cập nhật nội dung của TMR0H khi thanh ghi TMR0L được ghi Điều này cho phép 16 bit của Timer0 luôn được cập nhật ngay lập tức

Hình 7.3: sơ đồ khối của Timer0 (chế độ 8-bit)

Hình 7.4: sơ đồ khối của Timer0 (chế độ 16-bit)

Ví dụ 7.3: trong chương trình sau, sẽ tạo ra sóng vuông ở RB.5 Timer0 được sử dụng để tạo

ra delay (time delay)

Giải pháp:

bcf TRISB, 5 ; RB.5 as an output

movlw 0x08 ; Timer0, 16-bit, int clock, no prescaler

movwf T0CON ; Load T0CON

movwf TMR0H ;

Trang 5

movlw 0xF2 ; TMR0L = 0xF2

movwf TMR0L ; bcf INTCON, TMR0IF; Xoá TMR0 interrupt flag bit

btg PORTB, 5 ; Toggle PB5

AGAIN btfss INTCON, TMR0IF; Monitor TMR0 flag until

bra AGAIN ; it rolls over

bcf T0CON, TMR0ON; Stop TMR0

 Timer0 bắt đầu hoạt động bằng lệnh “bsf T0CON, TMR0ON”

 Timer0 đếm lên theo mỗi xung clock Bộ định thời sẽ đếm lên từ 0xFFF2 …0xFFFF Thêm một xung nữa thì giá trị thanh ghi Timer0 là 0x0000 sẽ làm bit cờ TMR0IF =

1 Tại thời điểm này, lệnh “btfss INTCON, TMR0IF” sẽ bỏ qua lệnh “bra AGAIN”

 Timer0 dừng lại bằng lệnh “bcf T0CON, TMR0ON”, và quá trình được lập lại

TMR0IF = 0 TMR0IF = 0 TMR0IF = 0

0xFFFF TMR0IF = 0

0x0000 TMR0IF = 1

Hình 7.5: trạng thái các bit cờ TMR0IF của ví dụ 7.3

Ví dụ 7.4: trong ví dụ 7.3, hãy tính thời gian delay của timer Giả sử dùng XTAL = 10 MHz Giải pháp:

Timer hoạt động có tần số xung clock fCK = fOSC/4 = 2.5 MHz  TCK = 0.4 µs Mặt khác, Timer0 đếm lên mỗi 0.4 µs sẽ tạo ra độ trễ:

Trang 6

;====> delay using Timer0

Trang 7

HERE movlw 0xB8

movlw 0x3E

bsf T0CON, TMR0ON; Start TMR0

AGAIN btfss INTCON, TMR0IF; Monitor TMR0 flag until

bra AGAIN ; it rolls over

bcf T0CON, TMR0ON; Stop TMR0

bcf INTCON, TMR0IF; Xoá TMR0 flag

Giải pháp:

(0xFFFF – 0xB83E + 1) = 0x47C2 = 18,370

Timer0 tạo ra thời gian delay = 18,370 x 0.4 µs = 7.348 ms

Ví dụ 7.7: tính tần số của sóng vuông được tạo bởi đoạn chương trình sau nếu biết XTAL =

10 MHz Lưu ý, chỉ tính các lệnh bên trong vòng

movwf TMR0H ; TMR0H = 0x76

movlw 0x34 movwf TMR0L ; TMR0L = 0x34

bcf INTCON,TMR0IF; Xoá interrupt flag

call DELAY

bra HERE ; Load TH & TL again

Trang 8

;===> delay using Timer0

DELAY bsf T0CON,TMR0ON; Start TMR0

AGAIN btfss INTCON,TMR0IF ; Monitor TMR0 flag until

bra AGAIN ; it rolls over

Cách tìm giá trị được nạp vào trong timer

Giả sử rằng chúng ta biết giá trị thực của độ delay cho timer mà chúng ta cần Để tính toán giá trị được nạp vào các thanh ghi TMR0L và TMR0H, giả sử dùng XTAL = 10 MHz cho họ PIC18 và không sử dụng prescale, chúng ta làm theo trình tự từng bước sau:

(1) Chia độ trễ thời gian mong muốn cho 0.4 µs

(2) Thực hiện (65536 – n), với n là giá trị thập phân trong bước 1

(3) Chuyển đổi kết quả trong bước 2 sang giá trị hex là 0xhhll, 0xhhll là giá trị ban đầu phải nạp vào cho các thanh ghi của timer

(4) Đặt TMR0L = 0xll và TMR0H = 0xhh

Các bước lập trình cho Timer0 hoạt động chế độ 8-bit

Trình tự thực hiện theo các bước sau:

(1) Cấu hình thanh ghi T0CON để chỉ định Timer0 hoạt động 8-bit

(2) Nạp giá trị đếm ban đầu cho thanh ghi TMR0L

(3) Bắt đầu đếm timer

(4) Kiểm tra cờ TMR0IF, khi báo tràn thì TMR0IF = 1

(5) Ngừng đếm timer bằng lệnh “bcf T0CON, TMR0ON”

(6) Xoá bit cờ TMR0IF

(7) Lập lại vòng lặp từ bước 2 để nạp lại giá trị cho TMR0L

Trang 9

7.1.4 Lập trình bộ đếm

Bit TOCS trong thanh ghi T0CON

Bit TOCS quyết định nguồn cấp xung clock cho timer Nếu TOCS = 0, timer sẽ lấy xung

từ dao động thạch anh được gắn vào hai chân OSC1 và OSC2 (FOSC/4) Ngược lại, TOCS =

1, timer sẽ được sử dụng là bộ đếm và nó nhận xung từ bên ngoài PIC18 cung cấp Vì thế, khi

TOCS = 1, bộ đếm sẽ thực hiện đếm lên theo mỗi xung nhận được từ chân RA4 (chân thứ 6 của PIC18) Chân này là T0CKI (Timer0 Clock Input) Tương tự đối với Timer1, chân nhận xung sẽ ở RC0 (chân thứ 15 của PIC18)

Ví dụ 7.8: xác định giá trị cho thanh ghi T0CON để Timer0 hoạt động là bộ đếm 8-bit, không

dùng prescaler Sử dụng nguồn clock ngoài và đếm lên theo cạnh lên của xung

Giải pháp:

T0CON = 0110 1000

Ví dụ 7.9: từ hình 7.6, viết chương trình để Conuter0 ở 8-bit đếm các xung và hiển thị trạng

thái đếm của TMR0L ra các LED trên PORTB

Hình 7.6: sơ đồ kết nối của ví dụ 7.9 Giải pháp:

bsf TRISA, RA4 ; RA4 as an input for clock

clrf TRISB ; PORB as an output

movlw 0x68 ; TMR0, 8-bit, ext clk, no prescaler

movwf T0CON ; Load to T0CON

movwf TMR0L ; TMR0L = 0x00

bcf INTCON,TMR0IF ; Cleat flag bit

bsf T0CON,TMR0ON ; Start TMR0

AGAIN movff TMR0L, PORTB ; Display the count on PORTB

btfss INTCON, TMR0IF; Monitor flag bit until bra AGAIN ; it rolls over

bcf T0CON, TMR0ON; Stop TMR0

Trang 10

goto HERE end

7.1.5 Bộ ấn định hệ số chia Prescaler

Prescaler là một bộ đếm counter 8-bit nằm trong khối Timer0, nó không thể được ghi

hoặc đọc một cách trực tiếp, giá trị của prescaler được thiết lập bởi các bit PSA và

T0PS2:T0PS0 (T0CON<3:0>), các bit này có chức năng xác định giá trị gán cho prescaler

và tỷ số chia của bộ đếm

Xóa bit PSA sẽ gán giá trị của prescaler đến khối Timer0, giá trị của prescaler được chọn sẽ tăng theo hệ số 2 với các tỷ lệ 1:2 đến 1:256 Khi đó, tất cả các lệnh thực hiện hoạt

động ghi vào thanh ghi TMR0 (CLRF TMR0, MOVWF, MR0, BSF TMR0…) sẽ xóa giá trị

đếm của prescaler, tuy nhiên sẽ không làm thay đổi giá trị gán trước cho prescaler

7.1.6 Ngắt Timer0

Ngắt TMR0 xảy ra khi thanh ghi TMR0 bị tràn từ giá trị FFh về 00h ở chế độ 8-bit, hoặc

từ FFFFh tới 0000h ở chế độ 16-bit Khi có tràn Timer0, bit cờ TMR0IF sẽ được set Ngắt

Timer0 có thể vô hiệu bằng cách xoá bit TMR0IE (INTCON<5>) Trước khi cho phép ngắt

Timer0 trở lại, bit cờ TMR0IF phải được xoá bằng phần mềm

Bởi vì Timer0 bị tắt ở chế độ Sleep, do đó ngắt TMR0 không thể làm cho vi xử lý hoạt động trở lại từ trạng thái Sleep được

Bảng 7.1: các thanh ghi có liên kết với Timer0 Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 TMR0L Thanh ghi byte thấp của TMR0

TMR0H Thanh ghi byte cao của TMR0

INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

T0CON TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0

TRISA - TRISA6 (1) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0

Chú thích:

“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer0

(1) RA6 được cấu hình làm chân port trong các kiểu dao động sơ cấp Khi chân port bị vô hiệu, tất cả các bit liên kết đọc bằng 0

Khối Timer1 (timer/counter) tích hợp các tính năng sau:

− Lựa chọn chế độ hoạt động bằng phần mềm: timer 16-bit hay counter 16-bit

− Có các thanh ghi 8-bit có thể đọc và ghi (TMR1H và TMR1L)

− Có thể chọn nguồn xung clock (clock nội hay ngoại) với các tùy chọn: xung clock của

VĐK hoặc bộ dao động nội của Timer1

− Có hoạt động ngắt khi tràn

Trang 11

− Tích hợp khối Reset theo bộ kích khởi từ các sự kiện đặc biệt (Special Event Trigger) của khối CCP (Capture/Compare/PWM)

− Cờ báo trạng thái xung clock của VĐK (T1RUN)

7.2.1 Thanh ghi điều khiển TIMER1 (T1CON)

Hình 7.7: thanh ghi điều khiển T1CON

Bit 7 – RD16: bit cho phép chế độ ghi/đọc 16-bit

1 = Cho phép ghi/đọc theo số 16-bit vào thanh ghi của Timer1

0 = Cho phép ghi/đọc theo 2 lần số 8-bit vào thanh ghi của Timer1

Bit 6 – T1RUN: bit trạng thái xung clock hệ thống của Timer1

1 = Xung clock được lấy từ bộ dao động Timer1

0 = Xung clock được lấy từ nguồn khác

Bit 5-4 – T1CKPS1:T1CKPS0: bit chọn hệ số chia xung clock ngõ vào Timer1

11 = 1:8 giá trị Prescaler

10 = 1:4 giá trị Prescaler

01 = 1:2 giá trị Prescaler

00 = 1:1 giá trị Prescaler

Bit 3 – T1OSCEN: bit cho phép bộ dao động Timer1

1 = Bộ dao động Timer1 được cho phép

0 = Tắt bộ dao động Timer1

Bit 2 – 𝐓𝟏𝐒𝐘𝐍𝐂̅̅̅̅̅̅̅̅̅̅̅: bit chọn sự đồng bộ ngõ vào xung clock ngoại của Timer1

Khi TMR1CS = 1

1 = Không đồng bộ với ngõ vào xung clock ngoại

0 = Đồng bộ với ngõ vào xung clock ngoại

Khi TMR1CS = 0

Bit này được bỏ qua, Timer1 sử dụng xung clock nội

Bit 1 – TMR1CS: bit chọn nguồn xung clock Timer1

1 = xung clock ngoại từ chânRC0/T1OSO/T13CKI (theo sườn lên xung clock)

0 = Xung clock nội (FOSC/4)

Trang 12

Bit 0 – TMR1ON: bit chạy Timer1

1 = cho phép chạy Timer1

0 = Dừng Timer1

7.2.2 Hoạt động của TIMER1

Timer1 có thể hoạt động theo một trong các chế độ: định thời, đếm đồng bộ và bất đồng

các chân lúc này được đọc là ‘0’

Hình 7.8: sơ đồ khối của Timer1

Trang 13

Hình 7.9: sơ đồ khối của Timer1 (chế độ đọc/ghi 16-bit)

7.2.3 Đọc và ghi Timer1 ở chế độ 16-bit

Timer1 có thể được cấu hình cho phép việc đọc và ghi 16-bit (hình 7.9) Khi bit điều

khiển RD16(T1CON<7>) được set, địa chỉ của TMR1H được chỉ định đến một thanh ghi

đệm đóng vai trò như là byte cao của Timer1 Việc đọc nội dung của TMR1L sẽ lấy nội dung

từ byte cao của Timer1 đưa vào byte cao của thanh ghi đệm Điều này cho phép khả năng đọc chính xác 16-bit của Timer1 một cách đồng thời mà không phải theo thứ tự đọc byte thấp trước rồi mới đến byte cao

Việc ghi nội dung vào byte cao của Timer1 cũng được thực hiện thông qua thanh ghi

đệm TMR1H Byte cao của Timer1 sẽ được cập nhật nội dung từ byte cao thanh ghi đệm

TMR1H khi thực hiện hoạt động ghi vào TMR1L Quá trình này cho phép ghi tất cả 16 bit

vào byte cao và byte thấp của Timer1 ngay lập tức

Do byte cao của Timer1 không thể đọc hoặc ghi một cách trực tiếp ở chế độ này, do đó, tất cả hoạt dộng ghi và đọc đều thực hiện thông qua thanh ghi đệm byte cao của Timer1 Ghi

nội dung vào TMR1H sẽ không xóa giá trị prescaler của Timer1, prescaler chỉ bị xóa khi ghi nội dung vào thanh ghi TMR1L

7.2.4 Bộ dao động Timer1

Là một mạch dao động thạch anh nằm trên chip được tích hợp vào 2 chân:T1OSI (ngõ

vào) and T1OSO (ngõ ra bộ khuếch đại) Mạch này được kích hoạt bằng cách set bit cho phép bộ dao động Timer1 T1OSCEN (T1CON<3>) Bộ dao động này là một mạch công suất

thấp với tốc độ dao động thạch anh 32.768 kHz, nó vẫn hoạt động cho dù trạng thái của VĐK đang ở chế độ quản lý công suất

Trang 14

Sơ đồ mạch của một bộ dao động LP điển hình được mô tả trong hình 7.10

Chú ý: Khi lập trình phải đảm bảo cung cấp một khoảng delay thích hợp cho quá trình

khởi động của bộ dao động Timer1

Hình 7.10: các linh kiện được sử dụng cho bộ dao động Timer1 LP

7.2.5 Dùng Timer1 như nguồn xung clock

Bộ dao động Timer1 cũng đóng vai trò là một nguồn xung clock ở chế độ quản lý công

suất Bằng cách set các bit chọn xung clock SCS1:SCS0 (OSCCON<1:0>) bằng ‘01’, khi đó

VĐK sẽ chuyển sang chế độ SEC_RUN, lúc này cả CPU và các ngoại vi đều được cấp xung

từ bộ dao động Timer1 Nếu xoá bit IDLEN (OSCCON<7>) và thực thi lệnh SLEEP thì

VĐK sẽ chuyển sang chế độ SEC_IDLE

Bất kể khi nào bộ dao động Timer1 vẫn còn cấp xung clock thì bit cờ báo trạng thái

xung clock hệ thống của Timer T1RUN (T1CON<6>) vẫn được set, bit này có thể được dùng

để xác định chế độ cấp xung hiện tại của VĐK Nếu chế độ giám sát xung clock được cho phép, trong trường hợp bộ dao động Timer1 bị lỗi, không thể cấp xung thì khi đó giá trị của

bit T1RUN sẽ xác định nguồn xung clock đang được cấp là từ bộ dao động Timer1 hay từ

nguồn khác

7.2.6 Tính năng Timer1 công suất thấp

Bộ dao động Timer1 có thể hoạt động ở hai mức công suất tiêu thụ riêng biệt dựa theo

cấu hình của VĐK Khi bit cấu hình LPT1OSC được set, bộ dao động Timer1 sẽ hoạt động

ở chế độ công suất thấp Khi LPT1OSC không được set, Timer1 sẽ hoạt động ở mức tiêu thụ

công suất cao hơn Công suất tiêu thụ trong từng chế độ riêng biệt là hằng số tương đối bất chấp chấp chế độ hoạt động của VĐK, cấu hình hoạt động Timer1 mặc định là chế độ có mức công suất tiêu thụ cao hơn

Khi hoạt động ở chế độ công suất thấp, Timer1có xu hướng nhạy cảm với nhiễu, nếu VĐK hoạt động môi trường có nhiễu cao sẽ tạo nên sự bất ổn định cho bộ dao động Do đó, chế độ hoạt động công suất thấp chỉ phù hợp nhất cho các ứng dụng nhiễu thấp mà trong đó yếu tố bảo toàn năng lượng là một yếu tố quan trọng cần xem xét khi thiết kế

Trang 15

7.2.7 Ngắt Timer1

Cặp thanh ghi TMR1 (TMR1H:TMR1L) tăng từ 0000h đến FFFFh, nếu vượt qua giá

trị FFFFh bộ đếm sẽ bị tràn và trở về 0000h, khi đó ngắt Timer1 (nếu được enable) sẽ xảy ra

và được chốt trạng thái thông qua bit cờ ngắt TMR1IF (PIR1<0>).Ngắt Timer1 có thể được phép hoặc không bằng việc đặt hay xoá bit cho phép ngắt Timer1 TMR1IE (PIE1<0>)

7.2.8 Sử dụng Timer1 làm đồng hồ thời gian thực

Bằng việc thêm một mạch dao động ngoại kiểu LP vào Timer1 sẽ cho phép sử dụng tính năng RTC vào trong các ứng dụng Sử dụng chức năng đồng hồ thời gian thực bằng cách thêm vào một dao động thạch anh nhằm tạo ra căn cứ thời gian một cách chính xác và thêm một số dòng lệnh trong chương trình điều khiển để tính toán thời gian hoạt động của đồng hồ Khi VĐK hoạt động ở chế độ SLEEP và sử dụng pin như nguồn cung cấp, lúc đó VĐK có thể hoàn toàn loại bỏ nhu cầu sử dụng linh kiện RTC rời và nguồn pin dự trữ

movlw d’12’

movwf hours bsf PIE1, TMR1IE ; Cho phép ngắt Timer1 return

Trang 16

return ; không, đã đủ 60 giây

incf mins, F ; Tăng phút movlw d’59’ ; Kiểm tra được 60 phút chưa?

movwf hours

Chương trình trong ví dụ trên đưa ra cách thức đơn giản để tăng counter sau 1 giây sử dụng ngắt Timer1 Việc tăng nội dung của cặp thanh ghi TMR1 cho đến khi tràn để tạo ra ngắt và gọi chương trình con sẽ làm tăng bộ đếm giây lên từng đơn vị một Các bộ counter thêm vào cho phút và giờ cũng tăng lên khi counter trước đó tràn

Bởi vì cặp thanh ghi sử dụng là 16-bit, đếm lên đến khi tràn và trong trường hợp sử dụng xung clock 32.768 kHz sẽ mất 2 giây Do đó, để làm cho counter tràn chỉ sau 1 giây thì cần

phải nạp lại giá trị cho nó Cách đơn giản nhất là set bit MSB của TMR1H bằng lệnh BSF

Chú ý rằng thanh ghi TMR1L sẽ không bao giờ được nạp lại hay thay đổi giá trị Thực hiện

theo cách này có lẻ sẽ tạo ra lỗi tích lũy dần sau vài chu kỳ

Để phương pháp này chính xác hơn thì Timer1 phải hoạt động ở chế độ bất đồng bộ và

ngắt tràn Timer1 phải được enable (PIE1<0> = 1) như đoạn chương trình RTCinit ở trên

Đồng thời, bộ dao động Timer1 phải được kích hoạt và chạy tại mọi thời điểm

Bảng 7.2: các thanh ghi có liên kết với Timer1 Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

PIR1 SPPIF (1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

PIE1 SPPIE (1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

IPR1 SPPIP (1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP

TMR1L Thanh ghi byte thấp của TMR1

TMR1H Thanh ghi byte cao của TMR1

T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC ̅̅̅̅̅̅̅̅̅̅̅ TMR1CS TMR1ON

Chú thích:

“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer0

Trang 17

(1) Các bit này không sử dụng với VĐK 28 chân; luôn duy trì các bit này bằng 0

Khối Timer2 tích hợp các tính năng sau:

− Có các thanh ghi timer 8-bit TMR2 và các thanh ghi thời gian PR2

− Có các thanh ghi có thể đọc và ghi

− Có bộ chia trước tần số Prescaler có thể lập trình bằng phần mềm (1:1, 1:4 và 1:16)

− Có bộ chia sau tần số Postscaler có thể lập trình bằng phần mềm (1:1 đến 1:16)

− Ngắt khi Timer2 trùng với PR2

− Được sử dụng tùy chọn như một nguồn xung clock dịch pha cho khối MSSP

Khối Timer2 được điều khiển thông qua thanh ghi T2CON như: cho phép hay vô hiệu timer, thiết lập cấu hình cho prescaler và postscaler Có thể tắt Timer2 để giảm thiểu công

suất tiêu thụ bằng cách xoá bit điều khiển TMR2ON (T2CON<2>)

7.3.1 Thanh ghi điều khiển TIMER2 (T2CON)

Hình 7.11: thanh ghi T2CON

Trang 18

01 = Hệ số chia tần số Prescaler là 4

1x = Hệ số chia tần số Prescaler là 16

7.3.2 Hoạt động của TIMER2

Ở chế độ hoạt động bình thường, TMR2 sẽ tăng lên từ giá trị bắt đầu 00h sau mỗi xung

clock (F osc/4) Timer2 còn có một bộ chia trước tần số (prescaler) tại vị trí xung clock ngõ vào với các hệ số chia tần số (1:4 và 1:16) sẽ cấp trực tiếp đến ngõ vào của Timer2, các hệ số

này được lựa chôn thông qua các bit điều khiển chọn prescaler T2CKPS1:T2CKPS0

(T2CON<1:0>) Giá trị của TMR2 được so sánh với giá trị tương ứng trong thanh ghi thời

gian PR2 ở mỗi chu kỳ xung clock Nếu hai giá trị này trùng khớp với nhau, bộ so sánh sẽ tạo

ra một tín hiệu báo trùng khớp tại ngõ ra của Timer Tín hiệu này sẽ reset giá trị của TMR2

về 00h ở chu kỳ clock kế tiếp và nó cũng dùng để điều khiển bộ chia sau tần số (postscaler)

ngõ ra

Cả hai thanh ghi TMR2 và PR2 đều có thể đọc và ghi trực tiếp, thanh ghi TMR2 sẽ bị xóa khi Reset VĐK, trong khi thanh ghi PR2 khi reset sẽ trở về giá trị ban đầu là FFh Hai bộ đếm prescaler và postscaler được xóa theo các sự kiện sau:

- Hoạt động ghi vào thanh ghi TMR2

- Hoạt động ghi vào thanh ghi T2CON

- Reset VĐK (Power-on Reset, MCLR Reset, Watchdog Timer Reset hoặc Brown-out Reset)

Chú ý: TMR2 không bị xóa khi ghi vào thanh ghi T2CON

Hình 7.12: sơ đồ khối của Timer2 7.3.3 Ngắt Timer2

Timer2 có thể tạo ra ngắt tùy chọn trên VĐK, tín hiệu được tạo ở ngõ ra của Timer2 (khi TMR2 và PR2 trùng nhau) sẽ làm ngõ vào cho bộ chia sau tần số postscaler 4bit ở ngõ ra

Postscaler sẽ tạo ra cờ ngắt được chốt trạng thái bởi bit TMR2IF (PIR1<1>) Ngắt Timer2 được cho phép bằng cách set bit cho phép ngắt khi trùng của TMR2 (TMR2IE (PIE1<1>))

Trang 19

Ngoài ra, postscaler với 16 hệ số khác nhau có thể được chọn bằng bit điều khiển

postscaler T2OUTPS3:T2OUTPS0 (T2CON<6:3>)

PIR1 SPPIF (1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

PIE1 SPPIE (1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

IPR1 SPPIP (1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP

TMR2 Thanh ghi TMR2

T2CON - T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0

PR2 Thanh ghi chu kỳ Timer2

Chú thích:

“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer2

(1) Các bit này không sử dụng với VĐK 28 chân; luôn duy trì các bit này bằng 0

Khối Timer3 (timer/counter) tích hợp các tính năng sau:

− Lựa chọn chế độ hoạt động bằng phần mềm: timer 16-bit hay counter 16-bit

− Có các thanh ghi 8bit có thể đọc và ghi (TMR3H và TMR3L)

− Có thể chọn nguồn xung clock (clock nội hay ngoại) với các tùy chọn: xung clock của

VĐK hoặc bộ dao động nội của Timer1

− Có hoạt động ngắt khi tràn

− Tích hợp khối Reset theo bộ kích khởi từ sự kiện đặc biệt (Special Event Trigger) của khối CCP (Capture/Compare/PWM)

Khối Timer3 được điều khiển thông qua thanh ghi T3CON

7.4.1 Thanh ghi điều khiển TIMER3 (T3CON)

Hình 7.13: thanh ghi T3CON

Bit 7 – RD16: bit cho phép chế độ ghi/đọc 16bit

1 = Cho phép ghi/đọc theo số 16bit vào thanh ghi của Timer3

Trang 20

0 = Cho phép ghi/đọc theo 2 lần số 8bit vào thanh ghi của Timer3

Bit 6:3 – T3CCP2:T3CCP1: bit cho phép Timer1 và Timer3 kết nối với CCPx

1x = Timer3 là nguồn xung clock cho hoạt động capture/compare của hai khối CCP1

1 = Không đồng bộ với ngõ vào xung clock ngoại

0 = Đồng bộ với ngõ vào xung clock ngoại

Khi TMR3CS = 0

Bit này được bỏ qua, Timer3 sử dụng xung clock nội

Bit 1 – TMR3CS: bit chọn nguồn xung clock Timer3

1 = Chọn ngõ vào xung clock ngoại từ bộ dao động Timer1 hoặc T13CKI (theo sườn lên ngay sau thời điểm sườn xuống đầu tiên của xung clock)

0 = Chọn xung clock nội (F OSC/4)

Bit 0 – TMR3ON: bit chạy Timer3

1 = Cho phép chạy Timer3

0 = Dừng Timer3

7.4.2 Hoạt động của TIMER3

Timer1 có thể hoạt động theo 1 trong 3 chế độ sau: định thời, đếm đồng bộ và bất đồng

bộ

Trang 21

Chế độ hoạt động được xác định bởi bit chọn xung clock TMR3CS (T3CON<1>) Khi xoá bit TMR3CS, Timer3 tăng lên theo mỗi chu kỳ xung clock nội (F OSC/4) Khi bit này được

set, Timer3 sẽ tăng theo mỗi sườn lên của ngõ vào xung clock ngoại Timer1 hoặc của bộ dao động Timer1

Tương tự như với Timer1, các chân RC1/T1OSI/𝐔𝐎𝐄 ̅̅̅̅̅̅ và RC0/T1OSO/T13CKI trở

thành các ngõ vào khi bộ dao động Timer1 được cho phép, điều này có nghĩa là bỏ qua giá trị

hiện tại của TRISC<1:0> và các chân lúc này được đọc là ‘0’

Hình 7.14: sơ đồ khối của Timer3

Hình 7.15: sơ đồ khối của Timer3 (chế độ đọc/ghi 16-bit)

Trang 22

7.4.3 Đọc và ghi Timer3 ở chế độ 16-bit

Timer3 có thể được cấu hình cho phép việc đọc và ghi 16-bit (hình 7.15) Khi bit điều

khiển RD16 (T3CON<7>) được set, địa chỉ của TMR3H được chỉ định như một thanh ghi

đệm đóng vai trò như là byte cao của Timer3 Việc đọc nội dung của TMR3L sẽ lấy nội dung

từ byte cao của Timer3 đưa vào byte cao của thanh ghi đệm Điều này cho phép khả năng đọc chính xác 16-bit của Timer3 một cách đồng thời mà không phải theo thứ tự đọc byte thấp trước rồi mới đến byte cao

Việc ghi nội dung vào byte cao của Timer3 cũng được thực hiện thông qua thanh ghi

đệm TMR3H Byte cao của Timer3 sẽ được cập nhật nội dung từ byte cao thanh ghi đệm

TMR3H khi thực hiện hoạt động ghi vào TMR3L Quá trình này cho phép ghi tất cả 16-bit

vào byte cao và byte thấp của Timer3 ngay lập tức

Do byte cao của Timer3 không thể đọc hoặc ghi một cách trực tiếp ở chế độ này, do đó, tất cả hoạt dộng ghi và đọc đều thực hiện thông qua thanh ghi đệm byte cao của Timer3 Ghi

nội dung vào TMR3H sẽ không xóa giá trị prescaler của Timer3, prescaler chỉ bị xóa khi ghi nội dung vào thanh ghi TMR3L

7.4.4 Sử dụng bộ dao động Timer1 làm nguồn xung clock cho Timer3

Bộ dao động nội Timer1 có thể được dùng làm nguồn xung clock cho Timer3 Bộ dao

động Timer1 được cho phép bằng cách set bit T1OSCEN (T1CON<3>), và để sử dụng bộ

dao động này làm nguồn xung clock cho Timer3 thì bit TMR3CS phải được set, lúc này Timer3 cũng tăng lên theo sườn lên mỗi chu kỳ xung của nguồn tạo dao động

7.4.5 Ngắt Timer3

Cặp thanh ghi TMR3 (TMR3H:TMR3L) tăng từ 0000h đến FFFFh, nếu vượt qua giá

trị FFFFh bộ đếm sẽ bị tràn và trở về 0000h, khi đó ngắt Timer3 (nếu được cho phép) sẽ xảy

ra và được chốt trạng thái thông qua bit cờ ngắt TMR3IF (PIR2<1>).Ngắt Timer3 có thể

được cho phép hay huỷ bỏ bằng việc đặt hay xoá bit cho phép ngắt Timer3 TMR3IE

(PIE2<1>)

7.4.6 Reset Timer3 sử dụng Special Event Trigger của khối CCP

Nếu khối CCP2 được cho phép để tạo ra “tín hiệu kích khởi từ các sự kiện đặc biệt”

(Special Event Trigger) ở chế độ Compare (CCP2M3:CCP2M0 = 1011), tín hiệu này sẽ reset

Timer3 Nó cũng sẽ khởi động bộ chuyển đổi ADC nếu khối ADC được cho phép

Khối Timer3 phải được cấu hình là timer hoặc counter đồng bộ để tận dụng ưu điểm của

tính năng này Khi sử dụng cách này, cặp thanh ghi CCPR2H:CCPR2L sẽ trở thành thanh

ghi thời gian cho Timer3

Trang 23

Nếu Timer3 đang chạy ở chế độ counter bất đồng bộ thì quá trình Reset có thể không hoạt động Giả sử hoạt động ghi vào Timer3 trùng với Special Event Trigger của khối CCP, thì hoạt động ghi này sẽ chiếm quyền ưu tiên

Chú ý rằng, Special Event Trigger của khối CCP2 sẽ không đặt bit cờ ngắt TMR3IF

(PIR2<1>)

Bảng 7.4: các thanh ghi có liên kết với Timer3 Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF

PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE

IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP

TMR3L Byte thấp thanh ghi TMR3

TMR3H Byte cao thanh ghi TMR3

T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC ̅̅̅̅̅̅̅̅̅̅̅ TMR1CS TMR1ON

T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC ̅̅̅̅̅̅̅̅̅̅̅ TMR3CS TMR3ON

Chú thích:

“-”: không sử dụng, đọc bằng 0; các ô tô xám không được sử dụng cho Timer3

PIC18F2455/2550/4455/4550 được tích hợp 2 khối CCP (Capture/Compare/PWM),

mỗi khối chứa một thanh ghi 16-bit có thể hoạt động như một thanh ghi Capture 16-bit, thanh ghi Compare 16-bit hoặc như một thanh ghi Master/Slave Duty Cycle của PWM

Đối với các linh kiện 28 chân, hoạt động của 2 khối CCP chuẩn (CCP1 và CCP2) được

mô tả trong chương này Với các linh kiện 40/44 pin thì CCP1 được tích hợp như là một khối CCP tăng cường bao gồm các chế độ Capture, Compare, PWM chuẩn và một số tính năng tăng cường khác

7.5.1 Thanh ghi điều khiển CCPx chuẩn CCPxCON

Hình 7.16: thanh ghi CCPx

Bit 7-6 – Không sử dụng, đọc là bằng 0

Bit 5-4 – DCxB1:DCxB0: là bit 1 và bit 0 của duty cycle PWM (chu kỳ làm việc - khoảng

thời gian ở mức cao) ở khối CCPx

Capture mode: không sử dụng

Compare mode: Không sử dụng

PWM mode: Các bit này là 2 bit LSB (bit 1 và bit 0) chu kỳ làm việc (duty cycle) của

PWM 10 bit, 8 bit MSB của duty cycle nằm trong thanh ghi CCPR1L

Trang 24

Bit 3-0 – CCPxM3:CCPxM0: bit chọn mode cho khối CCPx

0100 = Capture mode: trên mỗi sườn xuống của xung clock

0101 = Capture mode: trên mỗi sườn lên của xung clock

0110 = Capture mode: trên mỗi sườn lên thứ 4 của xung clock

0111 = Capture mode: trên mỗi sườn lên thứ 16 của xung clock

1000 = Compare mode: khởi tạo chân CCPx ở mức thấp; khi xuất hiện trạng thái

trùng nhau sẽ đẩy chân CCPx lên mức cao (bit CCPxIF được set)

1001 = Compare mode: khởi tạo chân CCPx ở mức cao; khi xuất hiện trạng thái trùng

nhau sẽ đẩy chân CCPx xuống mức thấp (bit CCPxIF được set)

1010 = Compare mode: tạo ra ngắt phần mềm khi xuất hiện trạng thái trùng nhau

trong quá trình so sánh (bit CCPxIF được set, chân CCPx sẽ phản ánh trạng thái của I/O)

1011 = Compare mode: kích khởi theo sự kiện đặc biệt, thực hiện reset timer, khởi

động chuyển đổi A/D khi xuất hiện trạng thái trùng nhau ở khối CCP2 (bit CCPxIF được set)

11xx =PWM mode

7.5.2 Cấu hình khối CCP

Mỗi khối CCP thường kết hợp với một thanh ghi điều khiển (CCPxCON) và một thanh

ghi dữ liệu (CCPRx) Thanh ghi dữ liệu bao gồm 2 thanh ghi 8-bit : CCPRxL (byte thấp) và CCPRxH (byte cao), cả 2 thanh ghi đều có thể ghi và đọc trực tiếp

Tài nguyên timer của khối CCP

Khối CCP sẽ sử dụng Timer1, 2 hoặc 3 phụ thuộc vào chế độ đang được chọn Trong khi Timer1 và Timer3 được sử dụng trong chế độ Capture hoặc Compare, thì Timer2 được dùng trong chế độ tạo PWM

Bảng 7.5: timer sử dụng cho khối CCP

Capture Compare

Timer1 hoặc Timer3 Timer1 hoặc Timer3

Trang 25

PWM Timer2 Việc kết nối từng timer riêng biệt đến khối CCP được xác định bằng bit cho phép gán Timer cho CCP trong thanh ghi T3CON Cả hai khối CCP đều có thể được kích hoạt tại bất

kỳ thời điểm nào và có thể chia sẽ cùng một timer nếu như chúng được cấu hình hoạt động ở

cùng chế độ (Capture/Compare hoặc PWM) tại cùng thời điểm Sự tương quan giữa hai khối được tổng hợp trong bảng 7.6 (cho cả khối chuẩn và khối tăng cường), chú ý rằng nếu Timer1

ở chế độ Counter bất đồng bộ thì hoạt động capture sẽ không làm việc

Bảng 7.6: tương quan giữa CCP1 và CCP2 đối với các Timer Chế độ

CCP1

Chế độ

Capture Capture Mỗi khối có thể sử dụng TMR1 hoặc Timer3 làm cơ sở

thời gian Cơ sở thời gian có thể khác nhau đối với từng CCP

Capture Compare - CCP2 có thể được cấu hình về chế độ Special Event

Trigger để reset TMR1 hoặc TMR3 (tùy theo cơ sở thời gian nào được sử dụng)

- Chuyển đổi ADC tự động theo trigger event cũng có thể được thực hiện

- Hoạt động của CCP1 có thể bị ảnh hưởng nếu nó sử dụng cùng một timer làm cơ sở thời gian

Compare Capture - CCP1 có thể được cấu hình về chế độ Special Event

Trigger để reset TMR1 hoặc TMR3 (tùy theo cơ sở thời gian nào được sử dụng)

- Hoạt động của CCP2 có thể bị ảnh hưởng nếu nó sử dụng cùng một timer làm cơ sở thời gian

Compare Compare - Mỗi khối có thể được cấu hình về chế độ Special

Event Trigger để reset cơ sở thời gian

- Chuyển đổi ADC tự động theo trigger event của CCP2 có thể được thực hiện

- Xung đột có thể xảy ra nếu cả 2 khối sử dụng cùng một cơ sở thời gian

Việc gán chân cho CCP2 (làm ngõ vào Capture, ngõ ra Compare và PWM) có thể thay

đổi tùy theo cấu hình của khối Bit chọn cấu hình CCP2MX sẽ xác định chân CCP2 được đa

hợp chức năng với chân nào Mặc định CCP2 sẽ được gán đến chân RC1 (CCP2MX = 1)

Nếu bit cấu hình được xoá thì CCP2 sẽ đa hợp chức năng với chân RB3

Ngày đăng: 21/12/2017, 12:19

TỪ KHÓA LIÊN QUAN

w