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
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
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
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
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
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.
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
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.
đơ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-