Output Compare là gì

TIMER/COUNTER I, Mở đầu Phần này, chúng ta sẽ học và nắm được các vấn đề sau: • • • • • Nắm bắt cơ bản các bộ Timer/Counter có trên AVR. Sử dụng các Timer/Counter như các bộ định thời. Sử dụng các Timer/Counter như các bộ đếm. Sử dụng các Timer/Counter như các bộ tạo xung điều rộng PWM. Viết một ví dụ điều khiển động cơ RC servo bằng PWM. II, Tổng quan về các bộ timer/counter trên chip atmega16 Timer/Counter là các module độc lập với CPU. Chức năng chính của các bộ Timer/Counter, như tên gọi của chúng, là định thì [tạo ra một khoảng thời gian, đếm thời gian…] và đếm sự kiện. Trên các chip AVR, các bộ Timer/Counter còn có thêm chức năng tạo ra các xung điều rộng PWM [Pulse Width Modulation], ở một số dòng AVR, một số Timer/Counter còn được dùng như các bộ canh chỉnh thời gian [calibration] trong các ứng dụng thời gian thực. Các bộ Timer/Counter được chia theo độ rộng thanh ghi chứa giá trị định thời hay giá trị đếm của chúng, cụ thể trên chip Atmega16 có 2 bộ Timer 8 bit [Timer/Counter0 và Timer/Counter2] và 1 bộ 16 bit [Timer/Counter1]. Chế độ hoạt động và phương pháp điều khiển của từng Timer/Counter cũng không hoàn toàn giống nhau, ví dụ ở chip Atmega16: Timer/counter0: Là một bộ định thời/đếm đa năng 8 bit. Gồm các tính năng: - Bộ đếm đơn kênh [Single Channel Counter]. - Xóa timer khi xảy ra bằng trong so sánh [Clear Timer On Compare MathAuto Reload]. - Bộ tạo xung điều rộng [Glitch – Free, Phase Correct Pulse Width ModulatorPWM]. - Bộ định thời [Frequency Generator]. - Bộ đếm sự kiện ngoài [External Event Counter]. - Bộ đếm gộp 10 bit [10-bit Prescaler]. - Ngắt tràn và ngắt so sánh [Overflow And Compare Math Interrupt SourceTVO0 and OCF0]. Timer/counter1: Là một bộ định thời/đếm đa năng 16 bit. Gồm các tình năng: - Chuẩn thiết kế 16 bit [True 16-bit Design]. - 2 bộ so sánh đầu ra độc lập [ Two Independent Output Compare Units]. - Các thanh ghi so sánh đầu ra kép [Double Buffered Output Compare Registers]. - 1 bộ bắt giữ đầu vào [One Input Capture Unit]. - Bộ khử nhiễu đầu vào [Input Capture Noisy Canceler]. - Xóa timer khi sảy ra bằng trong so sánh [Clear Timer On Compare MathAuto Reload]. - Bộ tạo xung điều rộng [Glitch – Free, Phase Correct Pulse Width ModulatorPWM]. - Variable PWM period. - Bộ định thời [Frequency Generator]. - Bộ đếm sự kiện ngoài [External Event Counter]. - 4 Ngắt độc lập [TOV1, OCF1A, OCF1B, and ICF1]. Timer/counter2: Là bộ định thời/đếm đa năng 8 bit. Gồm các tính năng: - Bộ đếm đơn kênh [Single Channel Counter]. - Xóa timer khi sảy ra bằng trong so sánh [Clear Timer On Compare MathAuto Reload]. - Bộ tạo xung điều rộng [Glitch – Free, Phase Correct Pulse Width ModulatorPWM]. - Bộ định thời [Frequency Generator]. - Bộ đếm gộp 10 bit [10-bit Prescaler]. - Ngắt tràn và ngắt so sánh [Overflow And Compare Math Interrupt SourceTVO0 and OCF0]. - Cho phép xung nhịp ngoài 32 kHz hoạt động độc lập với xung nhịp I/O [Ứng dụng thời gian thực]. III, Sử dụng timer/counter. Một số định nghĩa quan trọng cần nắm bắt trước khi sử dụng timer/counter. − BOTTOM: Giá trị thấp nhất mà một T/C có thể đạt được, luôn là 0. − MAX: Giá trị lớn nhất mà một T/C có thể đạt được, tùy mỗi T/C. VD: T/C0, T/C 2 là các T/C 8 bit nên MAX = 0xFF = 255 = 2^8 – 1. T/C1 là T/C 16 bit nên MAX = 0xFFFF = 65525 = 2^16 – 1. − TOP: là giá trị mà khi T/C đạt đến nó sẽ thay đổi trạng thái, giá trị này không nhất thiết là số lơn nhất 8 bit hay 16 bit như MAX, giá trị của TOP có thể thanh đổi bằng cách điều khiển các bit điều khiển tương ứng hoặc có thể nhập trừ tiếp thông qua một số thanh ghi. Chúng ta sẽ hiểu rõ về giá trị TOP trong lúc khảo sát hoạt động của T/C. 1, Timer/Counter0. Để điều khiển hoạt động của T/C0 ta dùng đến 5 thanh ghi: TCCR0, TCNT0, OCR0, TIFR, TIMSK. 1.1, Thanh ghi điều khiển T/C0 – TCCR0 [Timer/Counter Control Register]. − Bit 7 – FOC0: Force Output Compare. Bit FOC0 chỉ hoạt động khi bit WGM00 được sét ở chế độ non-PWM. Tuy nhiên, Để đảm bảo tính tương thích, bit này phải được sét về 0 khi TCCR0 được ghi ở chế độ PWM. − Bit 6, 3 – WGM00, WGM01: Waveform General Mode Các bit điều khiển quá trình hoạt động của bộ đếm, giá trị lớn nhất [TOP] của bộ đếm, và dạng tín hiệu được sử dụng. Các phương thức hoạt động của timer/counter gồm có: Chế độ bình thường [Normal Mode], Chế độ xóa timer khi sảy ra bằng trong so sánh [TCT], và 2 chế độ tạo xung điều rộng [PWM]. Bảng các phương thức hoạt động: − Bit 5, 4 – COM01, COM00: Compare Math Ouput Mode. Các bit điều khiển kiểu so sánh. Nếu một trong hai bit được sét, đầu ra OC0 sẽ ghi đè lên chức năng của cổng được kết nối. Tuy nhiên, cần chú ý bit thanh ghi hướng dữ liệu [DDR] của chân kết nối phải là chân ra. Compare Output Mode, non-PWM Mode : Compare Output Mode, Fast PWM Mode: Compare Output Mode, Phase Correct PWM Mode: − Bit 2:0 – CS02:0: Clock select: 3 bit dùng để chọn xung nhịp hoạt động cho Timer/Counter0. Clock Select Bit Description : Nếu chế độ dùng xung ngoài được chọn, thì chân T0 sẽ được nối với xung ngoài và dùng để đếm sự kiện nếu nó được cài đặt là chân ra [bộ đếm sự kiện]. 1.2, Thanh ghi Timer/Counter – TCNT0 [Timer/Counter Register]. Thanh ghi TCNT0 cho phép truy cập trực tiếp, cả đọc và ghi. 1.3, Thanh ghi so sánh đầu ra – OCR0 [Output Compare Register]. Thanh ghi OCR0 chứa một giá trị 8 bit để so sánh với giá trị của thanh ghi TCNT0. Nó có thể dùng để tạo ra một tín hiệu ngắt, hoặc một dạng tín hiệu ra ở chân OC0. 1.4, Thanh ghi mặt nạ ngắt T/C – TIMSK [Timer/Counter Interrupt Mask Register]. − Bit 1 - OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable Khi bit OCIE0 được ghi lên 1, và bit I của thanh ghi SREG được sét, ngắt so sánh của T/C0 được bật. các ngắt tương ứng được thực thi nếu một so sánh phù hợp trong Timer/Counter0 xảy ra, tức là, khi bit OCF0 được sét trong thanh ghi cờ ngắt T/C – TIFR. − Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable Khi bit TOIE0 được viết lên 1, và bit I của thanh ghi SREG được set, Ngắt tràn của T/C0 sẽ được bật. Các ngắt tương ứng được thực thi nếu sảy ra tràn trong T/C0, tức là, khi bit TOV0 được set trong thanh ghi cờ ngắt T/C – TIFR. 1.5, Thanh ghi cờ ngắt T/C – TIFR [Timer/Counter Interrupt Flag Register]. - Bit 1 – OCF0: Output Compare Flag 0 Bit OCF0 được sét khi sảy ra bằng trong so sánh giữa giá trị của T/C0 và dữ liệu ở OCR0 [Output Compare Register0]. OCF0 bị xóa khi đang sử lí vector ngắt tương ứng hoặc viết một giá trị logic vào cờ. Khi bit I ở thanh ghi SREG, bit OCIE0 và bit OCF0 được set, Ngắt so sánh của T/C0 được bật. Bit 0 – TOV0: Timer/Counter0 Overflow Flag Bit TOV0 được sét khi có một sự kiện tràn sảy ra ở T/C0. Bit TOV0 bị xóa khi đang sử lí vector ngắt tương ứng hoặc ghi một giá trị logic vào cờ. Khi bit I ở thanh ghi SREG, bit TOIE0 và bit TOV0 được set, Ngắt tràn của T/C0 được bật. Ở chế độ Phase Correct PWM, bit này được set khi T/C0 đổi chiều đếm ở 0x00. 1.6, Thanh ghi chức năng vào/ra đặc biệt – SFIOR [Special Function I/O Register] Bit 0 – PSR10: Prescaler Reset Timer/Counter1 and Timer/Counter0 Khi bit này được ghi lên 1, bộ đếm gộp T/C1 và T/C0 sẽ được reset. Bit bị xóa sau khi quá trình thực hiện hoàn thành. Ghi giá trị 0 vào bit này sẽ không có tác dụng gì. Chú ý: T/C1 và T/C2 có bộ đếm gộp giống nhau và một reset của bộ đếm gộp sẽ tác động lên cả 2. Bit này luôn bằng 0. 1.7, Bộ định thời Chúng ta có thể tạo ra 1 bộ định thì để cài đặt một khoảng thời gian nào đó. Ví dụ bạn muốn rằng cứ sau chính xác 1ms thì chân PB0 thay đổi trạng thái 1 lần [nhấp nháy], bạn lại không muốn dùng các lệnh delay như trước nay vẫn dùng vì nhược điểm của delay là “CPU không làm gì cả” trong lúc delay, vì thế trong nhiều trường hợp các lệnh delay rất hạn chế được sử dụng. Bây giờ chúng ta dùng T/C0 để làm việc này, ý tưởng là chúng ta cho bộ đếm T/C0 hoạt động, khi nó đếm đủ 1ms thì nó sẽ tự kích hoạt ngắt tràn, trong trình phục vụ ngắt tràn chúng ta hay đổi trạng thái chân PB0. Tôi minh họa ý tưởng như trong hình 1 Hình 1: so sánh 2 cách làm việc. [CPU nop: trong khoảng thời gian này CPU không làm gì cả] Một vấn đề nảy sinh lúc này, T/C0 chỉ đếm từ 0 đến 255 rồi lại quay về 0 [xảy ra 1 ngắt tràn], như thế dường như chúng ta không thể cài đặt giá trị mong muốn bất kỳ cho T/C0? Câu trả lời là chúng ta có thể bằng cách gán trước một giá trị cho thanh ghi TCNT0, khi ấy T/C0 sẽ đếm từ giá trị mà chúng ta gán trước và kết thúc ở 255. Tuy nhiên do khi tràn xảy ra, TCNT0 lại được tự động trả về 0, do đó việc gán giá trị khởi tạo cho TCNT0 phải được thực hiện liên tục sau mỗi lần xảy ra tràn, vị trí tốt nhất là đặt trong trình phục vụ ngắt tràn. Việc còn lại và cũng là việc quan trọng nhất là việc tính toán giá trị chia [prescaler] cho xung nhịp của T/C0 và việc xác định giá trị khởi đầu cần gán cho thanh ghi TCNT0 để có được 1 khoảng thời gian định thì chính xác như mong muốn. Trước hết chúng ta sẽ chọn prescaler sao cho hợp lí nhất [chọn giá trị chia bằng cách set 3 bit CS02,CS01,CS00]. Giả sử nguồn xung clock “nuôi” chip của chúng ta là clkI/O=8MHz tức là 1 nhịp mất 1/8us, nếu chúng ta để prescaler=1, tức là tần số của T/C0 [tạm gọi là fT/C0] cũng bằng clkI/O=8MHz, cứ 1/8us T/C0 được kích và TCNT0 sẽ tăng 1 đơn vị. Khi đó giá trị lớn nhất mà T/C0 có thể đạt được là 256 x 1/8us=32us, giá trị này nhỏ hơn 1ms mà ta mong muốn. Nếu chọn prescaler=32 [xem bảng 1] nghĩa là cứ sau 32 nhịp [4us] thì TCNT0 mới tăng 1 đơn vị, khả năng lớn nhất mà T/C0 đếm được là 256 x 4us=1024us, lớn hơn 1ms, vậy ta hoàn toàn có thể sử dụng prescaler=32 để tạo ra một khoảng định thì 1ms. Bước tiếp theo là xác định giá trị khởi đầu của TCNT0 để T/C0 đếm đúng 1ms [1000us]. Ứng với prescaler=32 chúng ta đã biết là cứ 4us thì TCNT0 tăng 1 đơn vị, dễ dàng tính được bộ đếm cần đếm 1000/4=250 lần để hết 1ms, do đó giá trị ban đầu của TCNT0 phải là 256250=6. Đầu tiên hãy mắc mạch điện như hình vẽ: int ms = 0,ss = 0,mm = 0,hh = 0; // bien ngoai // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr[void] // ngat tran khi TCNT0 tran { // Reinitialize Timer 0 value TCNT0=0x79; // set gia tri bot cua TCNT0 la 0x79 = 121 // Place your code here ms++; } Đoạn code cho timer trong hàm main: TCCR0=0x03; // prescaler la xung nhip cua chip chia cho 64 TCNT0=0x79; // set gia tri bot cua TCNT0 la 0x79 = 121 OCR0=0x00; TIMSK=0x01; // Bat ngat cua timer/counter0 ACSR=0x80; // set bit I len 1 lcd_clear[]; lcd_putnum[hh]; // ham hien thi so tren LCD [tu viet]. lcd_putchar[':']; lcd_putnum[mm]; lcd_putchar[':']; lcd_putnum[ss]; while [1] { // Place your code here if[ms >= 999] { ss++; ms = 0; lcd_clear[]; lcd_putnum[hh]; lcd_putchar[':']; lcd_putnum[mm]; lcd_putchar[':']; lcd_putnum[ss]; } if[ss >= 59] { mm++; ss = 0; } if[mm >= 59] { hh++; mm = 0; } if[hh >= 23] hh = 0; }; Ở đây chúng ta có 1 số lưu ý nhỏ: - Thứ nhất: theo datasheet thì TCCR0 = 0x03 ứng với mode prescaler là xung hệ thống chia cho 32 nhưng trong codevision thì lại là chia cho 64 nên giá trị BOT của T/C0 phải tính lại đó là 256 – 1000/64 = 121 = 0x79 - Thứ hai: việc khai báo sử dụng LCD tôi đã nói ở bài trước, nếu bạn nào quên thì đọc lại. - Thứ ba: hàm lcd_putnum[so] không phải là 1 hàm được định nghĩa sẵn trong thư viện lcd.h mà phải tự xây dựng. 1.8. Bộ đếm sự kiện Như đã trình bày ở trên, T/C0 còn có thể được dùng như là một bộ đếm sự kiện sảy ra từ bên ngoài bằng cách sử dụng xung kích bên ngoài TCCR0 = 0x06 [đếm cạnh xuống] hoặc TCCR0 = 0x07 [đếm cạnh lên]. Chân nhận xung kích từ bên ngoài đó là chân T0. Khi có 1 tín hiệu kích vào ở T0 thì TCNT0 sẽ tự động được tăng lên 1. Việc sử dụng ngắt hay không là tùy vào mục đích sử dụng. Chúng ta sẽ khảo sát ví dụ sau: nối một nút ấn vào chân T0 để tạo tín hiệu kích, dùng LCD để hiển thị giá trị của TCNT0 lên màn hình, một nút reset để đưa giá trị TCNT0 về 0. Code: PORTB=0xFF; // dung dien tro keo len ben trong DDRB=0x00; // PB la cong vao TCCR0=0x06; TCNT0=0x00; OCR0=0x00; TIMSK=0x00; // dem canh xuong // khong dung ngat while [1] { lcd_clear[]; lcd_putnum[TCNT0]; delay_ms[100]; if[!PINB.3] TCNT0 = 0; }; Ở đây cần lưu ý một điều đó là T0 là chân nhận tín hiệu vào vì vậy nó phải được xét là chân vào, ở đây tôi set cả PB là cổng vào và dùng điện trở kéo bên trong. Vì ta không dùng đến ngắt nên TIMSK = 0x00. 1.9. Phase correct PWM [Điều rộng xung với pha chính xác]. Đây là mode hoạt động rất quan trọng của các bộ timer, thường được dùng trong các ứng dụng điều khiển động cơ. Khi mode này được kích hoạt, một tín hiệu dạng xung sẽ được xuất ra ở chân OC0, tín hiệu này phụ thuộc vào các giá trị mà ta sét cho nó. Thanh ghi TCNT0 tự động tăng lên từ giá trị BOTTOM đến TOP và tự động giảm từ giá trị TOP về BOTTOM, tốc độ đếm của TCNT0 ở chế độ này cũng giống với chế độ hoạt động của bộ định thời. Giá trị của TCNT0 sẽ được so sánh với giá trị của thanh ghi OCR0 để điều khiển tín hiệu ra ở chân OC0. Bit 5, 4 – COM01, COM00 dùng để điều khiển các chế độ làm việc của mode Phase correct PWM [khi mode này đang được dùng]. • • • • COM01 = 0, COM00 = 0: disconnect OC0, không xuất tín hiệu ra chân OC0. COM01 = 0, COM00 = 1: Reserved, chế độ chờ. COM01 = 1, COM00 = 0: Xóa OC0 về 0 nếu sảy ra bằng trong so sánh khi đếm lên, và sét lên 1 nếu sảy ra bằng trong so sánh khi đếm xuống. COM01 = 1, COM00 = 1: Sét OC0 lên 1 nếu sảy ra bằng trong so sánh khi đếm lên, và xóa về 0 nếu sảy ra bằng trong so sánh khi đếm xuống. Khi sử dụng mode Phase correct PWM ta chủ yếu sử dụng 2 chế độ hoạt động cuối của nó [COM01 = 1]. Đoạn chương trình sau dùng để khởi tạo C/T0 ở chế độ Phase correct PWM: DDRB=0x08; TCCR0=0x63; TCNT0=0x00; OCR0=0x00;  Dòng đầu tiên sét chân PB3/OC0 là chân ra.  Dòng thứ 2 gồm có WGM00 = 1, WGM01 = 0 dùng để chọn mode cho T/C0 là Phase correct PWM, COM01 = 1, COM00 = 0 chọn chế độ hoạt động, CS02 = 0, CS01 = 1, CS00 = 1 tương ứng với Prescaler là chia cho 32 [Codevision là 64].  Dòng 3 là giá trị ban đầu của TCNT0  Dòng 4 là giá trị của thanh ghi OCR0 dùng để so sánh với TCNT0. Điều cần chú ý ở đây là giá trị OCR0 là thanh ghi 8 bít, giá trị của thanh ghi có thể thay đổi trực tiếp, trong lập trình ta sẽ thay đổi giá trị của thanh ghi này để tạo các xung điều rộng khác nhau. Bây giờ chúng ta sẽ làm một ví dụ nhỏ để hiểu rõ phương thức hoạt động của chế độ Phase correct PWM. Mạch mô phỏng: Ở đây dùng một dụng cụ để kiểm tra tín hiệu ngõ ra tên là OSCILLOSCOPE: Đầu tiên ra phải khởi tạo cho T/C0 hoạt động ở chế độ Phase correct PWM như ở trên. Trong hàm main viết đoạn chương trình sau để kiểm tra: while[1] { OCR0 = 255; delay_ms[1000]; OCR0 = 200; delay_ms[1000]; OCR0 = 150; delay_ms[1000]; OCR0 = 100; delay_ms[1000]; OCR0 = 50; delay_ms[1000]; OCR0 = 0; delay_ms[1000]; } Dịch và chạy thử mô phỏng xem kết quả. 1.10. Fast PWM [Điều rộng xung cao tần]. Chức năng nói chung là giống với chế độ Phase correct PWM, nhưng hoạt động được ở tần số cao. Cũng gồm các chế độ hoạt động giống như Phase correct PWM. Tuy nhiên, cách hoạt động có khác một chút đó là thanh ghi TCNT0 chỉ đếm thực hiện đếm tăng khi đến TOP thì lại reset về 0. • • • • COM01 = 0, COM00 = 0: Disconnect OC0, không xuất tín hiện ra chân OC0. COM01 = 0, COM00 = 1: Reseved, chế độ chờ. COM01 = 1, COM00 = 0: Clear OC0 on Compare math, set OC0 at TOP, xóa OC0 về 0 khi sảy ra bằng trong so sánh, set OC0 lên 1 khi đạt giá trị TOP. COM01 = 1, COM00 = 0: Set OC0 on Compare math, clear OC0 at TOP, set OC0 lên 1 khi sảy ra bằng trong so sánh, xóa OC0 về 0 khi đạt giá trị TOP. Đoạn chương trình sau dùng để khởi tạo C/T0 ở chế độ Fast PWM: DDRB=0x08; TCCR0=0x6B; TCNT0=0x00; OCR0=0x00;  Dòng đầu tiên sét chân PB3/OC0 là chân ra.  Dòng thứ 2 gồm có WGM00 = 1, WGM01 = 1 dùng để chọn mode cho T/C0 là Fast PWM, COM01 = 1, COM00 = 0 chọn chế độ hoạt động, CS02 = 0, CS01 = 1, CS00 = 1 tương ứng với Prescaler là chia cho 32 [Codevision là 64].  Dòng 3 là giá trị ban đầu của TCNT0  Dòng 4 là giá trị dùng để so sánh với TCNT0 chứa trong OCR0 Làm ví dụ tương tự như với Phase correct PWM. 1.11. CTC – Xóa timer khi sảy ra bằng trong so sánh. Giống như tên gọi của nó, thanh ghi TCNT0 sẽ bị xóa về 0 khi sảy ra một “Compare Math”. TCNT0 tự động tăng lên khi có một tín hiệu kích cho đến khi giá trị trong TCNT0 bằng giá trị trong OCR0 thì một “Compare Math” sẽ sảy ra và reset TCNT0 về 0, đồng thời một ngắt có thể sảy ra nếu đã được kích hoạt trước đó. Cách thức hoạt động của nó giống bộ định thời nếu tín hiệu kích sử dụng là xung nhịp chip và giống bộ đếm sự kiện nếu tín hiệu kích sử dụng là xung từ bên ngoài. Ví dụ: PORTB=0x01; // su dung dien tro keo len cho PB0 DDRB=0x00; // PB la cong nhan tin hieu PORTC=0x00; DDRC=0xFF; // PC la cong xuat tin hieu TCCR0=0x0E; // Su dung che do CTC, tin hieu kich tu ben ngoai canh xuong TCNT0=0x00; OCR0=0x07; // Gia tri dung de so sanh voi TCNT0 while [1] { PORTC = TCNT0; // Xuat gia tri cua TCNT0 ra PC }; 2, Timer/Counter1 Timer/Counter1 là bộ T/C 16 bits, đa chức năng. Đây là bộ T/C rất lý tưởng cho lập trình đo lường và điều khiển vì có độ phân giải cao [16 bits] và có khả năng tạo xung điều rộng PWM [Pulse Width Modulation – thường dùng để điều khiển động cơ]. Thanh ghi: có khá nhiều thanh ghi liên quan đến T/C1. Vì là T/C 16 bits trong khi độ rộng bộ nhớ dữ liệu của AVR là 8 bit nên đôi khi cần dùng những cặp thanh ghi 8 bits tạo thành 1 thanh ghi 16 bit, 2 thanh ghi 8 bits sẽ có tên kết thúc bằng các ký tự L và H trong đó L là thanh ghi chứa 8 bits thấp [LOW] và H là thanh ghi chứa 8 bits cao [High] của giá trị 16 bits mà chúng tạo thành. Các thanh ghi sử dụng cho T/C1: TCNT1, OCR1A/B, ICR1 là các thanh ghi 16 bit. TCCR1A/B là cá thanh ghi 8 bít, ngoài ra còn có thanh ghi cờ ngắt TIFR và thanh ghi mặt nạ ngắt TIMSK dùng chung cho các bộ T/C. • TCCR1A và TCCR1B [Timer/Counter Control Register]: là 2 thanh ghi điều khiển hoạt động của T/C1. Tất cả các mode hoạt động của T/C1 đều được xác định thông qua các bit trong 2 thanh ghi này. Tuy nhiên, đây không phải là 2 byte cao và thấp của một thanh ghi mà là 2 thanh ghi hoàn toàn độc lập. Các bit trong 2 thanh ghi này bao gồm các bit chọn mode hay chọn dạng sóng [Waveform Generating Mode – WGM], các bit quy định dạng ngõ ra [Compare Output Match – COM], các bit chọn giá trị chia prescaler cho xung nhịp [Clock Select – CS]…Cấu trúc của 2 thanh ghi được trình bày như bên dưới. * Chú ý: T/C1 có 2 kênh tín hiệu ra là OC1A và OC1B làm việc hoàn toàn độc lập với nhau gọi chung là kênh A và kênh B còn T/C0 chỉ có 1 kênh tín hiệu ra đó là OC0.  COM1A1:0: Compare Output Math for Channel A  COM1B1:0: Compare Output Math for Channal B COM1A1:0 và COM1B1:0 điều khiển dạng tín hiệu ra [OC1A và OC1B]. Cần ghi nhớ các mode hoạt động của hai kênh như ở dưới bảng sau: Compare Output Mode, Non-PWM Compare Output Mode, Fast-PWM Compare Output Mode, Phase Correct and Phase and Frequency Correct PWM  FOC1A: Force Output Compare for Channel A  FOC1B: Force Output Compare for Channel B FOC1A và FOC1B chỉ hoạt động ở chế độ Non-PWM. Tuy nhiên, để đảm bảo tính tương thích, những bit này cần được xóa về 0 khi TCNT1 được ghi ở chế độ PWM. Khi ghi 1 vào FOC1A/FOC1B, một “Compare Math” tức thì được tạo ra trên bộ tạo dạng sóng [Waveform Generator Unit]. Dạng ngõ ra OC1A/OC1B biến đổi theo sự cài đặt các bit COM1A1:0/COM1B1:0.  WGM13:0: Waveform Generation Mode Các bit này điều khiển trình tự đếm của bộ đếm, Giá trị đỉnh của bộ đếm [TOP], và dạng sóng sử dụng. Các chế độ được cho dưới bảng sau:  ICNC1: Input Capture Noise Canceler Set ICNC1 lên 1 để kích hoạt bộ khử nhiễu đầu vào [the input capture noise canceler]. Khi bộ khử nhiễu được kích hoạt, tín hiệu đầu vào được lọc.  ICES1: Input Capture Edge Select Bit này lựa chọn cạnh cho tín hiệu kích. Khi ICES1 bằng 0, tín hiệu kích là cạnh xuống, và khi ICES1 bằng 1 tín hiệu kích là cạnh lên.  CS12:0: Select Clock Nếu chế độ xung ngoài được sử dụng cho T/C1, chân T1 sẽ được dùng để nhận tín hiệu xung từ bên ngoài vào. Tính năng này được dùng để đếm sự kiện sảy ra bên ngoài. • TCNT1H và TCNT1L [Timer/Counter Register]: là 2 thanh ghi 8 bit tạo thành thanh ghi 16 bits [TCNT1] chứa giá trị vận hành của T/C1. Cả 2 thanh ghi này cho phép bạn đọc và ghi giá trị một cách trực tiếp. 2 thanh ghi được kết hợp như sau: • OCR1AH và OCR1AL [Output Compare Register 1A] • OCR1BH và OCR1BL [Output Compare Register 1B] Hai thanh ghi chứa các giá trị 16 bit dùng để so sánh với thanh ghi TCNT1. Có thể dùng để tạo ngắt hoặc tạo dạng sóng ra ở 2 chân OC1A và OC1B tương ứng. • ICR1H và ICR1L [Input Capture Register 1] The Input Capture được cập nhật với giá trị bộ đếm mỗi lần một sự kiện xuất hiện trên chân ICP1, The Input Capture có thể được sử dụng làm giá trị TOP cho bộ đếm. • TIMSK  Bit 5 – TICIE1: T/C1, Input Capture Interrupt Enable Khi TICIE1 được set lên 1 và bit I của SREG được bật, ngắt Input Capture của T/C1 được bật.  Bit 4 – OCIE1A: T/C1, Output Compare A Math Interrupt Enable Khi OCIE1A được set lên 1 và bit I của SREG được bật, ngắt so sánh đầu ra A của T/C1 được bật.  Bit 3 – OCIE1B: T/C1, Output Compare B Math Interrupt Enable Khi OCIE1B được set lên 1 và bit I của SREG được bật, ngắt so sánh đầu ra B của T/C1 được bật.  Bit 2 – TOIE1: T/C1, Overflow Interrupt Enable Khi TOIE1 được set lên 1 và bit I của SREG được bật, ngắt tràn của T/C1 được bật. • TIFR: Thanh ghi cờ ngắt T/C Khi có một ngắt sảy ra, cờ ngắt tương ứng sẽ được set lên 1. Điều khiển T/C1 cũng tương tự như T/C0, Cần chú ý là T/C1 là thanh ghi 16 bit nên giá trị MAX của nó là 0xFFFF. T/C1 có 2 chế độ điều rộng xung [PWM] giống T/C0 nhưng có nhiều độ phân giải khác nhau và có 2 kênh tạo xung riêng biệt tương ứng ở 2 chân OC1A và OC1B. 3, Timer/Counter2 T/C2 cũng là bộ đếm/định thời 8 bit giống T/C0, các chế độ hoạt động của T/C2 cũng tương tự như của T/C0 để điều khiển hoạt động của T/C2 cần dùng các thanh ghi sau: TCCR2, TCNT2, OCR2, TIFR, TIMSK, ASSR. Lưu ý: T/C2 không có chân T2 như T/C1 và T/C0 mà thay vào đó nó có 2 chân TOSC1 và TOSC2 dùng để cấp dao động ngoài cho T/C2 hoạt động hoàn toàn độc lập với xung nhịp của chip khi mode này được chọn. Đây là chế độ đặc biệt của T/C2. • TCCR2: Thanh ghi điều khiển T/C2 − Bit 7 – FOC0: Force Output Compare. Bit FOC0 chỉ hoạt động khi bit WGM00 được sét ở chế độ non-PWM. Tuy nhiên, Để đảm bảo tính tương thích, bit này phải được sét về 0 khi TCCR0 được ghi ở chế độ PWM. − Bit 6, 3 – WGM20, WGM21: Waveform General Mode Các bit điều khiển quá trình hoạt động của bộ đếm, giá trị lớn nhất [TOP] của bộ đếm, và dạng tín hiệu được sử dụng. Các phương thức hoạt động của timer/counter gồm có: Chế độ bình thường [Normal Mode], Chế độ xóa timer khi sảy ra bằng trong so sánh [TCT], và 2 chế độ tạo xung điều rộng [PWM]. Bảng các phương thức hoạt động: − Bit 5, 4 – COM21:0: Compare Math Ouput Mode. Các bit điều khiển kiểu so sánh. Nếu một trong hai bit được sét, đầu ra OC2 sẽ ghi đè lên chức năng của cổng được kết nối. Tuy nhiên, cần chú ý bit thanh ghi hướng dữ liệu [DDR] của chân kết nối phải là chân ra. Compare Output Mode, non-PWM Mode: Compare Output Mode, Fast PWM Mode: Compare Output Mode, Phase Correct PWM Mode: − Bit 2:0 – CS02:0: Clock select: 3 bit dùng để chọn xung nhịp hoạt động cho Timer/Counter2. Clock Select Bit Description • TCNT2: Thanh ghi T/C2 Thanh ghi chứa giá trị vận hành của T/C2 • OCR2: Thanh ghi so sánh đầu ra T/C2 Thanh ghi chứa giá trị dùng để so sánh với giá trị thanh ghi TCNT2. • ASSR: Thanh ghi trạng thái bất đồng bộ [Asynchronous Status Register]  Bit 3 – AS2: Asynchronous T/C2 Khi AS2 bằng 0, T/C2 dùng xung nhịp của chip. Khi AS bằng 1, T/C2 dùng bộ dao động từ bên ngoài được nối với chân TOSC1. Khi giá trị của AS2 thay đổi, nội dung của TCNT2, OCR2, TCCR2 có thể bị lỗi.  Bit 2 – TCN2UB: T/C2 Update Busy Khi T/C2 ở chế độ Asynchronous và TCNT2 được ghi, bit này sẽ được set. Khi TCNT2 được update từ thanh ghi lưu trữ tạm, bit này sẽ bị xóa.  Bit 1 – OCR2UB: Output Compare Register2 Update Busy Khi T/C2 ở chế độ Asynchronous và OCR2 được ghi, bit này sẽ được set. Khi OCR2 được update từ thanh ghi lưu tử tạm, bit này sẽ bị xóa.  Bit 0 – TCR2UB: T/C Control Register2 Update Busy Khi T/C2 ở chế độ Asynchronous và TCCR2 được ghi, bit này sẽ được set. Khi TCCR2 được update từ thanh ghi lưu trữ tạm, bit này sẽ bị xóa. Khi T/C2 ở chế độ Asynchronous có một số điều cần lưu ý:  Cảnh báo: Khi chuyển đỗi giữa bất đồng bộ và đồng bộ xung nhịp của T/C2, các thanh ghi TCNT2, OCR2, TCCR2 có thể sảy ra lỗi. Một cách an toàn để chuyển đổi là: o Tắt các ngắt của T/C2 bằng cách OCIE2 và TOIE2. o Chọn xung nhịp bằng cách set AS2 một cách độc lập. o Ghi giá trị mới vào TCNT2, OCR2, TCCR2. o Để chuyển sang chế độ bất đồng bộ: đợi TCN2UB, OCR2UB, TCR2UB. o Xóa các cờ ngắt T/C2. o Bật các ngắt nếu cần thiết.  Dao động sử dụng là một thạch anh tần số 32.768 KHz. Gắn một xung nhịp ngoài vào chân TOSC1 có thể dùng để kết nối với T/C2. Xung nhịp của chip phải lớn hơn 4 lần Dao động sử dụng.  Khi ghi một trong số các thanh ghi TCNT2, OCR2, TCCR2, giá trị phải được chuyển vào thanh ghi lưu trữ tạm, và được chốt bằng 2 cạnh thực sự trên TOSC1. Không nên viết một giá trị mới trước khi nội dung của thanh ghi lưu trữ tạm được chuyển tới đích. Mỗi một trong 3 thanh ghi được kể trên có thanh ghi lưu trữ tạm riêng.  Khi vào chế độ Power-save hoặc extended standby sau khi ghi TCNT2, OCR2, TCCR2, phải đợi cho đến khi thanh ghi được viết đã update nếu T/C2 được dùng để đánh thức [wake up] các thiết bị. Còn nhiều nữa, đọc trong datasheet nhé. • TIMSK: Thanh ghi mặt nạ ngắt T/C [Timer/Counter Interrupt Mask Register]  Bit 7 – OCIE2: T/C2 Output Compare Math Interrupts Enable Khi OCIE2 và Bit I được set Ngắt so sánh T/C2 được bật.  Bit 6 – TOIE2: T/C2 Overflow Interrupt Enable Khi TOIE2 và Bit I được set Ngắt tràn T/C2 được bật. • TIFR: Thanh ghi cờ ngắt T/C [T/C Interrupt Flag Register] Khi một ngắt sảy ra thì cờ ngắt tương ứng được bật. Điều khiển T/C2 tương tự như T/C0.

Video liên quan

Chủ Đề