Bộ điều khiển MCU
Trong phần này mình sẽ trình bày về các vấn đề sau :
1. Bootloader : Chế độ đọc trong lúc nạp
2. Sleep - Power down : Chế độ ngủ và chế độ giảm công suất .........
3. Chế độ hoạt động - trạng thái làm việc của ALU, con trỏ SP.
4. Chế độ hoạt động đặc biệt của Timer/Counter 2 qua thanh ghi điều
khiển ASSR
5. Chế độ Reset cả 2 bộ Timer/Counter 0 và Timer/Counter 1 qua thanh
ghi điều khiển SFIOR
6. Chế độ kiểm tra lỗi trên chip On-chip Debug
7. Chế độ ngắt ngoài của MCU
8. Chế độ trên thanh ghi SPMCR
Bộ điều khiển MCU
1.3.1 ALU – Arithmetic Logic Unit - Đơn vị xử lý số học và logic
AVR ALU hiệu năng cao tác động trựuc tiếp tới 32 thanh ghi đa năng. Trong
vòng 1 chu kỳ, các toán hạng số học thực hiện giữa các thanh ghi đa năng hoặc giữa
một thanh ghi và một toán hạng tức thời. Các toán tử của ALU được chia làm 3 loại
chính: Số học, logic, và xử lý bit. Một số phép xử lý của kiến trúc này cũng cung cấp
bộ nhân số có dấu và không có dấu và dạng phân số.
1.3.2 Status Register – Thanh ghi trạng thái
Thanh ghi trạng thái chứa thông tin về kết quả thưc hiện của hầu hết các lệnh số
học. Các thông tin này có thể được sử dụng để điều khiển chương trình. Chú ý rằng các
thanh ghi trạng thái được cập nhật sau tất cả các hoạt động của ALU. Trong nhiều
trường hợp, điều này sẽ bỏ đi những cần thiết khi sử dụng câu lệnh so sánh chuyên
dụng, kết quả nhanh hơn và đoạn chương trình ngắn gọn hơn.
Thanh ghi trạng thái không tự động lưu trữ khi đang nhập vào môt thường trình ngắt và
lưu trữ khi trở về tự một ngắt. Điều này phải được quản lý bằng phần mềm. Thanh ghi
trạng thái AVR – SREG - được định nghĩa như sau:
• Bit 7 – I: Global Interrupt Enable- bit cho phép ngắt toàn cục
Bit cho phép ngắt toàn cục phải được đặt để cho các ngắt có thể hoạt động.
Điều khiển hoạt động của các ngắt riêng biệt được thực hiện trong các thanh ghi điều
khiển riêng biệt. Nếu thanh ghi cho phép ngắt toàn cục được xóa, không có một ngắt
riêng biệt nào được hoạt động. Bit I được xóa bởi phần cứng sau khi một ngắt xảy ra và
được đặt bởi lệnh RETI để cho các phép các ngắt tiếp theo hoạt động. Bit I cũng có thể
được đặt và xóa bởi câu lệnh SEI và CLI trong các ứng dụng.
• Bit 6 – T: Bit Copy Storage
Các câu lệnh copy bit BLD (Bit LoaD) và BST (Bit STore) sử dụng bit T như là
đích hoặc nguồn cho bit hoạt động. 1 bit từ một thanh ghi trong tệp thanh ghi có thể
được copy vào bit T bằng lệnh BST và một bit trong T có thể được copy vào 1 bit
trong thanh ghi trong tệp thanh ghi bằng lệng BLD.
Bộ điều khiển MCU
• Bit 5 – H: Half Carry Flag
Cờ nhớ một nửa dùng cho các toàn hạng hạng một nửa byte trong các phép toán
số học. Cờ H sử dụng phép toán số học với số BDC .
• Bit 4 – S: Sign Bit, S = N
⊕
V – bit dấu
Bit S là phép XOR giữa cờ âm và cờ tràn V .
• Bit 3 – V: Two’s Complement Overflow Flag – cờ tràn mã bù 2
Cờ tràn V hỗ trợ phép toán số bù 2.
• Bit 2 – N: Negative Flag – cờ âm
Cờ âm N hiển thị kết quả âm của phép toán logic hoặc số học.
• Bit 1 – Z: Zero Flag
Cờ Zero Z hiển thị kết quả bằng 0 của phép toán logic hoặc số học.
• Bit 0 – C: Carry Flag
Cờ nhớ C hiển thị số nhớ trong phép toán logic hoặc số học.
Bộ điều khiển MCU
1.3.4 Stack Pointer – ngăn xếp
Stack thường được sử dụng để chứa dữ liệu tạm thời, cho việc lưu trữ các biến
địa phương và cho việc lưu trữ địa chỉ trở về sau khi gọi các thường trình và các ngắt.
Thanh ghi con trỏ thường trỏ tới đỉnh của stack. Chú ý rằng stack được thực hiện khi
tăng thêm từ địa chỉ cao đến địa chỉ thấp, điều này nói lên rằng khi thực hiện lệnh
PUSH thì con trỏ sẽ tự động giảm. Con trỏ trỏ đến vùng ngăn xếp dữ liệu SRAM .
Không gian ngăn xếp trong SRAM phải được định nghĩa bằng chương trình trước khi
bất cứ thường trình hoặc ngắt được thực hiện. Con trỏ ngăn xếp phải được set để trỏ
tới địa chỉ trên $0100. Con trỏ ngăn xếp được giảm đi 1 khi dữ liệu được cất vào ngăn
xếp và được giảm đi 2 khi cất địa chỉ trở về của thường trình hoặc ngắt. SP được tăng
lên khi dữ liệu được lấy ra.
AV R S P được thực hiện với 2 thanh ghi 8 bit trong không gian I/O. Số các bit
thực tế sử dụng là tuỳ thuộc. Chú ý rằng không gian dữ liệu trong một số thực thi của
kiến trúc AVR rất nhỏ, chỉ SPL là cần. Trong trường hợp này SPH không sử dụng.
Hình 1.6 Sơ đồ các thanh ghi của con trỏ
1.3.5 Reset and Interrupt Handling - điều khiển ngắt và reset
AVR cung cấp 1 vài nguồn ngắt khác nhau. Các ngắt này và vector reset riêng
biệt có vector chương trình riêng biệt nằm trong không gian nhớ chương trình. Tất cả
các ngắt được chỉ định bởi các bit cho phép riêng biệt mà các bit này phải được ghi
mức logic 1 cùng với bit cho phép ngắt toàn cục trong thanh ghi trạng thái để cho phép
ngắt. Phụ thuộc vào giá trị PC, các ngắt này phải được tự động loại bỏ khi các bit Boot
Lock - BLB02 or BLB12 - được lập trình. Yếu tố này cải thiện độ an toàn phần mềm.
Địa chỉ thấp nhất trong không gian bộ nhớ chương trình được mặc định là Reset
và Interrupt Vectors. Bảng vector ngắt – bảng 3.1.
Bộ điều khiển MCU
Bảng 1.1 Bảng vector ngắt và reset
Khi địa chỉ càng nhỏ thì thứ tự ưu tiên càng cao.
Các vector ngắt có thể được chuyển sang đầu của vùng Boot Flash bằng cách
đặt bit IVSEL trong thanh ghi điều khiển ngắt (MCUCR). Reset Vector có thể được
chuyển sang đầu của vùng Boot Flash bằng cách lập trình BOOTRST fuse.
Khi một ngắt xảy ra, bit I (bit cho phép ngắt toàn cục) được xóa và tất cả các
ngắt được loại bỏ. Phần mềm sử dụng có thể ghi mức logic 1 vào bit I để cho phép các
ngắt tiếp theo. Tất cả các ngắt được kích hoạt có thể ngắt những thường trình ngắt hiện
tại. Bit I được đặt tự động khi trở về từ lệnh RETI của ngắt.
Bộ điều khiển MCU
Có 2 loại ngắt cơ bản.
+ Loại thứ nhất được gây ra bởi sự kiện mà đặt cờ ngắt. Đối với loại ngắt này,
PC được hướng tới Interrupt Vector tương ứng để thực hiện thường trình phục vụ ngắt
và phần cứng xoá cờ ngắt tương ứng. Các cờ ngắt cũng có thể được ghi mức logic 1
vào vị trí bit cờ để được xoá. Nếu một điều kiện ngắt xảy ra trong khi bit cho phép ngắt
tương ứng bị xoá, thì cờ ngắt sẽ được đặt và được nhớ cho đến khi ngắt được thực hiện,
hoặc là cờ ngắt được xoá bởi phần mềm. Tương tự nếu 1 hoặc nhiều điều kiện ngắt xảy
ra trong khi cờ cho phép ngắt toàn cục bị xoá thì các cờ ngắt tương ứng sẽ được đặt và
nhớ cho đến khi cờ cho phép ngắt toàn cục được đặt và nó sẽ được thực hiện theo thứ
tự ưu tiên.
+ Loại ngắt thứ 2 sẽ kích hoạt kéo dài trong thời gian điều kiện ngắt tồn tại. Các
ngắt này không cần thiết phải có cờ ngắt. Nếu điều kiện ngắt mất đi trước khi ngắt
được cho phép, thì ngắt sẽ không xảy ra.
Khi AVR thoát khỏi từ một ngắt, nó sẽ luôn trở về chương trình chính và thực
hiện một hoặc nhiều lệnh trước khi một ngắt nào đó còn đợi đó được phục vụ.
Chú ý rằng các thanh ghi trạng thái không tự động lưu trữ khi nhập vào một
thường trình ngắt, và cũng không lưu trữ lại khi trở về từ một thường trình ngắt. Điều
này phải được thực hiện bởi phần mềm.
Khi sử dụng câu lệnh CLI để cấm ngắt, các ngắt sẽ không được tác động ngay
lập tức. Không có ngắt nào được thực hiện sau khi thực hiện lệnh CLI, thậm chí nó xảy
ra cùng lúc với lệnh CLI.
Thời gian đáp ứng của 1 ngắt
Việc thực hiện ngắt trong ít nhất 4 chu kỳ đồng hồ với tất cả các ngắt. Sau 4 chu
kỳ đồng hồ, địa chỉ vector chương trình tương ứng với thường trình điều khiển ngắt
thực sự được khởi tạo. Trong thời gian 4 chu kỳ này, PC được cất vào trong ngăn xếp.
Vector thường là lệnh nhảy đến thường trình ngắt và lệnh nhảy này mất 3 chu kỳ đồng
hồ. Nếu một ngắt xảy ra trong khi thực hiện một lệnh nhiều chu kỳ thì lệnh được hoàn
thành trước khi ngắt được phục vụ. Nếu một ngắt xảy ra khi MCU đang trong chế độ
ngủ thì thời gian đáp ứng ngắt sẽ tăng thêm 4 chu kỳ. Thời gian tăng thêm này là thời
gian để khởi động lại từ chế độ ngủ.
Sự trở về từ một thường trình điều khiển ngắt mất 4 chu kỳ xung nhịp. Trong
thời gian 4 chu kỳ này, PC (2 bytes) được lấy ra từ ngăn xếp, SP được tăng lên 2, và bit
I trong SREG được đặt.
Bộ điều khiển MCU
Chế độ hoạt động và trạng thái làm việc của ALU và con trỏ SP
1.Status Register (SREG)
Đây là thanh ghi trạng thái có 8 bit lưu trữ trạng thái của ALU sau các phép
tính số học và logic.
C: Carry Flag ;cờ nhớ (Nếu phép toán có nhớ cờ sẽ được thiết lập)
Z: Zero Flag ;Cờ zero (Nếu kết quả phép toán bằng 0)
N: Negative Flag (Nếu kết quả của phép toán là âm)
V: Two’s complement overflow indicator (Cờ này được thiết lập khi tràn số
bù 2)
V, For signed tests (S=N XOR V) S: N
H: Half Carry Flag (Được sử dụng trong một số toán hạng sẽ được chỉ rõ
sau)
T: Transfer bit used by BLD and BST instructions(Được sử dụng làm nơi
chung gian trong các lệnh BLD,BST).
I: Global Interrupt Enable/Disable Flag (Đây là bit cho phép toàn cục ngắt.Nếu
bit này ở trang thái logic 0 thì không có một ngắt nào được phục vụ.)
2.SP
Là một thanh ghi 16 bit nhưng cũng có thể được xem như hai thanh ghi chức
năng đặc biệt 8 bit. Có địa chỉ trong các thanh ghi chức năng đặc biệt là $3E
(Trong bộ nhớ RAM là $5E). Có nhiệm vụ trỏ tới vùng nhớ trong RAM chứa
ngăn xếp.
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được
lưu vào ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí. Và con trỏ ngăn xếp
sẽ giảm 1 khi thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ
ngăn xếp sẽ tăng 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ
tăng 2. Như vậy con trỏ ngăn xếp cần được chương trình đặt trước giá trị khởi
tạo ngăn xếp trước khi một chương trình con được gọi hoặc các ngắt được cho
phép phục vụ. Và giá trị ngăn xếp ít nhất cũng phải lơn hơn hợc bằng 60H (0x60)
vì 5FH trỏ lại là vùng các thanh ghi.
Bộ điều khiển MCU
3.Ngắt và lập trình ngắt. ( con trỏ SP - bộ đếm chương trình PC - ngắt )
Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng
sẵn xàng cho đổi dữ liệu của mình.Ví dụ:Khi bộ truyền nhận UART nhận được
một byte nó sẽ báo cho CPU biết thông qua cờ RXC,hợc khi nó đã truyền được
một byte thì cờ TX được thiết lập…
Phục vụ ngắt:
Nếu như ngắt đó được cho phép thực hiện thì:
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và
lưu vị trí đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới
vector phuc vụ ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới khi gặp
lệnh RETI (return from interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục
thực hiện chương trình mà trước khi có ngăt nó đang thực hiện. Trong trường
hợp mà có nhiều ngắt yêu cầu cùng một lúc thì CPU sẽ lưu các cờ báo ngắt đó
lại và thực hiện lần lượt các ngắt theo mức ưu tiên.Trong khi đang thực hiện
ngắt mà xuất hiện ngắt mới thì sẽ xảy ra hai trường hợp.Trường hớp ngắt này có
mức ưu tiên cao hơn thì nó sẽ được phục vụ. Còn nó mà có mức ưu tiên thấp hơn
thì nó sẽ bị bỏ qua.
Trong tài liệu của hãng sản xuất không thấy nói tới bộ nhớ ngăn xếp?vâng nó
là vùng bất kì trong SRAM từ địa chỉ 0x60 trở lên. Để truy nhập vào SRAM
thông thường thì ta dùng con trỏ X,Y,Z và để truy nhập vào SRAM theo kiểu
ngăn xếp thì ta dùng con trỏ SP.Con trỏ này là một thanh ghi 16 bit và được truy
nhập như hai thanh ghi 8 bit chung có địa chỉ :SPL :0x3D/0x5D(IO/SRAM) và
SPH:0x3E/0x5E.
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được
lưu vào ngăn xếp trong khi con trỏ ngăng xếp giảm hai vị trí.Và con trỏ ngăn
xếp sẽ giảm 1 khi thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con
trỏ ngăn xếp sẽ tăng 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp
sẽ tăng 2. Như vậy con trỏ ngăn xếp cần được chương trình đặt trước giá trị khởi
tạo ngăn xếp trước khi một chương trình con được gọi hoặc các ngắt được cho
phép phục vụ.Và giá trị ngăn xếp ít nhất cũng phải lơn hơn 60H (0x60) vì 5FH
trỏ lại là vùng các thanh ghi.
Để thay đổi giá trị của SP ta có hai cách:
;Su dung dia chi truc tiep trong cac thanh I/O
Ldi R17,0x00
OUT SPH,R17 ;nap gia tri 0x00 vao thanh ghi SPH
Ldi R17,0xff
OUT SPL ;nap gia tri 0xff vao thanh ghi SPL
;end
;su dung dia chi cua chung gian tiep qua SRAM
Ldi R17,0x00
STS 0x5E,R17
Ldi R17,0xFF
STS 0x5D,R17
Bộ điều khiển MCU
;end
1. Xung nhịp hệ thống và các lựa chọn xung nhịp.