Link sách cho bạn nào chưa có:
/>usp=sharing
Interrupts, resets and configuration (trang 244)
6.2. Basics of Interrupts
Interrupt(ngắt) là một nguyên lý giúp VDK hay hệ thống máy tính đồng bộ các
hoạt động I/O, xử lí lỗi cũng như những sự kiện khẩn cấp, phân bổ tài nguyên,v.v
6.2.1 What Is an Interrupt?
Là một sự kiện buộc CPU ngừng việc hoạt động thường nhật của mình để giải quyết sự
kiện đó. Interrupt có thể bắt nguồn từ bên trong hoặc bên ngoài CPU. Một số trường hợp
có thể được xem là software interrupt là sai opcode, overflow(tràn), chia 0,
underflows(tràn dưới?).
(đọc thêm 2 ví dụ trang 244 để hiểu thêm)
6.2.3 Interrupt Maskability
- Maskable Interrupt: là những interrupt mà CPU có thể bỏ qua, điều này được thực
hiện bằng cách clear enable bit của interrupt tương ứng
- nonmaskable interrupts: là những interrupt mà CPU không thể bỏ qua, và phải xử
lý ngay lập tức
- Pending interrupt: là những interrupt có thể khơng được hoặc khơng được xử lý dù
cho đang được bật
6.2.4 lnterrupt Priority:
Máy tính có thể hỗ trợ đồng thời nhiều interrupt, nhưng nếu các interrupt này xảy ra đồng
thời thì máy tính sẽ xử lý thứ tự “mức độ ưu tiên”
6.2.5 lnterrupt Service:
interrupt service routine : là hàm mà CPU sẽ thực hiện nếu interrupt tương ứng xảy ra.
*lưu ý: trước khi thực hiện những hàm này thì CPU phải lưu Program counter (PC) và
thơng tin mà nó đang giữ, để sau khi hồn thành hàm interrupt service routine nó có thể
quay về và tiếp tục cơng việc của nó.
( trang 246 có mơ tả 8 bước mà nó thực hiện điều này)
Đối với:
-
maskable hardware interrupts: CPU sẽ hoàn thành lệnh (instruction) mà nó đang
thực hiện rồi mới xử lý interrupt
some nonmaskable interrupts: CPU có thể sẽ ngưng instruction mà nó đang thực
hiện để xử lý interrupt
Những interrupt được sinh ra khi mà các instruction bị lỗi mà khơng thể hồn
thành sẽ được xử lý bằng cách “báo lổi” và bỏ qua chương trình.
6.2.6 lnterrupt Vector
-
interrupt vector là địa chỉ đầu tiên của các interrupt service routine: ví dụ ở Pic18
sẽ là 0x08 và 0x18
Các phương pháp để xác định địa chỉ này:
-
Được định trước trong thiết kế (có lẽ là phần cứng): đây là phương pháp mà
pic và 8051 sử dụng
Lấy từ bảng interrupt vector: mỗi vector của interrupt được lưu sẳn trong một ô
nhớ đã định, tập hợp các ô nhớ này được gọi là interrupt vector table (bảng
interrupt vector). Motorola sử dụng phương pháp này.
Thực hiện một chu kì interrupt acknowledge (nhận biết interrupt): để thu
interrupt vector number, sau đó xử lý số này để xác định được vị trí ô nhớ mà
interrupt vector được lưu. Intel sử dụng phương pháp này, nhưng đây là cách it
hiệu quả nhất.
Mỗi interrupt sẽ có 1 flag tương ứng, khi phát hiện interrupt thì CPU sẽ kiểm tra các bit
này để xác định đâu là nguyên nhân gây ra nó, và sau đó xử lý.
6.2.7 Interrupt Programming
Bước 1: viết service routine ( giống như subroutine nhưng service routine kết thúc lệnh
retfie (return from interrupt enable) thay vì return). Hàm service routine phải đơn giản,
khơng nên q phức tạp.
Ví dụ :
cnt set 0x10
.
.
org 0x08
incf cnt,F,A
retfie
; interrupt vector
*Lưu ý set là mơt directive. Directive có thể hiểu là sự hỗ trợ từ phần mềm chỉ
giúp viết code dễ hơn. Trong trường hợp này thì tất cả các từ “cnt” sẽ được chương trình
tự động chuyển sang 0x10 khi nó chuyển sang phần cứng,
Sau khi thực hiện xong service routine thì CPU có thể quay về hoặc khơng quay
về chương trình mà nó đang thực hiện, vì các lỗi phần mêm cũng có thể gây ra các
interrupt.
Bước 2: (Pic khơng cần bước này) Đặt interrupt vector table( nói cách khác là đặt địa chỉ
bắt đầu cho các interrupt). Directive ORG được dùng cho mục đich này:
org 0x0kk
; interrupt vector
dw ISR-1
; địa chỉ của service routine cho interrupt 1
dw ISR-2
; địa chỉ của service routine cho interrupt 2
.
.
Retfie
Bước 3: Bật các interrupt cần sử lý (đặt “1” cho enable bit tương ứng)
6.2.8 Interrupt Overhead
Interrupt có thể kéo theo việc overhead (quá tải ?) do CPU phải lưu trữ dữ liệu,
state machine và thời gian cần để thực hiện service routine. Ở Pic 18 thì việc này khơng
ảnh hưởng nhiều do Pic chỉ lưu dữ liệu của program counter, WREG (working
register), STATUS, và BSR registers, nhưng đôi khi trong quá trình thực hiện service
routine, một số special function register cần được lưu thơng tin để chương trình hoạt
động bình thường (làm thời gian thực hiện service routine kéo dài)
6.3 Resets
Một số thanh ghi, flipflop và thanh ghi điều khiển trong I/O interface cần được cấu
hình trước khi CPU hoạt động. Điều đó được đảm bảo bởi các resets.
Có hai loại Reset:
-
power-on reset: được thực hiện ngay sau khi VDK được bật
Manual reset (thủ cơng): được dùng để giúp CPU thốt khỏi hầu hết các
trạng thái lỗi.
CPU sẽ tự khởi động lại (reboots) sau Reset
Địa chỉ bắt đầu của reset service routine là cố định và ở trong ROM (read-only
memory)
Reset là nonmaskable interrupts tức CPU buộc phải thực hiện Reset ngay lập tức,
nhưng không có dữ liệu nào được lưu trước khi reset.
6.4 The PIC18 Interrupts
PIC 18 có các nguồn interrupt sau:
-
Interrupt cạnh ( edge-triggered) INT0,INT1,..,INT3
Port B pins change (any one of upper four port B pins) interrupts.
Interrupt ngoại vi
6.4.1 PIC18 Interrupt Priority
Người dùng có thể chia các interrupt thành ưu tiên cao hay ưu tiên thấp tùy ý, hoặc
không.
6.4.2 Registers Related to Interrupts
Mỗi tác nhân gây ra interrupt sẽ có 3 bit để điều khiển:
-
Flag bit - báo hiệu interrupt có xảy ra hay không
Enable bit - dùng để bật và tắt interrupt tương ứng (thông thường các
interrupt được mặc định là tắt)
Bit ưu tiên - chỉ có giá trị ở chế độ ưu tiên, nếu tắt chế độ này đi thì khơng
cần quan tâm.
Những bit trên sẽ được chứa trong các thanh ghi điều khiển
PIC 18 có thể có tới 13 thanh ghi để điều khiển các interrupt:
RCON
INTCON . INTCON2 . INTCON3
Chế độ ưu tiên được bật trong thanh ghi
này và nó cũng cho biết tác nhân của
reset
Chứa flag, enable, priority, cấu hình của
các INT và port B change
PIR1, PIR2, and PIR3
Chứa các flag bit cho các interrupt ngoại
vi
PIE1, PIE2, and PIE3
Chứa các enable bit cho các interrupt
ngoại vi
IPR1, IPR2, and IPR3
Chứa các priority bit cho các interrupt
ngoại vi
(nội dung và tên của các bit trong các thanh ghi này được đề cập từ cuối trang 250)
Lưu ý: INT0 khơng có priority bit, vì nó ln là mức ưu tiên cao!
6.5 PIC18 Interrupt Operation
Khi bật chế độ ưu tiên
Interrupt ở mức cao: được điều khiển thông qua “2-lớp enable” (hiểu nôm
na là phải thay đổi 2 bit tương ứng )
Interrupt ở mức thấp: được điều khiển thông qua “3-lớp enable” (hiểu nôm
na là phải thay đổi 3 bit tương ứng )
Khi tắt chế độ ưu tiên
Core interrupt (interrupt lõi): được điều khiển thông qua “2-lớp enable”
Tất cả loại interrupt cịn lại: được điều khiển thơng qua “3-lớp enable”
CORE INTERRUPT bao gồm: INT pin (INTO . . . INT3) interrupts,
TMRO overflow interrupt, PORTB change interrupts.
6.5.1 PIC18 lnterrupt without Setting Priority:
-
Khi bit 7 (IPEN bit) của RCON = 0 ====> tắt chế độ ưu tiên, lúc này
PIC18 có thể cùng hoạt động với PIC16, gọi là compatible mode
Để bật bất kỳ Core interrupt thì người dùng phải
+ Nâng GIE bit lên “1”. GIE nằm trong INTCON
+ Nâng enable bit tương ứng
-
Để bật bất kỳ 1 trong tất cả loại interrupt cịn lại thì:
+ Nâng GIE bit
+ Nâng PEIE bit
+ Nâng enable bit tương ứng
-
Nếu PEIE = 0 thì tất cả các interrupt ngoại vi đều tắt
Hầu hết tất cả Flag đều phải được hạ xuống “0” trong service routine nếu
interrupt tương ứng xảy ra, nếu khơng hạ thì CPU sẽ lặp lại interrupt đó mãi
mãi
6.5.2 PIC18 lnterrupt with Priority Enabled:
-
GIE phải được nâng lên “1” vì nó được dùng để cấu hình các interrupt ưu tiên cao
tên gọi khác của nó là GIEH
-
PEIE cũng tương tư nhưng nó tác động mức ưu tiên thấp (tên khác: GIEL)
Nếu muốn bật một INTERRUPT nào đó thì enable bit của nó phải là “1” và GIE,
PEIE phải là “1”
Sau Reset thì tất cả interrupts đếu mặc định ở mức cao. Nên nếu muốn đưa 1
interrupt bất kì xuống “mức ưu tiên THẤp” thì phải đưa priority bit tương ứng của
nó về “0”
0x18 là interrupt vector cho ưu tiên mức thấp
0x08 là interrupt vector cho ưu tiên mức cao
Interrupt ưu tiên mức cao sẽ được thực hiện trước Interrupt ưu tiên mức thấp, thậm
chí khi Interrupt ưu tiên mức cao đang được thực hiện
(trang 263-264 có mơ tả về các interrupt và sau đó là code ở ASM và C)
6.7.1 Power-On Reset: reset khi phát hiện sự tăng lên của Vdd
6.7.2 Power-Up Timer: (PWRT) tạo ra một khoảng delay cho Vdd tăng lên đến một
ngưỡng nhất định, chip sẽ giữ trang thái RESET nếu PWRT = “1”
6.7.3 Oscillator Start-Up Timer: Tạo ra 1 khoảng delay để chắc chắn mạch dao động đã
khởi động và ổn định.
6.7.4 Brown-Out Reset: RESET chip nếu trong lúc hoạt động Vdd giảm xuống thấp hơn
mức cho phép và khởi động lại nếu nó trên mức này. Nếu Power-Up Timer: được bật thì
chip sẽ tiếp tục ở trạng thái reset đến khi mà Vdd vượt qua ngưỡng chấp nhận được.
6.7.5 The Reset Instruction: reset tất cả những thanh ghi và flag chịu ảnh hưởng bởi
MCLR. Được dùng để đưa chíp vào một trạng thái đã biết trước khi chạy chương trình.