You are on page 1of 46

1.

Cấu trúc tổng quát ATMEGA32 – Structure Overview

ATMEGA32 là loại vi điều khiển CMOS, nguồn thấp, 8 bit, xây dựng trên nền
tảng cấu trúc tập lệnh thu gọn tiên tiến cho AVR (Enhanced AVR RISC
architecture).
• RISC – Reduced Instruction Set Computer
• CISC – Complex Instruction Set Computer
Khả năng thực thi 1MIPS (Mega Instruction Per Second) trên 1MHz.
Bao gồm 32 thanh ghi làm việc (General Purpose Working Register) liên kết trực
tiếp với bộ xử lý số học ALU (Arithmetic Logic Unit).
Gồm các tính năng sau:
• 32K Flash có khả năng lập trình được tương thích hoạt động Read-While-Write.
• 1024B EEPROM.
• 2K SRAM.
• 32 GPIO.
• 32 thanh ghi làm việc.
• Ngõ JTAG.
• Tính năng On-chip debug.
• 3 Timer/Counter.
• Internal và External Interrupt.
• USART.
• TWI.
• 8 kênh ADC 10-bit.
• Watchdog timer.
• SPI.
• Tính năng ISP thông qua cổng SPI hoặc Boot Loader.
2. AVR CPU Core

2.1. Tổng quan


Lõi AVR sử dụng kiến trúc Harvard – với các bus riêng biệt cho chương trình và
dữ liệu. Lệnh từ bộ nhớ chương trình thực thi thông qua một ống đơn cấp. Khi một
lênh đang thực thi, lệnh tiếp theo sẽ được nhốt (pre-fetch) từ bộ nhớ chương trình,
cho phép các lệnh được thực thi trong mỗi chu kì clock.
Các 32 thanh ghi (8-bit) làm việc cho phép truy xuất nhanh trong 1 chu kỳ clock.
Trong hoạt động thông thường của ALU, 2 toán hạng xuất ra từ thanh ghi làm
việc, lệnh thực thi, và kết quả lưu ngược lại thanh ghi làm việc chỉ trong 1 chu kì
clock.
6 trong số 32 thanh ghi được dùng như con trỏ địa chỉ gián tiếp 16-bit sử dụng cho
địa chỉ không gian dữ liệu. 1 trong 3 thanh ghi địa chỉ này có thể dùng như con trỏ
địa chỉ look-up table trong bộ nhớ Flash.
Bộ ALU hỗ trợ các hoạt động tính toán số học và logic giữa thanh ghi với nhau,
hay giữa thanh ghi với hằng số. Các hoạt động từng thanh ghi đơn cũng được thực
hiện trong ALU. Sau khi tính toán, thanh ghi trạng thái (Status Register) cập nhật
thông tin liên quan đến kết quả tính toán.
Dòng chương trình (Program Flow) được cung cấp bởi các lệnh nhảy có điều kiện
hoặc không điều kiện, và có thể định địa chì trực tiếp đến toàn bộ không gian địa
chỉ. Hầu hết các lệnh trong AVR đều ở dạng 16-bit. Mỗi địa chỉ bộ nhớ chương
trình chứa một lệnh 16 hoặc 32-bit.
Bộ nhớ chương trình chia ra làm 2 phần: Boot Loader và vùng ứng dụng. Cả 2 đều
sử dụng các lockbit để bảo vệ đọc/ghi. Lệnh SPM thực thi việc ghi dữ liệu vào
vùng flash ứng dụng phải được đặt trong vùng Boot Loader.
Trong quá trình ngắt hay hàm/chương trình con được gọi, địa chỉ trả về của bộ
đếm chương trình lưu trong ngăn xếp (stack). Stack được phân bồ hiệu quả trong 1
phần bộ nhớ SRAM, vì vậy, độ lớn của stack chỉ phụ thuộc vào SRAM và việc sử
dụng SRAM. Chương trình người dùng cần phải khởi tạo giá trị này cho SP – Con
trỏ ngăn xếp (Stack Pointer) trong chương trình sau khi reset và trước khi thực
hiện bất kì việc gọi hàm hay chương trình ngắt được thực thi.
Module ngắt linh hoạt có thanh ghi điều khiển riêng trong không gian IO và có bit
cho phép ngắt toàn cục trong thanh ghi trạng thái (Status Register). Tất cả các ngắt
đều có vector ngắt riêng trong bảng vector ngắt. Các ngắt có ưu tiên ngắt theo
đúng vị trí ngắt của nó. Địa chỉ ngắt càng thấp thì độ ưu tiên ngắt càng cao.
2.2. ALU – Arithmetic Logic Unit
Bộ ALU hiệu suất cao của AVR hoạt động trong liên kết trực tiếp với 32 thanh ghi
làm việc. Trong 1 chu kì clock, hoạt động tính toán số học giữa các thanh ghi hoặc
giữa thanh ghi với dữ liệu trực tiếp sẽ được thực thi. Hoạt động của ALU được
chia ra làm 3 phần chính: xử lý số học, phép toán logic và các phép toán với bit.
Một số bổ sung trong kiến trúc cũng cho phép sử dụng các nhân tử hiệu quả, cho
cả không dấu/có dấu và định dạng phân số.
2.3. Thanh ghi trạng thái – Status Register
Thanh ghi này chứa kết quả liên quan đến lệnh xử lý số học gần nhất. Kết quả
chứa trong thanh ghi này có thể được sử dụng để thực hiện các hoạt động có điều
kiện.
Thanh ghi trạng thái không tự động lưu lại khi nhảy vào interrupt và cũng không
tự động phục hồi (restore) khi quay về, cần thực hiện điều này bằng phần mềm.
• Bit 7 – I: Global Interrupt Enable
Bit cho phép ngắt toàn cục. Bit này cần được set để hoạt động ngắt được kích hoạt.
Việc cho phép ngoại vi nào ngắt được thực hiện trong các thanh ghi điều khiển của
từng ngoại vi đó. Một khi bit cho phép ngắt toàn cục bị xóa thì cho dù bit cho phép
ngắt của ngoại vi nào đó được bật lên, ngắt cũng không thể xảy ra.
Lưu ý: Bit toàn cục này sẽ bị xóa tự động bằng phần cứng khi có ngắt nào đó xảy
ra. Và nó được set trở lại tự động bằng phần cứng khi lệnh RETI (lệnh quay về từ
chương trình ngắt) được thực thi.
Bit toàn cục cũng có thể được set/clear bằng phần mềm thông qua lệnh SEI/CLI.
• Bit 6 – T: Bit Copy Storage
• Bit 5 – H: Half Carry Flag
• Bit 4 – S: Sign Bit, S = N + V
• Bit 3 – V: Two’s Complement Overflow Flag
• Bit 2 – N: Negative Flag
• Bit 1 – Z: Zero Flag
• Bit 0 – C: Carry Flag
2.4. Tập các thanh ghi làm việc đa năng – General Purpose Register File

Tất cả các lệnh đều thực thi trên các thanh ghi làm việc có thể truy xuất trực tiếp
đến các thanh ghi, và hầu hết là các lệnh thực thi trong 1 chu kì clock.
Như trên hình, tất cả các thanh ghi được gán địa chỉ bộ nhớ dữ liệu, ánh xạ chúng
trực tiếp đến 32 phân vùng đầu tiên trong không gian dữ liệu. Mặc dù không được
hiện thực vật lý như phân vùng SRAM, nhưng tổ chức bộ nhớ này cung cấp khả
năng truy xuất phức tạp tuyệt vời của các thanh ghi, như than ghi con trỏ X-, Y- và
Z- có thể được set để định vị đến bất kì thanh ghi nào trong tập thanh ghi.
2.5. Thanh ghi X, Y và Z
Các thanh ghi làm việc từ R26 � R31 có các chức năng phụ trợ. Những thanh ghi
này là con trỏ địa chỉ 16-bit để định địa chỉ gián tiếp trong không gian dữ liệu.

Trong các chế độ định địa chỉ khác nhau, các thanh ghi này có các chức năng như
chuyển dịch cố định, tự động tăng/giảm.
2.6. Con trỏ ngăn xếp – Stack Pointer (SP)
Stack được sử dụng với mục đích chính là lưu trữ các dữ liệu tạm thời, các biến
cục bộ và lưu trữ giá trị địa chỉ trả về sau khi gọi chương trình ngắt hay
hàm/chương trình con (subroutine).
Thanh ghi con trỏ địa chỉ luôn luôn trỏ tới đỉnh của stack (Top of the Stack). Lưu ý
rằng, stack được hiện thực theo cách giảm từ địa chỉ bộ nhớ cao hơn xuống thấp
hơn. Ngầm định rằng lệnh PUSH (cất) sẽ giảm giá trị con trỏ SP.
SP trỏ tới vùng SRAM nơi mà stack của chương trình interrupt và subroutine phân
bổ. Không gian cho stack phải được chương trình phần mềm định nghĩa trước khi
thực thi subrountine hay ngắt xảy ra (kích hoạt ngắt).
SP cần phải trỏ tới địa chỉ từ trên $60.
SP sẽ giảm đi 1, khi dữ liệu được cất vào stack sau khi thực hiện lệnh PUSH, và
stack sẽ giảm đi 2 khi giá trị trả về được cất vào stack khi gọi subrountine hay
chương trình ngắt.
SP sẽ tăng lên 1 khi dữ liệu được đẩy (pop) ra khỏi stack với lệnh POP, và SP sẽ
tăng lên 2 khi dữ liệu được đẩy ra khỏi stack với lệnh RET khi trở vể từ
subrountine hay lệnh RETI khi trở về từ chương trình ngắt.
SP trong AVR hiện thực hóa từ 2 thanh ghi 8-bit.
2.7. Xử lý reset và ngắt – Reset and Interrupt Handling
AVR cung cấp các nguồn ngắt khác nhau. Mỗi vector ngắt và reset này có vector
chương trình riêng rẽ trong không gian bộ nhớ chương trình. Tất cả các ngắt đều
được gán bit cho phép ngắt riêng biệt cùng với bit cho phép ngắt toàn cục, tất cả
các bit trên phải được set lên 1. Phụ thuộc vào giá trị của PC, các ngắt có thể bị
cấm tự động khi Boot Lock bit BLB02 và BLB12 được lập trình. Tính năng này
đảm bảo chức tính bảo mật phần mềm.
Địa chỉ thấp nhất trong không gian bộ nhớ mặc định là được định nghĩa là vector
Reset và vector ngắt. Địa chỉ vector ngắt cũng đồng thời quy định ưu tiên ngắt
cho, địa chỉ ngắt thấp hơn có mức ưu tiên ngắt cao hơn và ngược lại. RESET có
mức ưu tiên ngắt cao nhất, kế đến là INT0 – External Interrupt 0 Request.
Các vector ngắt có thể được di chuyển lên vị trí bắt đầu của khu vực Boot Flash
bằng bit IVSEL trong thanh ghi General Interrupt Control Register (GICR). Vector
RESET cũng có thể dời lên vị trí bắt đầu của Boot Flash bằng cách thiết lập bit cầu
chì BOOTSRT.
Khi có ngắt xảy ra, bit cho phép ngắt toàn cục (Global Interrrupt Enable bit) sẽ bị
xóa tự động bằng phần cứng, do đó tất cả các ngắt đều bị cấm. Phần mềm có thể
set bit này lên 1 trở lại để cho phép ngắt trùm (nested interrupt) có thể xảy ra. Tất
cả các ngắt được kích hoạt sau đó có thể “ngắt” trong chương trình xử lý ngắt
(Interrupt subrountine) hiện tại. Bit này cũng tự động được set lên 1 trở lại sau khi
quay về từ chương trình ngắt khi thực thi lệnh RETI.
Có 2 dạng ngắt cơ bản:
• Dạng thứ nhất: Ngắt được kích hoạt (trigger) bởi sự kiện set cờ ngắt (Interrupt
Flag). Với những ngắt này, PC được trỏ tới vector chương trình ngắt nhằm thực thi
chương trình xử lý ngắt, và phần cứng sẽ xóa cờ ngắt tương ứng này. Cờ ngắt cũng
có thể được xóa bằng phần mềm bằng cách ghi 1 vào vị trí bit của cờ ngắt đó. Nếu
một điều kiện ngắt xảy ra trong khi bit cho phép ngắt đó bị xóa, thì cờ ngắt vẫn
được set và ngắt sẽ xảy ra khi ngắt đó được cho phép trở lại, hoặc phần mềm phải
xóa cờ ngắt đó đi bằng cách ghi 1. Tương tự như vậy, nếu một hay nhiều điều kiện
ngắt xảy ra trong khi bit cho phép ngắt toàn cục bị xóa, các cờ ngắt tương ứng đó
sẽ được set lên, và đến khi nào bit cho phép ngắt toàn cục được set trở lại, thì các
ngắt đó sẽ được thực thi tương ứng theo thứ tự ưu tiên ngắt.
• Dạng thứ hai: Ngắt được kích hoạt khi nào điều kiện ngắt vẫn còn hiện hữu.
Những ngắt này không cần có cờ ngắt. Nếu điều kiện ngắt ngừng xuất hiện trước
khi ngắt được phép hoạt động, ngắt đó sẽ không xảy ra.
Khi AVR thoát ra từ chương trình ngắt, nó luôn quay về chương trình chính và sẽ
thực hiện thêm một hay vài lệnh nữa trước khi phục vụ các ngắt khác đang treo.
Lưu ý: rằng thanh ghi trạng thái (Status Register) sẽ không tự động lưu lại khi
nhảy vào chương trình ngắt, cũng như không được phục hồi lại khi quay về từ
chương trình ngắt. Điều này cần thực hiện bằng phần mềm.
Khi sử dụng lệnh CLI để cấm ngắt, tất cả các ngắt sẽ bị cấm ngay lập tức. Không
có ngắt nào xảy ra khi thực hiện lệnh CLI, ngay cả khi ngắt xảy ra đồng thời với
lệnh CLI.
3. Tổ chức bộ nhớ trong ATMEGA32 – AVR ATMEGA32 Memories
Bộ nhớ ATMEGA32 bao gồm 2 phần: bộ nhớ chương trình và bộ nhớ dữ liệu.
Trong ATMEAG32 còn có bộ nhớ EEPROM để lưu trữ dữ liệu.
3.1. Bộ nhớ chương trình – In-System Reprogrammable Flash Program
Memory

3.2. Bộ nhớ dữ liệu – SRAM Data Memory


3.3.
Bộ nhớ EEPROM – EEPROM Data Memory

3.4. Vùng nhớ IO – IO Memory


4. Clock hệ thống và các tùy chọn clock - System Clock and Clock Options
5. Quản lý năng lượng và các chế độ nghỉ - Power Management and Sleep
Modes
6. Điều khiển hệ thống và Reset – System Control and Reset
7. Ngắt – Interrupts
7.1. Các vector ngắt trong ATMEGA32
Lưu ý:
• Khi bit cầu chì BOOTRST được lập trình, chương trình sẽ nhảy đến địa chỉ Boot
Loader sau khi reset.
• Khi bit IVSEL trong GICR được set, bảng vector ngắt sẽ di chuyển đến vị trí bắt
đầu của Boot Flash.
7.2. Mô tả thanh ghi
Thanh ghi điều khiển ngắt thông thường – General Interrupt Control
Register

• Bit 1 – IVSEL: Interrupt Vector Select – Lựa chọn vector ngắt.


Khi bit này được xóa, các vector ngắt sẽ nằm ở vị trí bắt đầu của bộ nhớ Flash.
Khi bit này được set, các vector ngắt sẽ nằm ở vị trí bắt đầu của Boot Loader trong
Flash. Vị trí bắt đầu thực sự của Boot Flash do các bit cầu chì BOOTSZ quyết
định.
Để tránh việc vô tình thay đổi bảng vector ngắt, cần phải theo trình tự sau:
- Ghi 1 vào bit Interrupt Vector Change Enable.
- Trong vòng 4 chu kì, ghi giá trị mong muốn vào IVSEL trong khi ghi 0 vào
IVCE.
Ngắt sẽ tự động bị cấm khi thực hiện trình tự trên. Ngắt sẽ bị cấm trong chu kì
IVCE được set, và nó vẫn tiếp tục bị cấm sau lệnh ghi vào IVSEL. Nếu IVSEL
không được ghi thì nó vẫn tiếp tục bị cấm trong 4 chu kì tiếp theo nữa. Bit I trong
SREG không bị tác động bởi việc cấm ngắt tự động này.
• Bit 0 – IVCE: Interrupt Vector Change Enable – Cho phép thay đổi vector ngắt.
Bit này phải được set lên trước khi ghi giá trị vào bit IVSEL. Bit này được xóa bởi
phần cứng trong 4 chu kì sau khi set hoặc xóa khi ghi vào bit IVSEL.
8. I/O Port
8.1. Giới thiệu
Tất cả các port trên AVR đều có tính năng Đọc - Hiệu chỉnh – Ghi thực (Read –
Modify – Write) khi sử dụng chúng như cổng IO số thông thường. Có nghĩa là
hướng (Input/Output) của từng pin trên port có thể thiết lập mà không vô tình làm
thay đổi hướng đến các pin khác trong port đó bằng lệnh SBI/CBI.
Mỗi bộ đệm ngõ ra có bộ khiển (drive) đối xứng có đặc tính cấp (source) và rút
(sink) cao. Bộ khiển trên từng pin có khả năng lái LED trực tiếp. Mỗi pin có điện
trở kéo lên (Pulled-up resistor) có thể lựa chọn cho từng pin riêng biệt với trị số cố
định phù hợp với điện áp cấp. Tất cả các IO đều có diode bảo vệ đến nguồn và đất.
8.2. Port với chức năng IO số thông thường
Thiết lập thuộc tính cho pin
Có tất cả 4 port A, B, C, D. Mỗi port gồm 8 ngõ I/O (8-bit).
Mỗi port bao gồm 3 thanh ghi có thể truy xuất bit: DDRx, PORTx và PINx (với x
có thể là A, B, C hay D)
• DDRx dùng để thiết lập hướng cho pin. Nếu set DDRx.n lên 1, pin đó là Output,
nếu là mức 0, pin đó là Input (với n có thể từ 0 � 7)
• Nếu set PORTx.n lên 1 khi pin đó đang là input, có nghĩa là chức năng pull-up
resistor được kích hoạt. Để tắt chức năng này, PORTx.n phải xóa về 0 hoặc pin đó
được thiết lập là ngõ Output. Port pin ở trạng thái thả nổi (tri-state) khi reset được
kích hoạt và không có clock đang chạy.
• Nếu PORTx.n được set lên 1 trong khi đang là ngõ Output, nghĩa là port pin đó
đang được lái lên mức cao (1). Nếu PORTx.n được xóa về 0 trong khi đang là ngõ
Output, nghĩa là port pin đó đang được lái xuống mức thấp (0).
• Bit PUD (Pull up Disable) trong thanh ghi SFIOR có thể được set để cấm chức
năng điện trở kéo lên trong tất cả các port.

Đọc giá trị trên pin


8.3. Các chức năng phụ của từng port
8.4. Mô tả thanh ghi trong I/O Port
Special Function I/O Register – SFIOR

• Bit 2 – PUD: Pull-up disable


Nếu bit này được set lên 1 thì chức năng điện trở kéo trên tất cả các port sẽ bị cấm,
ngay cả khi giá trị DDRx.n và PORTx.n được thiết lập để cho phép điện trở kéo
lên ({DDx.n, PORTx.n} = 0b01).
Port A Data Register – PORTA
( * Lấy hình minh họa bên dưới làm mẫu, các thanh ghi khác có cùng chứ năng
nhưng thuộc về port khác cũng có nội dung tương tự)

Port A Data Direction Register – DDRA


( * Lấy hình minh họa bên dưới làm mẫu, các thanh ghi khác có cùng chứ năng
nhưng thuộc về port khác cũng có nội dung tương tự)

Port A Input Pins Address – PINA


( * Lấy hình minh họa bên dưới làm mẫu, các thanh ghi khác có cùng chứ năng
nhưng thuộc về port khác cũng có nội dung tương tự)

Port B Data Register – PORTB


Port B Data Direction Register – DDRB
Port A Input Pins Address – PINB
Port B Data Register – PORTC
Port B Data Direction Register – DDRC
Port A Input Pins Address – PINC
Port B Data Register – PORTD
Port B Data Direction Register – DDRD
Port A Input Pins Address – PIND
9. Ngắt ngoài - External Interrupts
Bao gồm INT0, INT1 và INT2.
9.1. Thiết lập kiểu ngắt – Interrupt Sense Control
• Với INT1 và INT0: thiết lập kiểu tác động ngắt (Interrupt Sense Control) thông
qua thanh ghi MCU Control Register - MCUCR.

• Với INT2: thiết lập kiểu tác động ngắt (Interrupt Sense Control) thông qua thanh
ghi MCU Control and Status Register - MCUSCR: ISC2 = 0: Falling, ISC2 = 1:
Rising.

9.2. Cho phép ngắt – Interrupt Request Enable


Cả 3 ngắt đều được cho phép ngắt tác động đến ngắt toàn cục thông qua thanh ghi
General Interrupt Control Register – GICR.

Bit[7..5] – INT1, INT0, INT2: External Interrupt Request 1/0/2 Enable.


9.3. Cờ ngắt – Interrupt Flag
Thông qua thanh ghi General Interrupt Flag Register – GIFR.

Bit[7..5] – INTF1/0/2 – External Interrupt Flag 1/0/2.


10. Timer/Counter 0/1/2
10.1. 8-bit Timer/Counter 0
10.1.1. Overview

Định nghĩa
BOTTOM: là khi bộ đếm tiến về 0x00
MAX: là khi bộ đếm tiến đến 0xFF
TOP: là khi bộ đếm tiến đến giá trị lớn nhất trong chu trình đếm của nó. Có thể là
giá trị cố định 0xFF hoặc giá trị chứa trong thanh ghi OCR (Output Compare
Register).
10.1.2. Clock Source

10.1.3. Output Compare


10.1.4. Chế độ hoạt động
Normal Mode
Chế độ này quyết định bởi WGM01:0 = 0
Counter (TCNT0) trong chế độ này liên tục đếm lên từ 0 � 0xFF, và về 0 khi
counter tràn (0xFF � 0x00), cờ TOV0 khi đó sẽ được set lên 1 tại thời điểm
counter đếm từ 0xFF � 0x00.
Ngắt sử dụng trong trường hợp này là ngắt tràn timer (TOV0 Interrupt).
Clear Timer On Compare Match (CTC)
Chế độ này quyết định bởi WGM01:0 = 2
Khi counter (TCNT0) trùng khớp với giá trị chứa trong thanh ghi OCR0, counter
sẽ được xóa về 0 tại thời điểm counter đếm từ OCR0 � OCR0 + 1.

Ngắt sử dụng trong trường hợp này là ngắt so sánh (OCF0 Interrupt).
Ngõ ra Compare Output (OC0) trong trường hợp này có thể sử dụng phát sóng
(waveform generating) ở nhiều chế độ tùy thuộc vào bit COM01:0 mô tả trong
bảng 39 (phần mô tả thanh ghi).
Với ngõ ra OC0 sử dụng chế độ đảo (toggle) trạng thái (COM01:0 = 1), tần số cực
đại của ngõ ra OC0 ứng với giá trị trong thanh ghi OCR0 bằng 0 khi đó là fOC0 =
fclk_IO/2. Tần số sóng ở ngõ ra OC0 trong chế độ này tính theo công thức:

Ngắt tràn timer cũng có thể sử dụng trong trường hợp này nếu counter đếm tràn từ
0xFF � 0x00.
Fast PWM mode
Chế độ này quyết định bởi WGM01:0 = 3.
Chế độ này cung cấp PWM tần số cao.
Counter sẽ đếm từ BOTTOM (0x00) đến MAX (0xFF) rồi bắt đầu lại ngay từ
BOTTOM (dốc đơn – single slope).
Ngõ ra Compare Output OC0 trong chế độ này có thể hoạt động ở 2 dạng:
• None-Inverting (không đảo): ngõ ra OC0 sẽ set lên 1 khi counter bắt đầu ở
BOTTOM. Khi giá trị counter trùng khớp (matched) với giá trị chứa trong thanh
ghi OCR0 thì ngõ ra được xóa tại thời điểm counter đếm từ OCR0 � OCR0 + 1.
• Inverting (đảo): ngược lại.
Tần số PWM ở ngõ ra OC0 trong trường hợp này tính theo công thức:

Trường hợp đặc biệt:


• Khi giá trị trong thanh ghi OCR0 set bằng 0, khi đó sẽ có 1 xung gai ở ngõ ra
OC0 (không đảo) trong mỗi chu kì timer thứ MAX + 1 (chu kì thứ 0).
• Khi giá trị trong thanh ghi OCR0 set bằng MAX (0xFF), ngõ ra sẽ luôn luôn ở
mức cao hay thấp (tùy vào COM01:0).
Cờ tràn TOV0 vẫn được set lên khi counter đếm tràn từ 0xFF � 0x00.
Phase Correct PWM mode
Quyết định bởi WGM01:0 = 1.
Chế độ này cung cấp PWM chính xác phân giải cao, dựa trên chế độ dốc đôi
(dual-slope).
Counter sẽ đếm từ BOTTOM � TOP và từ TOP � BOTTOM. Chế độ hoạt động
dốc đôi này có tần số tối đa thấp hơn ở chế độ dốc đơn.
Dạng sóng PWM ngõ ra Compare Output OC0 cũng có 2 chế độ:
• None-Inverting (không đảo): ngõ ra OC0 sẽ được xóa khi giá trị counter trùng
khớp giá trị chứa trong thanh ghi OCR0 khi counter đang đếm lên - tại thời điểm
counter đếm từ OCR0 � OCR0 + 1, và được set khi việc trùng khớp xảy ra lúc
counter đang đếm xuống – tại thời điểm counter đếm từ OCR0 � OCR0 - 1.
• Inverting (đảo): ngược lại.
Tần số PWM ngõ ra OC0 trong trường hợp này tính theo công thức:

Trường hợp đặc biệt:


• Nếu giá trị trong thanh ghi OCR0 set bằng BOTTOM (0x00) thì ngõ ra OC0 luôn
luôn ở mức thấp.
• Nếu giá trị trong thanh ghi OCR0 set bằng MAX (0xFF) thì ngõ ra OC0 luôn
luôn ở mức thấp cao.
Cờ tràn trong trường hợp này vẫn set lên khi counter đếm về BOTTOM.
10.1.5. Mô tả thanh ghi
Timer/Counter Control Register – TCCR0

• Bit 7 – FOC0: Force Output Compare - Kích sự kiện Output Compare bằng tay.
• Bit 6, 3 – WGM01:0: Waveform Generation Mode – Chế độ phát sóng.
Các bit này điều khiển hoạt động đếm của counter, xác định giá trị TOP cho
counter và dạng sóng ngõ ra trên chân OC0 – Output Compare.
• Bit 5:4 – COM01:0: Compare Match Output Mode
Các bit này điều khiển hoạt động của chân ngõ ra Output Compare.
Chức năng của các bit này khác nhau và tùy thuộc vào từng chế độ phát sóng.
• Bit 2:0 – CS02:0: Clock Select – Lựa chọn nguồn clock cho counter trong timer
Các bit này lựa chọn nguồn clock cho hoạt động counter trong timer.

Timer/Counter Register – TCNT0 - Thanh ghi Counter trong timer

Output Compare Register – OCR0 - Thanh ghi so sánh Output Compare

Timer/Counter Interrupt Mask Register – TIMSK


• Bit 1 – OCIE0: Timer/Counter 0 Output Compare Match Interrupt Enable – Cho
phép ngắt khi so sánh trùng khớp.
• Bit 0 – TOIE0: Timer/Counter 0 Overflow Interrupt Enable – Cho phép ngắt khi
counter đếm tràn.
Timer/Counter Interrupt Flag Register – TIFR

• Bit 1 – OCF0: Output Compare Flag 0 – Cờ Output Compare.


• Bit 0 – TOV0: Timer/Counter0 Overflow Flag – Cờ tràn counter.
10.2. Timer/Counter 0/1 Prescale

Special Function IO Register – SFIOR

• Bit 0 – PSR10: Prescaler Reset Timer/Counter1 and Timer/Counter0 – Reset


Prescaler
Bit này cho phép reset bộ prescale chung của Timer/Counter 0/1.

10.3. 16-bit Timer/Counter 1


10.3.1. Overview
10.3.2. Clock Source

10.3.3. Input Capture


Sử dụng chân ICP1 hoặc chân chức năng của bộ Analog Comparator để bắt sự
kiện bên ngoài (external events).
Khi có sự thay đổi mức logic trên các chân này, qua bộ khử nhiễu (Noise
Canceler) và bộ phát hiện sườn xung (Edge Detector), quá trình bắt sự kiện được
kích hoạt.
Khi quá trình bắt sự kiện được kích hoạt, giá trị 16-bit trong thanh ghi TCNT1
được ghi vào thanh ghi Input Capture ICR1, cùng lúc đó, cờ bắt sự kiện (ICF1 -
Input Capture Flag) cũng được set lên 1.
Nếu ngắt bắt sự kiện được cho phép (TICIE1 = 1) thì ngắt sẽ xảy ra và chương
trình ngắt sẽ được gọi thực thi, cờ ICF1 sẽ được xóa sau khi chương trình ngắt
thực thi hoặc xóa bằng phần mềm bằng cách ghi 1.
Giá trị trong thanh ghi ICR1 16-bit có thể đọc ra bình thường.
Thanh ghi ICR1 chỉ có thể được ghi vào khi ở chế độ phát sóng (Waveform
Generating mode), khi đó giá trị của thanh ghi ICR1 dùng để xác định giá trị TOP
cho timer.
Input Capture Trigger Source – Nguồn kích hoạt Input Capture
Nguồn chính là từ chân ICP1, bên cạnh đó có thể dùng chân chức năng của Analog
Comparator bằng cách set bit Analog Comparator Input Capture (ACIC) trong
thanh ghi Analog Comparator Control and Status Register (ACSR).
Khi thay đổi nguồn kích hoạt Input Capture, có thể làm cờ ngắt ICF1 set lên 1, cần
phải ghi 1 vào cờ này để xóa đi.
Sử dụng chức năng Input Capture
Phải đảm bảo khả năng xử lý của CPU trong khoảng thời gian giữa 2 sự kiện, nếu
CPU xử lý quá chậm, giá trị trong thanh ghi ICR1 sẽ bị ghi đè bởi giá trị mới, kết
quả khi đó sẽ không còn chính xác.
Phải đọc giá trị trong thanh ghi ICR1 ra trong chương trình xử lý ngắt càng nhanh
càng tốt. mặc dù độ ưu tiên của vector ngắt Input Capture có thể khá cao, nhưng
phải tính đến trường hợp thời gian trì hoãn để phục vụ những ngắt khác đang thực
thi.
Để đo độ rộng của xung nào đó, đòi hỏi việc thiết lập sườn kích hoạt Input Capture
cũng phải được thay đổi càng nhanh càng tốt trong chương trình ngắt gây ra bởi
sườn đầu tiên trước khi xảy ra sự kiện do sườn thứ 2 tác động. Sau khi thay đổi
sườn tác động, cần phải ghi 1 vào cờ ngắt ICF1 để xóa.
Trường hợp chỉ là đo tần số và có sử dụng chương trình xử lý ngắt thì không cần
xóa cờ ngắt ICF1 này.
10.3.4. Output Compare

10.3.5. Chế độ hoạt động


Normal Mode
Chế độ này quyết định bởi WGM13:0 = 0
Counter (TCNT0) trong chế độ này liên tục đếm lên từ 0 → 0xFFF, và về 0 khi
counter tràn (0xFFFF → 0x00), cờ TOV1 khi đó sẽ được set lên 1 tại thời điểm
counter đếm từ 0xFFFF → 0x00.
Ngắt sử dụng trong trường hợp này là ngắt tràn timer (TOV1 Interrupt).
Sử dụng Input Capture trong trường hợp này là thích hợp nhất. Nhưng phải đảm
bảo counter không bị đếm tràn trong khoảng thời gian giữa 2 lần bắt sự kiện.
Clear Timer on Compare Match – CTC Mode
Quyết định bởi WGM13:0 = 4 hoặc 12.
Khi counter (TCNT0) trùng khớp với giá trị chứa trong thanh ghi OCR1A
(WGM13:0 = 4) hoặc thanh ghi ICR1 (WGM13:0 = 12), counter sẽ được xóa về 0.

Ngắt sử dụng trong trường hợp này là ngắt so sánh (OCF1A hoặc ICF1).
Ngõ ra Compare Output (OC1A) trong trường hợp này có thể sử dụng phát sóng
(waveform generating) ở nhiều chế độ tùy thuộc vào bit COM1A1:0.
Với ngõ ra OC1A sử dụng chế độ đảo (toggle) trạng thái (COM1A1:0 = 1), tần số
cực đại của ngõ ra OC1A ứng với giá trị trong thanh ghi OCR1A bằng 0 khi đó là
fOC1A = fclk_IO/2. Tần số sóng ở ngõ ra OC1A trong trường hợp này tính theo
công thức:

Ngắt tràn timer cũng có thể sử dụng trong trường hợp này nếu counter đếm tràn từ
0xFFFF → 0x00.
Fast PWM Mode
Chế độ này quyết định bởi WGM13:0 = 5, 6, 7, 14 hoặc 15
Chế độ này cung cấp PWM tần số cao.
Counter sẽ đếm từ BOTTOM đến TOP đến rồi bắt đầu lại ngay từ BOTTOM (dốc
đơn – single slope).
Ngõ ra Compare Output OC1x (x = A, B) trong chế độ này có thể hoạt động ở 2
dạng:
• None-Inverting (không đảo): OC1x sẽ xóa khi TCNT1 trùng với OCR1x, và set
ở BOTTOM.
• Inverting (đảo): ngược lại.
Độ phân giải PWM có thể chọn cố định ở 8-bit, 9-bit, 10-bit hoặc định nghĩa bởi
giá trị trong thanh ghi ICR1 hoặc OCR1A. Độ phân giải thấp nhất cho phép là 2-
bit (thanh ghi ICR1 hoặc OCR1A set bằng 0x0003) và cao nhất là 16-bit (ICR1
hoặc OCR1A set bằng giá trị lớn nhất MAX = 0xFFFF).
Công thứ tính độ phân giải:

Counter liên tục đếm lên từ BOTTOM đến giá trị cố định 0x00FF, 0x01FF,
0x03FF (tương ứng WGM13:0 = 5, 6, 7), hoặc giá trị trong ICR1 (WGM13:0 =
14) , hoặc giá trị trong OCR1A (WGM13:0 = 15), sau đó, counter sẽ bị xóa ở chu
kỳ tiếp theo.

Cờ tràn TOV1 sẽ set lên 1 mỗi khi counter vượt qua giá trị TOP. Cờ ngắt OC1A
hoặc ICF1 sẽ set lên 1 cùng chu kì cờ TOV1 set lên 1 nếu giá trị TOP định nghĩa
bởi OCR1A hoặc ICR1.
Các vấn đề với double buffer (OCR1A) và non - double buffer (ICR1) sử dụng để
cập nhật giá trị TOP:
Chế độ phát sóng trên chân OC1x phụ thuộc vào COM1x1:0.
Tần số PWM tính theo công thức:

Các trường hợp đặc biệt:


• Nếu OCR1x set bằng 0: ngõ ra OC1x (không đảo) sẽ có xung gai mức 1 trong
mỗi chu kỳ thứ TOP + 1.
• Nếu OCR1x set bằng TOP: ngõ ra OC1x (không đảo) sẽ luôn luôn ở mức cao.
Phase Correct PWM Mode
Chế độ này quyết định bởi WGM13:0 = 1, 2, 3, 10 hoặc 11.
Chế độ này cung cấp PWM chính xác phân giải cao, dựa trên chế độ dốc đôi
(dual-slope).
Counter sẽ đếm từ BOTTOM đến TOP rồi từ TOP về BOTTOM (dốc đôi – dual
slope).
Ngõ ra Compare Output OC1x (x = A, B) trong chế độ này có thể hoạt động ở 2
dạng:
• None-Inverting (không đảo): OC1x sẽ xóa khi TCNT1 trùng với OCR1x khi
đang đếm lên, và set khi sự trùng khớp này xảy ra lúc đếm xuống.
• Inverting (đảo): ngược lại.
Độ phân giải PWM có thể chọn cố định ở 8-bit, 9-bit, 10-bit hoặc định nghĩa bởi
giá trị trong thanh ghi ICR1 hoặc OCR1A. Độ phân giải thấp nhất cho phép là 2-
bit (thanh ghi ICR1 hoặc OCR1A set bằng 0x0003) và cao nhất là 16-bit (ICR1
hoặc OCR1A set bằng giá trị lớn nhất MAX = 0xFFFF).
Công thức tính độ phân giải:

Counter sẽ đếm đến giá trị cố định 0xFF, 0x1FF, 0x3FF (với WGM13:0 = 1, 2
hoặc 3), hoặc giá trị trong ICR1 (WGM13:0 = 10), hoặc giá trị trong OCR1A
(WGM13:0 = 11), sau đó counter sẽ đếm xuống trở lại.

Cờ tràn TOV1 sẽ set lên 1 mỗi khi counter tiến về BOTTOM. Khi OCR1A hoặc
ICR1 định nghĩa cho giá trị TOP, cờ OCF1A hoặc cờ ICF1 sẽ set lên 1 cùng 1 chu
kỳ OCR1x cập nhật giá trị từ thanh ghi đệm double buffer - tại TOP.
Các vấn đề khi cập nhật giá trị TOP:
Khuyến cáo nên sử dụng chế độ phase and frequency correct thay vì phase correct
khi cập nhật giá trị TOP lúc timer đang chạy. Còn nếu giá trị TOP là tĩnh (không
đổi) thì không có sự khác biệt nào giữa 2 chế độ.
Ở chế độ Phase Correct PWM, chế độ phát sóng ngõ ra OC1x phụ thuộc vào giá
trị của COM1x1:0.
Công thức tính tần số PWM ở chế độ Phase Correct:

Trường hợp đặc biệt:


• Nếu OCR1x set bằng BOTTOM: ngõ ra OC1x (không đảo) sẽ luôn ở mức thấp.
• Nếu OCR1x set bằng TOP: ngõ ra OC1x (không đảo) sẽ luôn ở mức cao.
Phase and Frequency Correct PWM Mode
Quyết định bởi WGM13:0 = 8 hoặc 9.
Cũng hoạt động dựa trên nền tảng dốc đôi (dual-slope).
Counter sẽ đếm từ BOTTOM → TOP và đếm xuống từ TOP → BOTTOM.
Ngõ ra Compare Output OC1x (x = A, B) trong chế độ này có thể hoạt động ở 2
dạng:
• None-Inverting (không đảo): OC1x sẽ xóa khi TCNT1 trùng với OCR1x khi
đang đếm lên, và set khi sự trùng khớp này xảy ra lúc đếm xuống.
• Inverting (đảo): ngược lại.
Điểm khác biệt chính giữa chế độ phase correct PWM và phase and frequency
correct PWM là thời điểm OCR1x cập nhật giá trị từ thanh ghi đệm double buffer
– tại BOTTOM thay vì TOP như Phase Correct PWM.
Độ phân giải PWM có thể chọn cố định ở 8-bit, 9-bit, 10-bit hoặc định nghĩa bởi
giá trị trong thanh ghi ICR1 hoặc OCR1A. Độ phân giải thấp nhất cho phép là 2-
bit (thanh ghi ICR1 hoặc OCR1A set bằng 0x0003) và cao nhất là 16-bit (ICR1
hoặc OCR1A set bằng giá trị lớn nhất MAX = 0xFFFF).
Công thức tính độ phân giải:

Counter sẽ đếm đến giá trị trong ICR1 (WGM13:0 = 8), hoặc giá trị trong OCR1A
(WGM13:0 = 9), sau đó counter sẽ đếm xuống trở lại.
Cờ tràn TOV1 sẽ set lên 1 cùng 1 chu kì khi OCR1x cập nhật giá trị từ thanh ghi
đệm double buffer tại BOTTOM. Khi OCR1A hoặc ICR1 định nghĩa giá trị TOP,
cờ OCF1A hoặc ICF1 sẽ set lên 1 khi counter tiến đến TOP.
Các vấn đề khi cập nhật giá trị TOP:
Ở chế độ Phase Correct PWM, chế độ phát sóng ngõ ra OC1x phụ thuộc vào giá
trị của COM1x1:0.
Tần số PWM ở chế độ Phase and Frequency Correct:

Trường hợp đặc biệt:


• Nếu OCR1x set bằng BOTTOM: ngõ ra OC1x (không đảo) sẽ luôn ở mức thấp.
• Nếu OCR1x set bằng TOP: ngõ ra OC1x (không đảo) sẽ luôn ở mức cao.
10.3.6. Mô tả thanh ghi
Timer/Counter1 Control Register A – TCCR1A -Thanh ghi điều khiển A của
Timer/Counter 1

• Bit 7:6 – COM1A1:0 – Compare Output Mode for Compare unit A – Chế độ
Compare Output cho bộ so sánh A.
• Bit 5:4 – COM1B1:0 – Compare Output Mode for Compare unit B – Chế độ
Compare Output cho bộ so sánh B.
Bit COM1A1:0 và COM1B1:0 điều khiển chế độ hoạt động cho chân Compare
Output A và B (OC1A và OC1B). Chế độ hoạt động trên chân Compare Ouput còn
tùy thuộc vào từng chế độ hoạt động của timer/counter như bên dưới.
• Bit 3 – FOC1A: Force Output Compare for Compare unit A – Kích (ép) sự kiện
Output Compare cho bộ so sánh A bằng tay.
• Bit 2 – FOC1B: Force Output Compare for Compare unit B – Kích (ép) sự kiện
Output Compare cho bộ so sánh B bằng tay.
• Bit 1:0 – WGM11:0: Waveform Generating Mode – Chế độ phát sóng.

Timer/Counter 1 Control Register B - Thanh ghi điều khiển B


Timer/Counter1
• Bit 7 – ICNC1: Input Capture Noise Canceler – Kích hoạt chức năng chống
nhiễu cho Input Capture.
• Bit 6 – ICES1: Input Capture Edge Select – Chọn sườn kích hoạt Input Capture.
0 – Falling; 1 – Rising.
• Bit 5 – Reserved
• Bit 4:3 – WGM13:2: Waveform Generating Mode – Chế độ phát sóng.
Tương tự như TCCR1A
• Bit 2:0 – CS12:0 – Clock Select – Lựa chọn nguồn clock.

Timer/Counter 1 Register – TCNT1H and TCNT1L – Thanh ghi counter của


Timer/Counter 1

Output Compare Register 1 A – OCR1AH and OCR1AL – Thanh ghi so sánh


ngõ ra 1A

Output Compare Register 1 B – OCR1BH and OCR1BL – Thanh ghi so sánh


ngõ ra 1B
Input Capture Register 1 – ICR1H and ICR1L – Thanh ghi Input Capture.

Timer/Counter Interrupt Mask Register – TIMSK – Thanh ghi mặt nạ ngắt

• Bit 5 – TICIE1: Timer/Counter 1, Input Capture Interrupt Enable – Cho phép


ngắt Input Capture.
• Bit 4 – OCIE1A: Timer/Counter 1, Output Compare A Match Interrupt Enable –
Cho phép ngắt khi Output Compare A Match.
• Bit 3 – OCIE1B: Timer/Counter 1, Output Compare B Match Interrupt Enable –
Cho phép ngắt khi Output Compare B Match.
• Bit 2 – TOIE1: Timer/Counter 1, Overflow Interrupt Enable – Cho phép ngắt
tràn.
Timer/Counter Interrupt Flag Register – Thanh ghi cờ ngắt

• Bit 5 – ICF1: Timer/Counter 1, Input Capture Flag – Cờ ngắt Capture.


• Bit 4 – OCF1A: Timer/Counter 1, Output Compare A Match Flag – Cờ ngắt
Match cho Output Compare A.
• Bit 3 – OCF1B: Timer/Counter 1, Output Compare B Match Flag – Cờ ngắt
Match cho Output Compare B.
• Bit 2 – TOV1: Timer/Counter 1, Overflow Flag – Cờ ngắt tràn.
10.4. 8-bit Timer/Counter 2
10.4.1. Overview
10.4.2. Clock Source

10.4.3. Output Compare


10.4.4. Chế độ hoạt động thông thường
Normal Mode
Clear Timer on Compare Match (CTC) Mode
Fast PWM Mode

Phase Correct PWM Mode


10.4.5. Asynchronous Operation – Chế độ hoạt động bất đồng bộ
Lưu ý khi chuyển từ chế độ đồng bộ (Synchronous) sang bất đồng bộ
(Asynchronous): giá trị trong thanh ghi điều khiển (TCCR2) có thể bị mất trong
quá trình chuyển đổi giữa 2 chế độ này. Cần phải theo trình tự sau:
• Cấm ngắt Timer/Counter 2 (Clear bit OCIE2 và TOIE2).
• Chọn nguồn clock cần chuyển (thiết lập giá trị AS2).
• Ghi giá trị mới vào TCNT2, OCR2 và TCCR2.
• Trường hợp chuyển sang chế độ bất đồng bộ: chờ TCN2UB, OCR2UB và
TCR2UB.
• Clear cờ ngắt Timer/Counter 2.
• Cho phép ngắt trở lại (nếu cần).
Bộ dao động được thiết kế tối ưu để sử dụng với thạch anh 32.768kHz. Sử dụng
nguồn clock ngoài lên chân TOSC1 có thể khiến timer/counter 2 hoạt động không
chính xác. Tần số clock CPU phải gấp trên 4 lần tần số bộ dao động.
Khi ghi giá trị mới vào 1 trong 3 thanh ghi TCNT2, OCR2 hoặc TCCR2, giá trị đó
được đưa vào bộ nhớ tạm của thanh ghi tương ứng và được chốt lại sau 2 sườn lên
ở chân TOSC1. Do vậy không được ghi giá trị mới trước khi giá trị hiện tại trong
thanh ghi tạm được chuyển tới thanh ghi thực sự. sử dụng thanh ghi trạng thái hoạt
động bất đồng bộ (Asynchronous Status Register) để kiểm tra khi nào giá trị từ
thanh ghi tạm được chuyển tới đích.
Khi thực thi chế độ tiết kiệm năng lượng (Power save) hoặc chế độ chờ mở rộng
(Extended Standby), sau khi đã ghi giá trị vào TCNT2, OCR2 hoặc TCCR2, cần
phải chờ cho giá trị đó được ghi vào hoàn toàn (cập nhật hoàn toàn) nếu
timer/counter 2 được sử dụng để đánh thức (wake up) MCU, nếu không, MCU sẽ
đi vào chế độ ngủ trước khi những giá trị trên được cập nhật. Điều này rất quan
trọng trong trường hợp sử dụng ngắt so sánh timer/counter 2 (Output Compare 2
Interrupt) để đánh thức MCU dậy, vì khi giá trị đang được ghi vào OCR2 hoặc
TCNT2, chức năng Output Compare bị cấm tự động (bằng phần cứng). Như vậy
nếu giá trị chưa được cập nhật, MCU sẽ ngủ trước khi bit OCR2UB xóa về 0, và
như thế, sẽ không bao giờ có Compare Match Interrupt, và MCU sẽ không được
đánh thức dậy. Khi Timer/Counter 2 sử dụng để đánh thức MCU từ chế độ tiết
kiệm năng lượng hay chế độ chờ mở rộng, một điểm cần lưu ý khi thực thi lại (re-
enter) các chế độ này: mức logic của interrupt cần 1 chu kỳ TOSC1 để reset. Nếu
thời gian giữa wake-up và re-entering chế độ ngủ ngắn hơn 1 chu kỳ TOSC1, ngắt
sẽ không xảy ra và MCU sẽ không thể thức dậy được. Cần theo trình tự sau:
• Ghi giá trị vào TCCR2, TCNT2 hoặc OCR2.
• Chờ cho đến khi Cờ báo bận cập nhật (Update Busy Flag) trong ASSR về 0.
• Truy nhập vào chế độ Power save hoặc Extended Standby.
Trong chế độ hoạt động bất đồng bộ, bộ dao động 32.768kHz của Timer/Counter 2
luôn luôn chạy, trừ chế độ nguồn giảm (Powerdown) hoặc chế độ chờ (Standby).
Sau sự kiện reset khi bật nguồn (Powerup Reset) hoặc đánh thức từ chế độ nguồn
giảm hoặc chế độ chờ (wake-up from Powerdown or Standby mode), phải cẩn
thận rằng bộ dao động có thể cần lâu hơn 1 giây để ổn định. Như vậy khuyến cáo
rằng nên đợi ít nhất 1 giây sau khi Power-up hoặc wake-up từ Power-down hoặc
Standby khi sử dụng Timer/Counter 2. Nội dung của toàn bộ thanh ghi
Timer/Counter 2 sẽ bị mất sau khi wake-up từ Power-down hoặc Standby.
Mô tả chức năng đánh thức từ chế độ Power Save hoặc chế độ chờ mở rộng trong
hoạt động bất đồng bộ của timer: Khi xảy ra điều kiện ngắt, tiến trình wake-up
được bắt đầu vào chu kì tiếp theo sau đó, điều đó có nghĩa là timer luôn chạy trước
1 chu kỳ trước khi CPU truy xuất và đọc giá trị counter trong timer. Sau khi được
đánh thức, MCU bị trì hoãn 4 chu kỳ, thực thi chương trình ngắt và chạy tiếp
chương trình theo sau dòng lệnh SLEEP.
Đọc giá trị counter TCNT2 quá nhanh sau khi được đánh thức từ chế độ Power
Save có thể không chính xác. Vì counter tăng bởi xung clock TOSC, việc đọc giá
trị counter phải thực hiện thông qua thanh ghi được đồng bộ hóa với clock hệ
thống. Quá trình đồng bộ xảy ra mỗi sườn lên của TOSC1. Khi đánh thức từ chế
độ Power Save, clock hệ thống được kích hoạt trở lại, giá trị đọc ra từ thanh ghi
TCNT2 lúc đó là giá trị trước khi truy nhập vào chế độ ngủ, cho đến sườn lên tiếp
theo của TOSC1 thì giá trị đó mới được cập nhật bởi giá trị hiện tại. Pha của clock
TOSC sau khi đánh thức không thể dự báo được, nó phụ thuộc vào thời gian đánh
thức. Phải theo trình tự như sau:
• Ghi bất kì giá trị nào vào thanh ghi OCR2 hoặc TCCR2.
• Chờ cho cờ Update Busy xóa.
• Đọc giá trị TCNT2.
Trong hoạt động bất đồng bộ, việc đồng bộ cờ ngắt (Interrupt Flag) cho timer bất
đồng bộ mất 3 chu kì CPU cộng với 1 chu kỳ timer. Vì vậy, timer luôn đi trước
việc CPU đọc giá trị timer ít nhất 1 chu kỳ nếu dựa vào việc thiết lập cờ ngắt.
Chân ngõ ra Output Compare được thay đổi dựa theo clock timer chứ không được
đồng bộ với clock hệ thống.
10.4.6. Mô tả thanh ghi
Timer/Counter Control Register - TCCR2 – Thanh ghi điều khiển

• Bit 7 – FOC2: Force Output Compare – Kích (ép) Output Compare bằng tay.
• Bit 6, 3 – WGM21:0: Waveform Generation Mode – Chế độ phát sóng.

• Bit 5:4 – COM21:0: Compare Match Output Mode – Chế độ ngõ ra khi Compare
Match.
Tùy thuộc vào từng chế độ hoạt động của Timer/Counter 2 như bên dưới.
• Bit 2:0: CS22:0: Clock Select – Lựa chọn nguồn clock.

Timer/Counter Register – TCNT2 – Thanh ghi Timer/Counter 2


(8-bit)

Output Compare Register – Thanh ghi so sánh


(8 bit)

Timer/Counter Interrupt Mask Register – TIMSK – Thanh ghi mặt nạ ngắt

• Bit 7 – OCIE2: Timer/Counter 2 Output Compare Match Interrupt Enable – Cho


phép ngắt khi có Output Compare Match.
• Bit 6 – TOIE2: Timer/Counter 2 OverFlow Interrupt Enable – Cho phép ngắt
tràn.
Timer/Counter Interrupt Flag Register – TIFR - Thanh ghi cờ ngắt
• Bit 7 – OCF2: Output Compare Flag 2 – Cờ ngắt Output Compare.
• Bit 6 – TOV2: Timer/Counter 2 OverFlow Flag – Cờ ngắt tràn.
10.4.7. Timer/Counter 2 Prescale – Bộ chia Timer/Counter 2

Special Function IO Register – SFIOR – Thanh ghi IO chức năng đặc biệt

• Bit 1 – PSR2: Prescale Reset Timer/Counter 2 – Reset bộ chia Timer/Counter 2


11. Giao tiếp nối tiếp bất đồng bộ - USART
12. Bài tập basic review tổng hợp
12.1. Điều khiển LED với nút nhấn – IO port và External Interrupt
Sử dụng PINA.0 � PINA.3 làm ngõ vào cho 4 nút nhấn, tác động mức thấp.
Thiết kế sao cho bất kì nút nào nhấn cũng tác động mức thấp lên chân INT0
(PIND.2)
Sử dụng toàn bộ PORTC làm output lái 8 LED.
Sử dụng ngắt INT0, viết chương trình đọc trạng thái nút nhấn và chương trình
chớp tắt LED tương ứng theo từng nút nhấn như sau:
• Nút PINA.0: chớp tắt toàn bộ LED.
• Nút PINA.1: Chớp tắt LED xen kẽ.
• Nút PINA.2: Tắt dần (Trái sang phải hoặc ngược lại).
• Nút PINA.3: Stop – toàn bộ LED đều tắt.
Tinh chỉnh chương trình để đảm bảo tính realtime.
Bài tập mở rộng
Sử dụng 1 nút nhấn kết nối trực tiếp với INT0.
• Nhấn lần 1: chớp tắt toàn bộ LED.
• Nhấn lần 2: Chớp tắt LED xen kẽ.
• Nhấn lần 3: Tắt dần (Trái sang phải hoặc ngược lại).
• Nhấn lần 4: Stop – toàn bộ LED đều tắt.
Nhấn thêm lần nữa, quay về lấn 1.
Sau khi mô phỏng thành công, đổ chương trình xuống KIT để chạy thực tế.
12.2. Nhấp nháy LEDs với timer – IO port và Timer Over Flow Interrupt
Thực hiện mô phỏng trong proteus, sử dụng thạch anh 8MHz, ngõ ra PORTC.0 lái
led tích cực mức thấp.
Viết chương trình kết hợp sử dụng ngắt tràn timer để chớp tắt led với tần số 2Hz.
Sử dụng oscilloscope trong proteus để kiểm chứng tần số này.
Bài tập mở rộng
Thực hiện trên KIT, với tần số thạch anh thực là 7.3728MHz, cũng sử dụng ngắt
tràn timer mở rộng chương trình dịch 1 điểm sáng từ phải sang trái và ngược lại
trên PORTC với tần số 2Hz.
12.3. Chương trình tạo xung với timer – Output Compare Mode
Thực hiện mô phỏng trong proteus, thạch anh 8MHz, sử dụng chân Output
Compare 0 (OC0), viết chương trình tạo xung 5K với timer 0.
Dùng oscilloscope trong proteus để kiểm chứng tần số xung tạo được.
12.4. Chương trình đếm xung – Timer in Counter mode
Thực hiện mô phỏng trong proteus, thạch anh tùy ý, sử dụng chế độ counter trong
timer 0 đếm xung tác động lên chân T0.
Kết hợp chức năng compare match để thông báo số lần đếm đã đạt đến giới hạn
yêu cầu (5 lần).
12.5. Điều khiển LEDs dimmer với PWM – PWM mode in Timer
Sử dụng chức năng PWM trên timer 0 (8-bit) để điều khiển led mắc trên chân OC0
(Output compare 0) sáng theo 3 cấp: tắt – sáng vừa – sáng hết cỡ trên KIT thí
nghiệm.
Bài tập mở rộng
Thực hiện mô phỏng trên Proteus, lưu ý các trường hợp đặc biệt khi set giá trị cho
OCR0 bằng 0 và 255, mô phỏng trong các trường hợp đó có đúng không?
Như vậy để LED (high active) trong trường hợp này tắt hẳn khi điều khiển với
PWM thì dùng chế độ nào?
Table Of Content
1. Cấu trúc tổng quát ATMEGA32 – Structure
Overview...................................................................................................3
2. AVR CPU
Core.............................................................................................................................
..................................5
2.1. Tổng
quan.............................................................................................................................
.................................5
2.2. ALU – Arithmetic Logic
Unit.............................................................................................................................
......6
2.3. Thanh ghi trạng thái – Status
Register....................................................................................................................6
2.4. Tập các thanh ghi làm việc đa năng – General Purpose Register
File...................................................................7
2.5. Thanh ghi X, Y và
Z..................................................................................................................................
..............7
2.6. Con trỏ ngăn xếp – Stack Pointer SP)......................8
2.7. Xử lý reset và ngắt – Reset and Interrupt
Handling................................................................................................8
3. Tổ chức bộ nhớ trong ATMEGA32 – AVR ATMEGA32
Memories................................................................................9
3.1. Bộ nhớ chương trình – In-System Reprogrammable Flash Program
Memory.......................................................9
3.2. Bộ nhớ dữ liệu – SRAM Data
Memory.................................................................................................................10
3.3. Bộ nhớ EEPROM – EEPROM Data
Memory.......................................................................................................10
3.4. Vùng nhớ IO – IO
Memory.......................................................................................................................
............10
4. Clock hệ thống và các tùy chọn clock - System Clock and Clock
Options...................................................................10
5. Quản lý năng lượng và các chế độ nghỉ - Power Management and Sleep
Modes......................................................10
6. Điều khiển hệ thống và Reset – System Control and
Reset.........................................................................................10
7. Ngắt –
Interrupts.....................................................................................................................
......................................11
7.1. Các vector ngắt trong
ATMEGA32................................................................................................................
.......11
7.2. Mô tả thanh
ghi...............................................................................................................................
......................12
8. I/O
Port..............................................................................................................................
...........................................12
8.1. Giới
thiệu............................................................................................................................
..................................12
8.2. Port với chức năng IO số thông
thường...............................................................................................................12
8.3. Các chức năng phụ của từng
port........................................................................................................................14
8.4. Mô tả thanh ghi trong I/O
Port..............................................................................................................................
14
9. Ngắt ngoài - External
Interrupts.....................................................................................................................
..............15
9.1. Thiết lập kiểu ngắt – Interrupt Sense
Control.......................................................................................................15
9.2. Cho phép ngắt – Interrupt Request
Enable..........................................................................................................16
9.3. Cờ ngắt – Interrupt
Flag.............................................................................................................................
..........16
10. Timer/Counter
0/1/2............................................................................................................................
.....................16
10.1. 8-bit Timer/Counter
0..................................................................................................................................
...17
10.1.1.
Overview.....................................................................................................................
...............................17
10.1.2. Clock
Source.........................................................................................................................
.....................17
10.1.3. Output
Compare......................................................................................................................
...................18
10.1.4. Chế độ hoạt
động............................................................................................................................
...........19
10.1.5. Mô tả thanh
ghi...............................................................................................................................
...........21
10.2. Timer/Counter 0/1
Prescale.......................................................................................................................
....24
10.3. 16-bit Timer/Counter
1..................................................................................................................................
.25
10.3.1.
Overview.....................................................................................................................
...............................25
10.3.2. Clock
Source.........................................................................................................................
.....................26
10.3.3. Input
Capture........................................................................................................................
.....................26
10.3.4. Output
Compare......................................................................................................................
...................28
10.3.5. Chế độ hoạt
động............................................................................................................................
...........28
10.3.6. Mô tả thanh
ghi...............................................................................................................................
...........33
10.4. 8-bit Timer/Counter
2..................................................................................................................................
...38
10.4.1.
Overview.....................................................................................................................
...............................38
10.4.2. Clock
Source.........................................................................................................................
.....................38
10.4.3. Output
Compare......................................................................................................................
...................39
10.4.4. Chế độ hoạt động thông
thường.................................................................................................................39
10.4.5. Asynchronous Operation – Chế độ hoạt động bất đồng
bộ........................................................................41
10.4.6. Mô tả thanh
ghi...............................................................................................................................
...........42
10.4.7. Timer/Counter 2 Prescale – Bộ chia Timer/Counter
2................................................................................45
11. Giao tiếp nối tiếp bất đồng bộ -
USART....................................................................................................................45
12. Bài tập basic review tổng
hợp..............................................................................................................................
....45
12.1. Điều khiển LED với nút nhấn – IO port và External
Interrupt..........................................................................45
12.2. Nhấp nháy LEDs với timer – IO port và Timer Over Flow
Interrupt................................................................46
12.3. Chương trình tạo xung với timer – Output Compare
Mode............................................................................46
12.4. Chương trình đếm xung – Timer in Counter
mode.........................................................................................46
12.5. Điều khiển LEDs dimmer với PWM – PWM mode in
Timer............................................................................46

You might also like