Chapter6 Ngat&LapTrinhNgat V2q tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh v...
Trang 1CHƯƠNG 6: NGẮT VÀ LẬP TRÌNH ỨNG DỤNG NGẮT
Mục đích của chương này sẽ giúp người đọc có khả năng:
Giải thích được ý nghĩa các ngắt và reset
Mô tả các thủ tục xử lý cho các ngắt và các reset
Lập trình điều khiển cho phép hay không cho phép các ngắt ẩn
Lập trình đặt tính ưu tiên ngắt của PIC18 ở mức độ cao hoặc thấp
6.1.1 Ngắt là gì?
Ngắt là một sự kiện yêu cầu CPU ngừng thi hành chương trình thông thường để thực hiện sự phục vụ nào đó có quan hệ với sự kiện Ngắt có thể được phát sinh ở bên trong chip hay bên ngoài chip Ngắt ngoài được phát ra bởi mạch điện bên ngoài xác nhận một tín hiệu ngắt đến CPU Ngắt nội có thể được phát ra bởi mạch điện bên trong chip hay phát nguyên từ
những lỗi phần mềm Trong nhiều VĐK (như PIC18), các bộ định thời, các chức năng giao
tiếp vào/ra và CPU được tích hợp trong cùng một chip Vì vậy, những hệ thống phụ này có thể sinh ra các ngắt cho CPU Những tình huống khác thường xảy ra trong suốt thời gian thi
hành chương trình, chẳng hạn thiếu mã lệnh (opcode), xuất hiện tràn trên (overflow), tràn dưới (underflow), chia cho 0, được gọi là các ngắt phần mềm
6.1.2 Khả năng ẩn của ngắt
Tuỳ thuộc vào tình huống và ứng dụng, một vài ngắt có thể không mong muốn hay được cần và nên được ngăn chặn từ việc ngắt CPU Hầu hết các bộ vi xử lý và VĐK có sự lựa chọn
để phớt lờ các ngắt này Những loại ngắt này được gọi là ngắt ẩn (maskable interrrupt) Một
chương trình có thể yêu cầu CPU phục vụ hoặc phớt lờ ngắt ẩn bằng cách đặt hoặc xoá bit cho phép Khi một ngắt được cho phép, CPU sẽ đáp ứng để nó xảy ra Khi ngắt được xoá, CPU sẽ bỏ qua nó
Trang 26.1.3 Độ ưu tiên của ngắt
Nếu một máy tính đang được hỗ trợ nhiều nguồn ngắt, khi đó có thể nhiều ngắt sẽ bị treo tại cùng thời điểm CPU phải ra quyết định ngắt nào sẽ nhận phục vụ trước tiên trong tình huống này Giải pháp trong trường hợp này là phân mức độ ưu tiên cho tất cả các nguồn ngắt Một ngắt có độ ưu tiên cao hơn luôn được thực hiện trước các ngắt có độ ưu tiên thấp hơn
6.1.4 Thủ tục phục vụ ngắt
CPU cung cấp nhiệm vụ đối với ngắt bằng cách thi hành một chương trình được gọi là thủ tục phục vụ ngắt Sau đó, CPU phải hồi phục lại sự thi hành chương trình bình thường Như vậy, câu hỏi đặt ra là: “CPU dừng thi hành chương trình và hồi phục lại chương trình trong bao lâu?” Nó hoàn thành điều này bằng cách lưu bộ đếm chương trình và thông tin trạng thái CPU trước khi thực hiện thủ tục phục vụ ngắt và sau đó khôi phục bộ đếm chương trình và trạng thái CPU đã lưu trước khi thoát ra thủ tục phục vụ ngắt Chu trình phục vụ ngắt trọn vẹn bao gồm:
(1) Lưu giá trị bộ đếm chương trình
(2) Lưu trữ trạng thái CPU (bao gồm thanh ghi trạng thái CPU và một vài thanh ghi khác) vào ngăn xếp
(3) Nhận dạng loại ngắt
(4) Quyết định địa chỉ bắt đầu của thủ tục phục vụ ngắt tương ứng
(5) Thực thi thủ tục phục vụ ngắt
(6) Khôi phục trạng thái CPU từ ngăn xếp
(7) Khôi phục bộ đếm chương trình từ ngăn xếp
(8) Hồi phục chương trình đã được ngắt
Đối với ngắt cứng ẩn, bộ vi xử lý bắt đầu cung cấp sự phục vụ khi nó hoàn tất sự thi
hành của lệnh hiện tại (lệnh đang được thực thi khi ngắt xảy ra) Trong một vài ngắt không
ẩn (nonmaskable interrupt), CPU phải bắt đầu phục vụ mà không cần hoàn thành lệnh hiện
hành
6.1.5 Vector ngắt
Để quy định phục vụ một ngắt, bộ xử lý phải biết địa chỉ đang bắt đầu của thủ tục phục
vụ Địa chỉ bắt đầu của thủ tục phục vụ ngắt được gọi là vector ngắt Vector ngắt có thể được
định rõ bằng một trong các phương pháp sau:
(1) Được ấn định trước: ở phương pháp này, địa chỉ bắt đầu của thủ tục phục vụ được ấn
định trước từ lúc bộ vi xử lý (VXL) được thiết kế chế tạo Bộ xử lý sẽ nhảy tới vị trí
Trang 3được chỉ định trước để thi hành thủ tục phục vụ Tất cả bộ VĐK của Microchip và VĐK 8051 sử dụng phương pháp này
(2) Lấy lại vector từ vị trí bộ nhớ được ấn định trước: đối với các bộ VXL và VĐK, vector ngắt cho mỗi nguồn ngắt được lưu tại một vị trí đã được ấn định Vùng các vị trí bộ nhớ nơi mà tất cả các vector ngắt được lưu được quy như bảng vector ngắt
(3) Thi hành một quá trình thừa nhận ngắt để lấy lại một con số vector hợp lệ cho vị trí vector ngắt: trong suốt quá trình thừa nhận ngắt, bộ VXL thực hiện đọc chu kỳ bus và thiết bị vào/ra bên ngoài mà bị yêu cầu ngắt đặt một số trên bus dữ liệu để tự nhận dạng
nó Con số này được gọi con số vector ngắt Địa chỉ của vị trí bộ nhớ nơi vector ngắt
được lưu thì thường là tổng của bội số (thường là 2, 4) của số vector ngắt và địa chỉ
bắt đầu trong bảng vector ngắt CPU cần hoàn thành một chu kỳ đọc hợp lệ để nhận được một vector ngắt
tục này sử dụng lệnh quay về sau khi thực hiện ngắt là retfie thay vì lệnh return như thủ
tục phụ thông thường Về nguyên tắc, chương trình thủ tục phục vụ ngắt phải ngắn đến mức có thể Thủ tục phục vụ ngắt có thể đơn giản làm tăng hay giảm một biến và trả lại kết quả Trong ví dụ sau, chuỗi lệnh phục vụ thủ tục ngắt đối với ngắt chân INT0 của PIC18:
Khởi tạo bảng vector ngắt
Chẳng hạn, đặt địa chỉ bắt đầu cho mỗi thủ tục phục vụ ngắt trong bảng Điều này có
thể được thực hiện bằng cách sử dụng chỉ dẫn hợp dịch org:
org 0xkk
Trang 4dw ISR_1
dw ISR_2
với ISR_i là địa chỉ bắt đầu của thủ tục phục vụ cho nguồn ngắt thứ i Ở bước này thì không cần thiết đối họ PIC18 vì các vị trí vector ngắt đã được ấn định
Có ít nhất hai loại reset trong mỗi bộ VXL: reset khởi nguồn và reset tay Reset cấp nguồn cho phép bộ VXL thiết lập các giá trị ban đầu khi nguồn điện vừa mới cung cấp cho
nó Reset tay cho phép máy tính thoát ra khỏi hầu hết các điều kiện lỗi (ngoại trừ lỗi phần cứng) và thiết lập lại các điều kiện ban đầu
6.3 NGẮT VÀ CÁC THANH GHI NGẮT CỦA PIC 18F4550
PIC 18F4550 là VĐK có nhiều nguồn ngắt tổ hợp và có tính năng ngắt ưu tiên cho phép mỗi nguồn ngắt được cho phép ngắt ưu tiên cao hay ưu tiên thấp Ngắt ưu tiên cao xảy ra cho
dù có bất kỳ ngắt ưu tiên thấp nào đang được thực hiện Vector ngắt ưu tiên cao tại địa chỉ
0x08, vector ngắt ưu tiên thấp tại 0x18
Có 10 thanh ghi được sử dụng để điều khiển hoạt động ngắt, các thanh ghi đó là: RCON, INTCON, INTCON2, INTCON3, PIR1, PIR1, PIE1, PIE2, IPR1, IPR2
Mỗi nguồn ngắt có 3 bit chính điều khiển hoạt động ngắt của nó:
− Bit Flag (cờ) báo hiệu có sự kiện ngắt xảy ra
− Bit Enable (cho phép) cho phép chương trình thực thi rẻ nhánh đến địa chỉ của vector
ngắt khi bit flag được đặt
− Bit Priority (ưu tiên) chọn mức ưu tiên ngắt là cao hay thấp
Chức năng ưu tiên ngắt được cho phép bằng cách đặt bit IPEN (bit RCON<7>) Khi có
ưu tiên ngắt được cho phép, có hai bit được dùng để cho phép ngắt toàn cục
Đặt bit GIEH (bit INTCON<7>) cho phép tất cả các ngắt có bit ưu tiên được đặt
(ưu tiên cao)
Trang 5 Đặt bit GIEL (bit INTCON<6>) cho phép tất cả các ngắt có bit ưu tiên bị xóa (ưu
tiên thấp)
Khi bit cờ, bit cho phép, bit cho phép ngắt toàn cục được đặt thì ngắt sẽ trỏ đến địa chỉ 000008h hoặc 000018h tùy theo bit ưu tiên được đặt Các ngắt độc lập cũng có thể bị vô hiệu
thông qua các bit cho phép tương ứng Khi bit IPEN bằng 0 ứng với trạng thái mặc định, chức
năng ưu tiên ngắt bị vô hiệu
Nguồn ngắt ưu tiên cao có thể ngắt các ngắt có mức ưu tiên thấp hơn, khi đó ngắt ưu tiên thấp sẽ không được thực hiện cho đến khi ngắt ưu tiên cao được thực hiện xong
Hình 6.1: cấu trúc khối ngắt 6.3.1 Thanh ghi điều khiển ngắt INTCON
Thanh ghi INTCON là thanh ghi cho phép ghi và đọc, chứa các bit flag, enable và ngắt
ưu tiên
Hình 6.2: thanh ghi INTCON
Bit 7 - GIE/GIEH: bit cho phép ngắt toàn cục
Trang 61 = Cho phép tất cả các ngắt không ẩn
0 = Vô hiệu tất cả các ngắt
Khi IPEN = 1
1 = Cho phép tất cả các ngắt ưu tiên cao
0 = Vô hiệu tất cả các ngắt có ưu tiên cao
Bit 6 - PEIE/GIEL: bit cho phép ngắt ngoại vi
Khi IPEN = 0
1 = Cho phép tất cả các ngắt ngoại vi không ẩn
0 = Vô hiệu tất cả các ngắt ngoại vi
Khi IPEN = 1
1 = Cho phép tất cả các ngắt ngoại vi ưu tiên cao
0 = Vô hiệu tất cả các ngắt ngoại vi có ưu tiên cao
Bit 5 - TMR0IE : bit cho phép ngắt tràn TMR0
1 = Cho phép ngắt tràn TMR0
0 = Không cho phép ngắt tràn TMR0
Bit 4 - INT0IE: bit cho phép ngắt ngoài INT0
1 = Cho phép ngắt ngoài INT0
0 = Không cho phép ngắt ngoài INT0
Bit 3 - RBIE: bit cho phép ngắt chuyển trạng thái các chân PORTB
1 = Cho phép ngắt ngắt chuyển trạng thái các chân PORTB
0 = Không cho phép ngắt chuyển trạng thái các chân PORTB
Bit 2 - TMR0IF: bit cờ (flag bit) ngắt tràn TMR0
1 = Thanh ghi TMR0 tràn (chỉ được xóa bằng phần mềm)
0 = Thanh ghi TMR0 không tràn
Bit 1 - INT0IF: bit cờ ngắt ngoài INT0
1 = Ngắt ngoài INT0 xảy ra (chỉ được xóa bằng phần mềm)
0 = Ngắt ngoài INT0 không xảy ra
Bit 0 - RBIF: bit cờ ngắt chuyển trạng thái các chân PORTB
1 = Ít nhất một trong các chân RB7:RB4 chuyển trạng thái (chỉ được xóa bằng phần mềm)
Trang 70 = Các chân RB7:RB4 không chuyển trạng thái
6.3.2 Thanh ghi điền khiển ngắt INTCON2
Thanh ghi INTCON2 được mô tả như hình 6.3
Hình 6.3: thanh ghi INTCON2
Bit 7 - 𝐑𝐁𝐏𝐔̅̅̅̅̅̅̅̅: bit cho phép kéo trạng thái PORTB
1 = Không cho phép kéo trạng thái PORTB
0 = Cho phép kéo trạng thái PORTB bằng các giá trị chốt port riêng
Bit 6 - INTEDG0: bit chọn sườn clock cho ngắt ngoài 0
1 = Ngắt bằng sườn lên của xung clock
0 = Ngắt bằng sườn xuống của xung clock
Bit 5 - INTEDG1: bit chọn sườn clock cho ngắt ngoài 1
1 = Ngắt bằng sườn lên của xung clock
0 = Ngắt bằng sườn xuống của xung clock
Bit 4 - INTEDG2: bit chọn sườn clock cho ngắt ngoài 2
1 = Ngắt bằng sườn lên của xung clock
0 = Ngắt bằng sườn xuống của xung clock
Bit 3 bit không sử dụng, xem như là bit ‘0’
Bit 2 - TMR0IP: bit ưu tiên ngắt tràn TMR0
1 = Ưu tiên cao
0 = Ưu tiên thấp
Bit 1: bit không sử dụng, xem như là bit ‘0’
Bit 0 - RBIP: bit ưu tiên ngắt chuyển trạng thái các chân PORTB
1 = ưu tiên cao
0 = ưu tiên thấp
6.3.3 Thanh ghi điều khiển ngắt INTCON3
Thanh ghi INTCON3 được mô tả như hình 6.4
Trang 8Hình 6.4: thanh ghi INTCON3
Bit 7 - INT2IP: bit ưu tiên ngắt ngoài INT2
1 = Ưu tiên cao
0 = Ưu tiên thấp
Bit 6 - INT1IP: bit ưu tiên ngắt ngoài INT1
1 = Ưu tiên cao
0 = Ưu tiên thấp
Bit 5: bit không sử dụng, xem như là bit ‘0’
Bit 4 - INT2IE: bit cho phép ngắt ngoài INT2
1 = Cho phép ngắt ngoài INT2
0 = Không cho phép ngắt ngoài INT2
Bit 3 - INT1IE: bit cho phép ngắt ngoài INT1
1 = Cho phép ngắt ngoài INT1
0 = Không cho phép ngắt ngoài INT1
Bit 2: bit không sử dụng, xem như là bit ‘0’
Bit 1 - INT2IF: bit cờ ngắt ngoài INT2
1 = Ngắt ngoài INT2 xảy ra
0 = Ngắt ngoài INT2 không xảy ra
Bit 0 - INT1IF: bit cờ ngắt ngoài INT1
1 = Ngắt ngoài INT1 xảy ra
0 = Ngắt ngoài INT1 không xảy ra
6.3.4 Các thanh ghi PIR
Thanh ghi PIR (Peripheral Interrupt Request) chứa các bit cờ riêng cho các ngắt ngoại
vi, có hai thanh ghi điều khiển ngắt ngoại vi là PIR1 và PIR2
Thanh ghi PIR1
Hình 6.5: thanh ghi PIR1
Trang 9Bit 7 - SPPIF: bit cờ ngắt ghi/đọc port song song
1 = Quá trình ghi hoặc đọc đang diễn ra (xóa bằng phần mềm)
0 = Không có ghi hoặc đọc
Bit 6 - ADIF: bit cờ ngắt chuyển đổi ADC
1 = Chuyển đổi ADC hoàn thành (xóa bằng phần mềm)
0 = Chuyển đổi ADC chưa hoàn thành
Bit 5 - RCIF: bit cờ ngắt nhận dữ liệu EUSART
1 = Bộ đệm nhận dữ liệu RCREG đã đầy (xóa khi RCREG được đọc)
0 = Bộ đệm nhận dữ liệu RCREG trống
Bit 4 - TXIF: bit cờ ngắt truyền dữ liệu EUSART
1 = Bộ đệm truyền dữ liệu TXREG trống (xóa khi TXREG được đọc)
0 = Bộ đệm nhận dữ liệu TXREG đã đầy
Bit 3 - SSPIF: bit cờ ngắt truyền dữ liệu Port nối tiếp đồng bộ chính
1 = Hoạt động truyền/nhận dữ liệu hoàn tất
0 = Chờ truyền/nhận dữ liệu
Bit 2 - CCP1IF : bit cờ ngắt CCP1
Chế độ Capture:
1 = Quá trình capture thanh ghi TMR1 xảy ra
0 = Không có quá trình capture thanh ghi TMR1 nào xảy ra
Chế độ Compare:
1 = Quá trình so sánh thanh ghi TMR1 xảy ra
0 = Không có quá trình so sánh thanh ghi TMR1 nào xảy ra
Trang 100 = Thanh ghi TMR1 không tràn
Lưu ý, các bit cờ được đặt khi điều kiện ngắt xảy ra bất chấp trạng thái của bit cho phép
tương ứng của nó hay bit cho phép ngắt toàn cục GIE (INTCON<7>)
Thanh ghi PIR2
Hình 6.6: thanh ghi PIR2
Bit 7 - OSCFIF: bit cờ ngắt lỗi tạo dao động
1 = Bộ tạo dao động hệ thống bị lỗi, xung clock ngõ vào chuyển thành
INTOSC (xóa bằng phần mềm)
0 = Xung clock hệ thống đang hoạt động
Bit 6 - CMIF: bit cờ ngắt bộ so sánh
1 = Ngõ vào bộ so sánh thay đổi (xóa bằng phần mềm)
0 = Ngõ vào bộ so sánh không thay đổi
Bit 5 - USBIF: bit cờ ngắt USB
1 = Có yêu cầu ngắt USB (xóa bằng phần mềm)
0 = Không có yêu cầu ngắt USB
Bit 4 - EEIF: bit cờ ngắt hoạt động ghi dữ liệu trên bộ nhờ EEPROM/FLASH
1 = Quá trình ghi hoàn tất (xóa bằng phần mềm)
0 = Quá trình ghi không hoàn tất hay không được bắt đầu
Bit 3 - BCLIF: bit cờ ngắt xung đột trên bus
1 = Xung đột trên bus xảy ra (xóa bằng phần mềm)
0 = Không có xung đột trên bus
Bit 2 - HLVDIF: bit cờ ngắt phát hiện điện áp cao/thấp
1 = Xảy ra tình trạng điện áp cao/thấp (xóa bằng phần mềm)
0 = Không xảy ra tình trạng điện áp cao/thấp
Bit 1 - TMR3IF: bit cờ ngắt tràn TMR3
1 = Thanh ghi TMR3 tràn (xóa bằng phần mềm)
0 = Thanh ghi TMR3 không tràn
Trang 11Bit 0 - CCP2IF: bit cờ ngắt CCP2
Chế độ Capture:
1 = Quá trình capture thanh ghi TMR1 hoặc TMR3 xảy ra
0 = Không có quá trình capture thanh ghi TMR1 hoặc TMR3 nào xảy ra
Chế độ Compare:
1 = Quá trình compare thanh ghi TMR1 hoặc TMR3 xảy ra
0 = Không có quá trình so sánh thanh ghi TMR1 hoặc TMR3 nào xảy ra
Chế độ PWM:
Không áp dụng trong chế độ PWM
6.3.5 Các thanh ghi cho phép ngắt ngoại vi PIE
Thanh ghi PIE (Peripheral Interrupt Enable) chứa các bit cho phép riêng cho các ngắt
ngoại vi, có hai thanh ghi cho phép ngắt ngoại vi PIE1 và PIE2 Khi IPEN = 0 thì bit PEIE phải được đặt để cho phép các ngắt ngoại vi bất kỳ
Thanh ghi PIE1
Hình 6.7: thanh ghi PIE1
Bit 7 - SPPIE: bit cho phép ngắt ghi/đọc port song song
1 = Cho phép ngắt ghi/đọc port song song
0 = Không cho phép ngắt ghi/đọc port song song
Bit 6 - ADIE: bit cho phép ngắt chuyển đổi ADC
1 = Cho phép ngắt chuyển đổi ADC
0 = Không cho phép ngắt chuyển đổi ADC
Bit 5 - RCIE: bit cho phép ngắt nhận dữ liệu EUSART
1 = Cho phép ngắt nhận dữ liệu EUSART
0 = Không cho phép ngắt nhận dữ liệu EUSART
Bit 4 - TXIE: bit cho phép ngắt truyền dữ liệu EUSART
1 = Cho phép ngắt truyền dữ liệu EUSART
0 = Không cho phép ngắt truyền dữ liệu EUSART
Bit 3 - SSPIE: bit cho phép ngắt truyền dữ liệu Port nối tiếp đồng bộ chính
Trang 121 = Cho phép ngắt truyền dữ liệu Port nối tiếp đồng bộ chính
0 = Không cho phép ngắt truyền dữ liệu Port nối tiếp đồng bộ chính
Bit 2 - CCP1IE: bit cho phép ngắt CCP1
Thanh ghi PIE2
Hình 6.8: thanh ghi PIE2
Bit 7 - OSCFIE: bit cho phép ngắt lỗi tạo dao động
Trang 136.3.6 Thanh ghi điều khiển reset
Thanh ghi IPR chứa các bit cờ dùng để xác định nguyên nhân của lần reset trước đó
hoặc đánh thức (wake-up) khỏi chế độ Idle hoặc Sleep Thanh ghi RCON (Reset Control Register) này cũng chứa bit IPEN cho phép ưu tiên ngắt
Hình 6.9: thanh ghi RCON
Bit 7 - IPEN: bit cho phép ưu tiên ngắt
1 = cho phép các mức độ ưu tiên ngắt
0 = không cho phép các mức độ ưu tiên ngắt
Bit 6 - SBOREN: bit cho phép BOR bằng phần mềm
Bit 5: không sử dụng, xem như bit ‘0’
Bit 4 - 𝐑𝐈̅̅̅: bit cờ chỉ thị reset
Bit 3 - 𝐓𝐎̅̅̅̅: bit cờ watchdog time-out
Bit 2 - 𝐏𝐃̅̅̅̅ : bit cờ phát hiện Power-down
Bit 1 - 𝐏𝐎𝐑̅̅̅̅̅̅: bit trạng thái reset power-on
Bit 0 - 𝐁𝐎𝐑̅̅̅̅̅̅: bit trạng thái reset brown-out
Chú ý: nếu bit SBOREN được cho phép (SBOREN = 1) thì trạng thái reset của nó bằng
1, ngược lại là 0 Giá trị reset thực tế của 𝐏𝐎𝐑̅̅̅̅̅̅ được xác định bằng kiểu reset chip