IV. NGÀY HỒN THÀNH NHI ỆM VỤ:
2.4.3 Timer/counter1 (Timer/counter 16 bits)
Cĩ lẽ đây là Timer/counter phức tạp và khĩ sử dụng nhất trong ba Timer/counter. Sơđồ nguyên lý Timer/counter 1:
imer/counter1 cĩ thể chọn nguồn clock từ CK, bộ chia tần số CK hoặc từ một chân bên ngồi. Khi đĩ ta cĩ thể dùng Timer/counter1 nhưmiêu tả chức năng trong thanh ghi
điều khiển Timer/counter1 (TCCR1A và TCCR1B). Các cờ trạng thái khác nhau (cờ tràn TOV1, cờ so sánh OCF1A, OCF1B và cờ bắt sống ngõ vào ICF1) cĩ thể tìm thấy trong thanh ghi TIFR. Tín hiệu điều khiển Timer/counter1 cĩ thể được thiết lập trong TCCR1A và TCCR1B. Để thiết lập các ngắt do Timer/counter1 ta thiết lập các bit trong thanh ghi TIMSK.
Khi Timer/counter1 sử dụng nguồn clock bên ngồi, để đảm bảo sự lấy mẫu chính xác tần số tối đa của nguồn clock bên ngồi là CK/2.
Timer/counter1 hổ trợ hai chức năng so sánh ngõ ra sử dụng thanh ghi OCR1A và OCR1B nhưnguồn dữ liệu để so sánh với nội dung chứa trong thanh ghi Timer/counter1: TCNT1 (gồm TCNT1H và TCNT1L). Trong những điều kiện đặc biệt ta khơng thể điều khiển sự tràn của timer, thì ngắt do so sánh ngõ ra cĩ thể được sử dụng. Thanh ghi so sánh ngõ ra OCRx cĩ thể được nạp với giá trị nằm trong khoảng [0..maxval] (maxval là giá trị tối đa của Timer/counter ) và timer sẽ kiểm tra giá trị này tại mỗi chu kỳ xung clock của timer. Khi timer tiến đến giá trị so sánh, cờ so sánh ngõ ra tương ứng (OCFx) trong thanh ghi TIFR sẽ được set. Timer cĩ thể được đặt cấu hìnhđể xố bộ đếm về 0 trong thời điểm này. Các chân ngõ ra OC1x cĩ thể được đặt cấu hình để xố về 0, thiết lập lên 1 hoặc thay đổi tự động sau mỗilần so sánh. Đặc tính này rất hữu ích để ta cĩ thể tạo ra sĩng vuơng cĩ tần số khác nhau. Nĩ cho phép chúng ta thực hiện chức năng của một DAC (digital to analog convertion). Chế độ PWM (điều chế độ rộng xung) là một chế độ đặc biệt thích hợp để ta tạo ra các dạng sĩng khác nhau. Timer/counter1 cĩ thể được sử dụng nhưmột bộ điều chế độ rộng xung 8, 9 hoặc 10 bit.
Timer/counter1 cịn cung cấp một chức năng đặc biệt khác đĩ là chức năng bắt sống ngõ vào. Trên vi điều khiển AVR cĩ một chân để kích (trigger) sự kiện bắt sống ngõ vào ICP (Input Capture Pin). Sự thay đổi mức tín hiệu trên chân này sẽ làm cho giá trị hiện hành trong timer được đọc và lưu trữ trong thanh ghi bắt sống ngõ vào ICR1(input capture register). Vào thời điểm này, cờ bắt sống ngõ vào ICF1 trong thanh ghi TIFR sẽ được thiết lập lên 1.Điều này cực kỳ hữu ích trong việc đo độ rộng của xung bên ngồi. Ngồi ra, bộ so sánh Analog cũng cĩ thể được thiết lập lên 1 để trigger sự kiện bắt sống ngõ vào.
Sơđồ nguyên lý chân ICP.
Đây là thanh ghi timer/counter hiện thời. Một giá trị đã nạp vào thanh ghi nàyđược sử dụng làm giá trị xuất phát (bắt đầu), và bộ định thời làm tăng giá trị này theo từng tín hiệu xung nhịp của nĩ nếu bộ timer/counter0 được cho phép qua thanh ghi TCCR0.
Sau khi bộ timer/counter0 bị tràn, được đặt lại về $00 và tiếp tục đếm tiếp theo từng tín hiệu xung nhịp timer/cuonter0.
a. Thanh ghi Ađiều khiển Timer/counter1
Bit 7,6: Các bit điều khiển COM1A1 và COM1A0 quy định bất kỳ tác động nào của chân lối ra kế tiếp theo một lần so sánh trong bộ timer/counter1. Bất kỳ tác động nào của chân lối ra đều ảnh hưởng đến chân OC1 (Output Compare pin 1). Đây là một chức năng lựa chọn đối với cổng I/O và bitđiều khiển hướng tươngứng cần phải được
đặt thành 1để điều khiển một chân lốira.
Bit 5,4 : COM1B1 và COM1B0 cĩ chức năng tương tự nhưbit 7,6. Ở đây vị mạch cĩ hai chức năng so sánh.
Bảng 2.8 Thiết lập thanh ghi A điều khiển Timer/Counter1COM1X1 COM1X1 Description COM1X1 COM1X1 Description
0 0 Timer/counter1 ngắt ra khỏi chân lối ra OC1X
0 1 Kim tra (toglle) lối ra OC1X 1 0 Xĩa lối ra OC1X thành 0 1 1 Đặt lối ra OC1X thành 1
Bit 3,2 : Là các bit dự trữ trong AT90S8515và luơnđược đọc giá trị 0.
Bit 1,0 : Các bit lựa chọn bộ điều chế độ rộng xung (Pulse Width Modulator). Các bit này lựa chọn thao tác PWM của bộ timer/counter1 được cho ở bảng sau:
PWM11 PWM10 Description
0 0 Thao tác PWM của timer/counter bị cấm 0 1 PWM 8 bit
1 0 PWM 9 bit 1 1 PWM 10 bit
b. Thanh ghi B điều khiển Timer/counter1
Hình 2.22 Cấu trúc thanh ghi A điều khiển Timer/Counter1
Bit 7 : Khi bit ICNC1 bit bị xĩa thành 0 chức năng input capture trigger noise canceler bị cấm. Mạch input capture được lật trạng thái ở sườn dương/ âm đầu tiên được lấy mẫu trên chân ICP (input capture pin) nhưđược chỉ định. Khi bit ICNC1 được đặt thành 1, 4 mẫu đãđuợc lấy trọn vẹn được đo trên chân ICP và tất cả các mẫu cần phải phù hợp về mức High/Low với thơng số kỹ thuật về input capture trigger quy định cho bit ICES. Tần số lấy mẫu hiện thời là tần số đồng hồ XTAL.
Bit 6 : Lựa chọn sườn input capture 1. Khi bit ICES1 được xĩa thành 0, nội dungcủa bộ timer/counter1 được truyền đến thanh ghi ICR1 (input capture register), trên sườn âm của chân ICP (input capture pin). Khi bit ICES1 được đặt thành 1 thì nội dung của bộ timer/counter1 được truyền đến thanh ghi ICR1 (input capture) trên sườn dương của chân ICP.
Bit 5,4 : Là các bit dự trữ trong AT90S8515 và luơnđược đọc giá trị là 0
Bit 3 : Xĩa timer/counter1 theo lần so sánh (clear timer/counter1 on compare match). Khi bit điều khiển CTC1 được đặt thành 1 bộ timer/counter1 được Reset về $0000 trong chu trìnhđồng hồ sau một lần so sánh. Nếu bit điều khiển CTC1 bị xĩa, thì bộ timer/counter1 tiếp tục đếm và khơng bị ảnh hưởng bởi kết quả sau lần so sánh. Bởi vì mỗi lần so sánh được phát hiện trong chu kỳ đồng hồ CPU kế tiếp theo lần trước, nên chức năng này sẽ thực hiện một cách khĩ khăn khi số chia tần số cao hơn 1 được sử dụng cho bộ định thời. Khi số chia tần số bằng 1 được sử dụng và thanh ghi so sánh A
đuợc đặt thành C thì bộ timer sẽ được thiết lập nhưsau : …|C-2|C-1| C | 0 | 1 |…
Khi mà bộ chia tần được đặt số chia thành 8, bộ định thời sẽ đếm giống nhưsauđây : …|C-2, C-2, C-2, C-2, C-2, C-2, C-2, C-2|C-1, C-1, C-1, C-1, C-1, C-1, C-1, C-1| C,0 ,0,0,0,0,0,0|…
Bit 2,1,0 : là các bit lựa chọn nguồn chia tần số của bộ timer/counter1 Bảng2.9 Thiết lập thanh ghi B điều khiển Timer/Counter1
CS12 CS11 CS10 Description
0 0 0 Stop the timer/counter1 is stopped
0 0 1 CK
0 1 0 CK/8
0 1 1 CK/64
1 0 0 CK/256
1 0 1 CK/1024
1 1 0 External Pin T1, falling edge 1 1 1 External Pin T1, rising edge
c. Thanh ghi Timer/counter1 TCNT1 (gồm TCNT1H và TCNT1L)
Thanh ghi 16 bit này chứa giá trị được đem chia tần số của bộ timer/counter 16 bit. Để
đảm bảo rằng cả hai byte High và Low được đọc và ghi đồng thời khi khối CPU try nhập các thanh ghi này, việc truy nhập được thực hiện bằng cách sử dụng một thanh ghi tạm thời 8 bit (TEMP). Thanh ghi tạm thời này cũng được sử dụng khi truy nhập OCR1A và ICR1. Nếu chương trình chính và cả đoạn chương trình ngắt cũng thực hiện việc truy nhập đến các thanh ghi bằng cách sử dụng TEMP, thì các ngắt cần phải bị cấm (disable) trong khoảng thời gian truy nhập từ chương trình chính hoặc các ngắt truy nhập nếu các ngắt đượccho phép lại
TCNT1 Timer/Counter1 write : khi CPU ghi vào byte cao (High) TCNT1H, dữ liệu đã ghi được đặt vào trong thanh ghi TEMP. Tiếp theo khi khối CPU ghi byte thấp TCNT1L, byte dữ liệu nàyđược kết hợp với byte dữ liệu trong thanh ghi TEMP, và tồn bộ 16 bit được ghi đồng thời vào thanh ghi TCNT1 Timer/Counter1. Do đĩ byte High TCNT1H cần phải được truy cập trước tiên đối với thao tác ghi trọn vẹn thanh thi 16 bit.
TCNT1 Timer/Counter1 read : khi khối CPU đọc byte thấp TCNT1L, dữ liệu của byte thấp TCNT1L được gửi tới CPU và dữ liệu của byte cao TCNT1H bị thay thế trong thanh ghi TEMP. Khi khối CPUđọc dữ liệu trong byte High TCNT1H thì CPU nhận dữ liệu trong thanh ghi TEMP. Do đĩ byte thấp TCNT1L cần phải được truy nhập trước tiên đối với thao tác đọc trọn vẹn thanh ghi 16 bit. Bộ timer/counter1 được thiết kế để hoạt động nhưmột bộ đếm tiến hoặc tiến/lùi (trong chế độ PWM) với thao tác truy nhập đọc và ghi. Nếu bộ timer/counter1 được ghi vào và một nguồn xung nhịp
được lựa chọn thì bộ timer/counter1 tiếp tục đếm trong chu trìnhđồng hồ định thời sau khi nĩđược đặt trước (Reset) bằng giá trị đãđược ghi.
d. Thanh ghi so sánh-A ngõ ra của Timer/counter1 OCR1A (gồm OCR1AH và OCR1AL)
Thanh ghi so sánh lỗi ra (output compare register) là một thanh ghi đọc/ghi 16 bit. Thanh ghi OCR bộ timer/counter1 chứa dữ liệu cần được so sánh liên tục với bộ timer/counter1. Diễn biến của những lần so sánh (actions on compare matches) được chỉ định trên thanh ghi điều khiển và trạng thái timer/counter1.
Bởi vì thanh ghi so sánh lối ra OCR1A là một thanh ghi 16 bit nên một thanh ghi tạm thời TEMP được sử dụng khi ghi vào OCR1A để bảo đảm rằng cà hai byte được cập nhật đồng thời. Khi CPU ghi byte cao OCR1AH dữ liệu được lưu trữ tạm thời trong thanh ghi. Khi khối CPU ghi byte thấp OCR1AH thanh ghi TEMPđược ghi đồng thời vào OCR1AH. Do đĩ byte cao OCR1AH cần phải được ghi trước tiên đối với một thao tác ghi trọn vẹn thanh ghi 16 bit. Thanh ghi TEMP cũng được sử dụng khi truy nhập TCNT1 và ICR1. Nếu chương trình chính và đoạn chương trình ngắt (routine) cũng thực hiện thao tác truy nhập lên các thanh ghi bằng cách sử dụng TEMP, các ngắt cần phải bị cấm trong thời gian xảy ra quá trình truy nhập từ chương trình chính hoặc các ngắt truy nhập nếu các ngắt được cho phép lại.
e. Thanh ghi so sánh-B ngõ ra của Timer/counter1 OCR1B (gồm OCR1BH và OCR1BL)
Các thanh ghi so sánh lối ra (output compare) là các thanh ghi đọc/ghi 16 bit. Các thanh ghi so sánh lối ra bộ timer/counter1 chứa dữ liệu được so sánh liên tục với timer/counter1.
Diến biến của những lần so sánh được chỉ định trong thanh ghi điều khiển và trạng thái timer/counter1. Một lần so sánh chỉ xảy ra nếu timer/counter1 đếm đến giá trị OCR.
Hình 2.25 Cấu trúc thanh ghi so sánh A ngõ ra của Timer/Counter1 - OCR1A
Một phần mềm thực hiện thao tác ghi, đặt TCNT1 và OCR1A hoặc OCR1B thành cùng giá trị, sẽ khơng tạo ra một lần so sánh.
Một lần so sánh sẽ đặt cờ ngắt so sánh trong chu kỳ đồng hồ CPU kế tiếp theo sự kiện so sánh. Bởi vì các thanh ghi so sánh lối ra OCR1A và OCR1B là các thanh ghi 16 bit, nên một thanh ghi tạm thời TEMP được sử dụng khi OCR1A/B được ghi để bảo đảm là cả hai byte được cập nhật đồng thời. Khi CPU ghi byte cao OCR1AH hoặc OCR1BH dữ liệu được lưu trữ tạm thời vào thanh ghi TEMP. Khi khối CPU ghi byte thấp, OCR1AL hoặc OCR1BH thanh ghi TEMP ghi đồng thời vào OCR1AH hoặc OCR1BH. Do đĩ byte cao OCR1AH hoặc OCR1BH cần phải được ghi trước tiên đối với một thao tác ghi trọn vẹn thanh ghi 16 bit.
f. Thanh ghi bắt sống ngõ vào Timer/counter1 ICR1H và ICR1L)
Thanh ghi Iput capture là một thanhghi 16 bit chỉ để đọc. Khi sườn dương hoặc sườn âm (phù hợp với việc thiết lập sườn input capture, ICES1) của tín hiệu ở chân input capture - ICP, được phát hiện giá trị hiện thời của bộ timer/counter1 được truyền đến thanh ghi input capture – ICR1. Đồng thời cờ input capture ICF1 được đặt thành 1. Bởi vì thanh ghi input capture ICR1 là một thanh ghi 16 bit, nên một thanh ghi tạm thời TEMP được sử dụng để khi ICR1 được đọc cĩ thể đảm bảo rằng cả hai byte được
đọc đồng thời. Khi CPU đọc byte thấp ICR1L, dữ liệu được gửi đến khối CPU và dữ liệu của byte cao ICR1H được đặt vào thanh ghi TEMP. Khi khối CPU đọc dữ liệu trong byte cao ICR1H khối CPU nhận dữ liệu trong thanh ghi TEMP. Do đĩ byte thấp ICR1H cần phải được truy nhập trước tiên đối với một thao tác đọc trọn vẹn thanh ghi 16 bit. Thanh ghi TEMP cũng được sử dụng khi truy nhập TCNT1 và OCR1A. Nếu chương trình chính và cả đoạn chương trình ngắt thực hiện việc truy nhập đến các thanh ghi bằng cách sử dụng TEMP, thì các ngắt cần phải bị cấm trong thời gian truy nhập từ chương trình chính hoặc các ngắt truy nhập nếu các ngắt được cho phép lại.
g. TIMER/COUNTER1 trong chế độ điều chếđộ rộng xung
Khi chế độ PWM được chọn, bằng cách thiết lập Timer/counter1, thanh ghi so sánh ngõ ra OCR1A và thanh ghi so sánh ngõ ra OCR1B, các chân ngõ ra PD5 (OC1A) /PD4 (OC1B) cĩ thể xuất ra xung được điều chế PWM đúng pha hoặc chạy khơng đều hoặc chạy tự do 8bit, 9bit hoặc 10 bit. Timer/counter1 hoạt động nhưmột bộ đếm lên/xuống, đếm lên từ giá trị $0000 đến giá trị TOP (xem bảng sau), vàkhi đĩ nĩ quay trở lại đếm về zero trước khi chu kỳ nàyđược lặp lại. Khi giá trị đếm bằng giá trị 10
bit cĩ trọng số thấp nhất trong thanh ghi OCR1A hoặc OCR1B, Các chân PD5(OC1A)/PD4(OC1B) được thiết lập lên một hoặc xố về 0 tuỳ thuộc vào cách thiết lập các bit COM1A1/COM1A0 hoặc COM1B1/COM1B0 trong thanh ghi điều khiển Timer/counter1 (TCCR1A).
Bảng 2.10 Giá trịTOP và tần số PWM
FTCK1chính là tần số xung nhịp của Timer/counter1.
Chú ý rằng nếu thanh ghi so sánh chứa giá trị TOP và bộ chia khơng được sử dụng (khi đĩ tần số đếm của bộ định thời là CK bằng cách thiết lập : CS12 CS11 CS10 = 001), ngõ ra PWM sẽ khơng sinh ra bất kỳ xung nào bởi vì giá trị đếm lên và đếm xuống được tiến đến ngay tức thì. Khi bộ chia được sử dụng (CS12 CS11 CS10 ≠ 001 hoặc 000), ngõ ra PWM được kích hoạt khi bộ đếm tiến đến giá trị TOP nhưng trong so sánh khi đếm xuống (lúc bộ đếm tiến đến giá trị TOP) thì khơng trùng khớp thời gian với lúc bộ đếm gặp giá trị TOP khi đếm lên nên một chu kỳ xung PWM được phát sinh. Đây là vấn đề hơi khĩ hiểu, nhưng nếu ta ngẫm nghĩ kỉ và xem lại phần thanh ghiđiều khiển Timer/counter1 TCCR1B thì ta sẽ thấy điều này hồn tồnđúng. Chọn chế độ so sánh 1 trong PWM
Bảng 2.11 Thiết lập chế độ so sánh 1 trong PWM
Chú ý :X = A hoặc B
Một điểm lưu ý khác là trong chế độ PWM, 10 bits cĩ trọng số thấp trong thanh ghi OCR1A/OCR1B, khi viết, được truyền đến một địa chỉ tạm thời. Chúng được chốt khi Timer/counter1 tiến đến giá trị TOP. Điều này ngăn chặn sự phát sinh một xung PWM “thừa” (khơng đều, khơng mong muốn) do sự vận hành ghi giá trị lên các thanh ghi OCR1A/OCR1B khơngđược đồng bộ.
Xem hình bên dưới nhưmột ví dụ: Synchronized : Đồng bộ
Unsynchronized : khơngđồng bộ. Counter value : giá trị bộ đếm (timer)
Compare value : giá trị so sánh
Compare value changes : thayđổi giá trị so sánh PWM Output OC1X : chân ngõ ra PWM
Trong suốt thời gian giữa hai sự vận hành viết và chốt, khi ta đọc giá trị từ thanh ghi OCR1A/OCR1B thì giá trị đọc được sẽ là nội dung của địa chỉ tạm.
Khi thanh ghi OCR1A/OCR1B chứa giá trị $0000 hoặc TOP, ngõ ra OC1A/OC1B
được cập nhật (updated) đến mức cao hoặc thấp vào lần so sánh tiếp theo tuỳ thuộc cách thiết lập của
COM1A1/COM1A0 hoặc COM1B1/COM1B0. Điều nàyđược thể hiện trong bảng sau :
Chú ý :X = A hoặc B
Trong chế độ PWM, Cờ tràn Timer/counter1 TOV1 được thiết lập lên 1 khi bộ đếm tiến về giá trị $0000. Ngắt do tràn Timer1 vẫn hoạt động nhưtrong chế độ Timer/counter bình thường. Chương trình ngắt do tràn timer1 sẽ được thi hành nếu cờ TOV1được thiết lập lên 1, bit cho phép ngắt do tràn Timer/counter1 TOIE1 được thiết