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...
Chương 6: ngắt lập trình ứng dụng ngắt CHƯƠNG 6: NGẮT VÀ LẬP TRÌNH ỨNG DỤNG NGẮT Mục đích chương giúp người đọc có khả năng: Giải thích ý nghĩa ngắt reset Mô tả thủ tục xử lý cho ngắt reset Lập trình điều khiển cho phép hay không cho phép ngắt ẩn Lập trình đặt tính ưu tiên ngắt PIC18 mức độ cao thấp Viết chương trình thủ tục phục vụ ngắt Viết chương trình ứng dụng điều khiển ngắt 6.1 KHÁI QUÁT Ngắt chế cung cấp vi xử lý hay hệ thống máy tính để đồng với hoạt động vào/ra, xử lý điều kiện lỗi tình khẩn, tổ chức tài nguyên phân chia, Nếu khơng có chế ngắt, nhiều hoạt động trở nên thực thi khó để thực 6.1.1 Ngắt gì? Ngắt kiện yêu cầu CPU ngừng thi hành chương trình thơng thường để thực phục vụ có quan hệ với kiện Ngắt phát sinh bên chip hay bên chip Ngắt phát mạch điện bên ngồi xác nhận tín hiệu ngắt đến CPU Ngắt nội phát mạch điện bên chip hay phát nguyên từ lỗi phần mềm Trong nhiều VĐK (như PIC18), định thời, chức giao tiếp vào/ra CPU tích hợp chip Vì vậy, hệ thống phụ sinh ngắt cho CPU Những tình khác thường xảy suốt thời gian thi hành chương trình, chẳng hạn thiếu mã lệnh (opcode), xuất tràn (overflow), tràn (underflow), chia cho 0, gọi ngắt phần mềm 6.1.2 Khả ẩn ngắt Tuỳ thuộc vào tình ứng dụng, vài ngắt không mong muốn hay cần nên ngăn chặn từ việc ngắt CPU Hầu hết vi xử lý VĐK có lựa chọn để phớt lờ ngắt Những loại ngắt gọi ngắt ẩn (maskable interrrupt) Một chương trình yêu cầu CPU phục vụ phớt lờ ngắt ẩn cách đặt xoá bit cho phép Khi ngắt cho phép, CPU đáp ứng để xảy Khi ngắt xoá, CPU bỏ qua 199 Chương 6: ngắt lập trình ứng dụng ngắt 6.1.3 Độ ưu tiên ngắt Nếu máy tính hỗ trợ nhiều nguồn ngắt, nhiều ngắt bị treo thời điểm CPU phải định ngắt nhận phục vụ trước tiên tình Giải pháp trường hợp phân mức độ ưu tiên cho tất nguồn ngắt Một ngắt có độ ưu tiên cao thực trước ngắt có độ ưu tiên thấp 6.1.4 Thủ tục phục vụ ngắt CPU cung cấp nhiệm vụ ngắt cách thi hành chương trình gọi thủ tục phục vụ ngắt Sau đó, CPU phải hồi phục lại thi hành chương trình bình thường Như vậy, câu hỏi đặt là: “CPU dừng thi hành chương trình hồi phục lại chương trình bao lâu?” Nó hồn thành điều cách lưu đếm chương trình thơng tin trạng thái CPU trước thực thủ tục phục vụ ngắt sau khơi phục đếm chương trình trạng thái CPU lưu trước thoát 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ị đếm chương trình (2) Lưu trữ trạng thái CPU (bao gồm ghi trạng thái CPU vài ghi khác) vào ngăn xếp (3) Nhận dạng loại ngắt (4) Quyết định địa bắt đầu 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 đếm chương trình từ ngăn xếp (8) Hồi phục chương trình ngắt Đối với ngắt cứng ẩn, vi xử lý bắt đầu cung cấp phục vụ hồn tất thi hành lệnh (lệnh thực thi ngắt xảy ra) Trong 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 hành 6.1.5 Vector ngắt Để quy định phục vụ ngắt, xử lý phải biết địa bắt đầu thủ tục phục vụ Địa bắt đầu thủ tục phục vụ ngắt gọi vector ngắt Vector ngắt định rõ phương pháp sau: (1) Được ấn định trước: phương pháp này, địa bắt đầu thủ tục phục vụ ấn định trước từ lúc vi xử lý (VXL) thiết kế chế tạo Bộ xử lý nhảy tới vị trí 200 Chương 6: ngắt lập trình ứng dụng ngắt định trước để thi hành thủ tục phục vụ Tất VĐK Microchip VĐK 8051 sử dụng phương pháp (2) Lấy lại vector từ vị trí nhớ ấn định trước: VXL VĐK, vector ngắt cho nguồn ngắt lưu vị trí ấn định Vùng vị trí nhớ nơi mà tất vector ngắt lưu quy bảng vector ngắt (3) Thi hành trình thừa nhận ngắt để lấy lại số vector hợp lệ cho vị trí vector ngắt: suốt q trình thừa nhận ngắt, VXL thực đọc chu kỳ bus thiết bị vào/ra bên mà bị yêu cầu ngắt đặt số bus liệu để tự nhận dạng Con số gọi số vector ngắt Địa vị trí nhớ nơi vector ngắt lưu thường tổng bội số (thường 2, 4) số vector ngắt địa bắt đầu bảng vector ngắt CPU cần hoàn thành chu kỳ đọc hợp lệ để nhận vector ngắt 6.1.6 Lập trình ngắt Có ba bước lập trình cho ngắt sau: − Bước 1: Viết thủ tục phục vụ Thủ tục phục vụ ngắt tương tự thủ tục phụ, khác lệnh cuối Thủ tục sử dụng lệnh quay sau thực ngắt retfie thay lệnh return 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 Thủ tục phục vụ ngắt đơn giản làm tăng hay giảm biến trả lại kết Trong ví dụ sau, chuỗi lệnh phục vụ thủ tục ngắt ngắt chân INT0 PIC18: cnt set 0x10 org 0x08 incf cnt, F ; interrupt vector = 08h retfie − Bước 2: Khởi tạo bảng vector ngắt Chẳng hạn, đặt địa bắt đầu cho thủ tục phục vụ ngắt bảng Điều thực cách sử dụng dẫn hợp dịch org: org 0xkk 201 Chương 6: ngắt lập trình ứng dụng ngắt dw ISR_1 dw ISR_2 với ISR_i địa bắt đầu thủ tục phục vụ cho nguồn ngắt thứ i Ở bước khơng cần thiết đối họ PIC18 vị trí vector ngắt ấn định − Bước 3: Cho phép ngắt phục vụ Các bit cho phép ngắt thích hợp phải đặt hợp lệ phép ngắt diễn 6.2 RESET Các giá trị ban đầu ghi CPU, flip-flop, ghi điều khiển chip giao tiếp vào/ra phải thiết lập trước máy tính hoạt động Cơ chế reset cung cấp để thiết lập điều kiện ban đầu cho máy tính Có hai loại reset VXL: reset khởi nguồn reset tay Reset cấp nguồn cho phép VXL thiết lập giá trị ban đầu nguồn điện vừa cung cấp cho Reset tay cho phép máy tính khỏi hầu hết điều kiện lỗi (ngoại trừ lỗi phần cứng) thiết lập lại điều kiện ban đầu 6.3 NGẮT VÀ CÁC THANH GHI NGẮT CỦA PIC 18F4550 PIC 18F4550 VĐK có nhiều nguồn ngắt tổ hợp có tính ngắt ưu tiên cho phép nguồn ngắt cho phép ngắt ưu tiên cao hay ưu tiên thấp Ngắt ưu tiên cao xảy cho dù có ngắt ưu tiên thấp thực Vector ngắt ưu tiên cao địa 0x08, vector ngắt ưu tiên thấp 0x18 Có 10 ghi sử dụng để điều khiển hoạt động ngắt, ghi là: RCON, INTCON, INTCON2, INTCON3, PIR1, PIR1, PIE1, PIE2, IPR1, IPR2 Mỗi nguồn ngắt có bit điều khiển hoạt động ngắt nó: − Bit Flag (cờ) báo hiệu có kiện ngắt xảy − Bit Enable (cho phép) cho phép chương trình thực thi rẻ nhánh đến địa vector ngắt bit flag đặt − Bit Priority (ưu tiên) chọn mức ưu tiên ngắt cao hay thấp Chức ưu tiên ngắt cho phép cách đặt bit IPEN (bit RCON) Khi có ưu tiên ngắt cho phép, có hai bit dùng phép ngắt toàn cục Đặt bit GIEH (bit INTCON) cho phép tất ngắt có bit ưu tiên đặt (ưu tiên cao) 202 Chương 6: ngắt lập trình ứng dụng ngắt Đặt bit GIEL (bit INTCON) cho phép tất 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 tồn cục đặt ngắt trỏ đến địa 000008h 000018h tùy theo bit ưu tiên đặt Các ngắt độc lập bị vơ hiệu thơng qua bit cho phép tương ứng Khi bit IPEN ứng với trạng thái mặc định, chức ưu tiên ngắt bị vơ hiệu Nguồn ngắt ưu tiên cao ngắt ngắt có mức ưu tiên thấp hơn, ngắt ưu tiên thấp không thực ngắt ưu tiên cao thực 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 ghi cho phép ghi đọc, chứa bit flag, enable ngắt ưu tiên Hình 6.2: ghi INTCON Bit - GIE/GIEH: bit cho phép ngắt toàn cục Khi IPEN = 203 Chương 6: ngắt lập trình ứng dụng ngắt = Cho phép tất ngắt không ẩn = Vô hiệu tất ngắt Khi IPEN = 1 = Cho phép tất ngắt ưu tiên cao = Vô hiệu tất ngắt có ưu tiên cao Bit - PEIE/GIEL: bit cho phép ngắt ngoại vi Khi IPEN = = Cho phép tất ngắt ngoại vi không ẩn = Vô hiệu tất ngắt ngoại vi Khi IPEN = 1 = Cho phép tất ngắt ngoại vi ưu tiên cao = Vô hiệu tất ngắt ngoại vi có ưu tiên cao Bit - TMR0IE : bit cho phép ngắt tràn TMR0 = Cho phép ngắt tràn TMR0 = Không cho phép ngắt tràn TMR0 Bit - INT0IE: bit cho phép ngắt INT0 = Cho phép ngắt ngồi INT0 = Khơng cho phép ngắt INT0 Bit - RBIE: bit cho phép ngắt chuyển trạng thái chân PORTB = Cho phép ngắt ngắt chuyển trạng thái chân PORTB = Không cho phép ngắt chuyển trạng thái chân PORTB Bit - TMR0IF: bit cờ (flag bit) ngắt tràn TMR0 = Thanh ghi TMR0 tràn (chỉ xóa phần mềm) = Thanh ghi TMR0 không tràn Bit - INT0IF: bit cờ ngắt INT0 = Ngắt INT0 xảy (chỉ xóa phần mềm) = Ngắt ngồi INT0 không xảy Bit - RBIF: bit cờ ngắt chuyển trạng thái chân PORTB = Ít chân RB7:RB4 chuyển trạng thái (chỉ xóa phần mềm) 204 Chương 6: ngắt lập trình ứng dụng ngắt = 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 mơ tả hình 6.3 Hình 6.3: ghi INTCON2 ̅̅̅̅̅̅̅̅: bit cho phép kéo trạng thái PORTB Bit - 𝐑𝐁𝐏𝐔 = Không cho phép kéo trạng thái PORTB = Cho phép kéo trạng thái PORTB giá trị chốt port riêng Bit - INTEDG0: bit chọn sườn clock cho ngắt = Ngắt sườn lên xung clock = Ngắt sườn xuống xung clock Bit - INTEDG1: bit chọn sườn clock cho ngắt 1 = Ngắt sườn lên xung clock = Ngắt sườn xuống xung clock Bit - INTEDG2: bit chọn sườn clock cho ngắt = Ngắt sườn lên xung clock = Ngắt sườn xuống xung clock Bit bit không sử dụng, xem bit ‘0’ Bit - TMR0IP: bit ưu tiên ngắt tràn TMR0 = Ưu tiên cao = Ưu tiên thấp Bit 1: bit không sử dụng, xem bit ‘0’ Bit - RBIP: bit ưu tiên ngắt chuyển trạng thái chân PORTB = ưu tiên cao = ưu tiên thấp 6.3.3 Thanh ghi điều khiển ngắt INTCON3 Thanh ghi INTCON3 mô tả hình 6.4 205 Chương 6: ngắt lập trình ứng dụng ngắt Hình 6.4: ghi INTCON3 Bit - INT2IP: bit ưu tiên ngắt INT2 = Ưu tiên cao = Ưu tiên thấp Bit - INT1IP: bit ưu tiên ngắt INT1 = Ưu tiên cao = Ưu tiên thấp Bit 5: bit không sử dụng, xem bit ‘0’ Bit - INT2IE: bit cho phép ngắt INT2 = Cho phép ngắt ngồi INT2 = Khơng cho phép ngắt INT2 Bit - INT1IE: bit cho phép ngắt INT1 = Cho phép ngắt INT1 = Khơng cho phép ngắt ngồi INT1 Bit 2: bit không sử dụng, xem bit ‘0’ Bit - INT2IF: bit cờ ngắt INT2 = Ngắt INT2 xảy = Ngắt INT2 không xảy Bit - INT1IF: bit cờ ngắt INT1 = Ngắt INT1 xảy = Ngắt ngồi INT1 khơng xảy 6.3.4 Các ghi PIR Thanh ghi PIR (Peripheral Interrupt Request) chứa bit cờ riêng cho ngắt ngoại vi, có hai ghi điều khiển ngắt ngoại vi PIR1 PIR2 Thanh ghi PIR1 Hình 6.5: ghi PIR1 206 Chương 6: ngắt lập trình ứng dụng ngắt Bit - SPPIF: bit cờ ngắt ghi/đọc port song song = Quá trình ghi đọc diễn (xóa phần mềm) = Khơng có ghi đọc Bit - ADIF: bit cờ ngắt chuyển đổi ADC = Chuyển đổi ADC hồn thành (xóa phần mềm) = Chuyển đổi ADC chưa hoàn thành Bit - RCIF: bit cờ ngắt nhận liệu EUSART = Bộ đệm nhận liệu RCREG đầy (xóa RCREG đọc) = Bộ đệm nhận liệu RCREG trống Bit - TXIF: bit cờ ngắt truyền liệu EUSART = Bộ đệm truyền liệu TXREG trống (xóa TXREG đọc) = Bộ đệm nhận liệu TXREG đầy Bit - SSPIF: bit cờ ngắt truyền liệu Port nối tiếp đồng = Hoạt động truyền/nhận liệu hoàn tất = Chờ truyền/nhận liệu Bit - CCP1IF : bit cờ ngắt CCP1 Chế độ Capture: = Quá trình capture ghi TMR1 xảy = Khơng có q trình capture ghi TMR1 xảy Chế độ Compare: = Quá trình so sánh ghi TMR1 xảy = Khơng có q trình so sánh ghi TMR1 xảy Chế độ PWM: Không áp dụng chế độ PWM Bit - TMR2IF: bit cờ ngắt trùng TMR2 PR2 = TMR2 PR2 trùng (xóa phần mềm) = TMR2 PR2 không trùng Bit - TMR1IF: bit cờ ngắt tràn TMR1 = Thanh ghi TMR1 tràn 207 Chương 6: ngắt lập trình ứng dụng ngắt = Thanh ghi TMR1 không tràn Lưu ý, bit cờ đặt điều kiện ngắt xảy bất chấp trạng thái bit cho phép tương ứng hay bit cho phép ngắt tồn cục GIE (INTCON) Thanh ghi PIR2 Hình 6.6: ghi PIR2 Bit - OSCFIF: bit cờ ngắt lỗi tạo dao động = Bộ tạo dao động hệ thống bị lỗi, xung clock ngõ vào chuyển thành INTOSC (xóa phần mềm) = Xung clock hệ thống hoạt động Bit - CMIF: bit cờ ngắt so sánh = Ngõ vào so sánh thay đổi (xóa phần mềm) = Ngõ vào so sánh không thay đổi Bit - USBIF: bit cờ ngắt USB = Có yêu cầu ngắt USB (xóa phần mềm) = Khơng có u cầu ngắt USB Bit - EEIF: bit cờ ngắt hoạt động ghi liệu nhờ EEPROM/FLASH = Quá trình ghi hồn tất (xóa phần mềm) = Q trình ghi khơng hồn tất hay khơng bắt đầu Bit - BCLIF: bit cờ ngắt xung đột bus = Xung đột bus xảy (xóa phần mềm) = Khơng có xung đột bus Bit - HLVDIF: bit cờ ngắt phát điện áp cao/thấp = Xảy tình trạng điện áp cao/thấp (xóa phần mềm) = Khơng xảy tình trạng điện áp cao/thấp Bit - TMR3IF: bit cờ ngắt tràn TMR3 = Thanh ghi TMR3 tràn (xóa phần mềm) = Thanh ghi TMR3 khơng tràn 208 Chương 6: ngắt lập trình ứng dụng ngắt Bit - CCP2IF: bit cờ ngắt CCP2 Chế độ Capture: = Quá trình capture ghi TMR1 TMR3 xảy = Khơng có q trình capture ghi TMR1 TMR3 xảy Chế độ Compare: = Quá trình compare ghi TMR1 TMR3 xảy = Khơng có q trình so sánh ghi TMR1 TMR3 xảy Chế độ PWM: Không áp dụng chế độ PWM 6.3.5 Các ghi cho phép ngắt ngoại vi PIE Thanh ghi PIE (Peripheral Interrupt Enable) chứa bit cho phép riêng cho ngắt ngoại vi, có hai ghi cho phép ngắt ngoại vi PIE1 PIE2 Khi IPEN = bit PEIE phải đặt phép ngắt ngoại vi Thanh ghi PIE1 Hình 6.7: ghi PIE1 Bit - SPPIE: bit cho phép ngắt ghi/đọc port song song = Cho phép ngắt ghi/đọc port song song = Không cho phép ngắt ghi/đọc port song song Bit - ADIE: bit cho phép ngắt chuyển đổi ADC = Cho phép ngắt chuyển đổi ADC = Không cho phép ngắt chuyển đổi ADC Bit - RCIE: bit cho phép ngắt nhận liệu EUSART = Cho phép ngắt nhận liệu EUSART = Không cho phép ngắt nhận liệu EUSART Bit - TXIE: bit cho phép ngắt truyền liệu EUSART = Cho phép ngắt truyền liệu EUSART = Không cho phép ngắt truyền liệu EUSART Bit - SSPIE: bit cho phép ngắt truyền liệu Port nối tiếp đồng 209 Chương 6: ngắt lập trình ứng dụng ngắt = Cho phép ngắt truyền liệu Port nối tiếp đồng = Không cho phép ngắt truyền liệu Port nối tiếp đồng Bit - CCP1IE: bit cho phép ngắt CCP1 = Cho phép ngắt CCP1 = Không cho phép ngắt CCP1 Bit - TMR2IE: bit cho phép ngắt trùng TMR2 PR2 = Cho phép ngắt trùng TMR2 PR2 = Không cho phép ngắt trùng TMR2 PR2 Bit - TMR1IE: bit cho phép ngắt tràn TMR1 = Cho phép ngắt tràn TMR1 = Không cho phép ngắt tràn TMR1 Thanh ghi PIE2 Hình 6.8: ghi PIE2 Bit - OSCFIE: bit cho phép ngắt lỗi tạo dao động = Cho phép = Không cho phép Bit - CMIE: bit cho phép ngắt Comparator = Cho phép = Không cho phép Bit - USBIE: bit cho phép ngắt USB = Cho phép = Không cho phép Bit - EEIE: bit cho phép ngắt hoạt động ghi liệu nhớ EEPROM/Flash = Cho phép = Không cho phép Bit - BCLIE: bit cho phép ngắt xung đột bus = Cho phép 210 Chương 6: ngắt lập trình ứng dụng ngắt = Không cho phép Bit - HLVDIE: bit cho phép ngắt phát điện áp cao/thấp = cho phép = không cho phép Bit TMR3IE: bit cho phép ngắt tràn TMR3 = Cho phép = Không cho phép Bit - CCP2IE: bit cho phép ngắt CCP2 = Cho phép = Không cho phép 6.3.6 Thanh ghi điều khiển reset Thanh ghi IPR chứa bit cờ dùng để xác định nguyên nhân lần reset trước đánh thức (wake-up) khỏi chế độ Idle Sleep Thanh ghi RCON (Reset Control Register) chứa bit IPEN cho phép ưu tiên ngắt Hình 6.9: ghi RCON Bit - IPEN: bit cho phép ưu tiên ngắt = cho phép mức độ ưu tiên ngắt = không cho phép mức độ ưu tiên ngắt Bit - SBOREN: bit cho phép BOR phần mềm Bit 5: không sử dụng, xem bit ‘0’ ̅̅̅: bit cờ thị reset Bit - 𝐑𝐈 ̅̅̅̅: bit cờ watchdog time-out Bit - 𝐓𝐎 ̅̅̅̅ : bit cờ phát Power-down Bit - 𝐏𝐃 ̅̅̅̅̅̅: bit trạng thái reset power-on Bit - 𝐏𝐎𝐑 Bit - ̅̅̅̅̅̅ 𝐁𝐎𝐑: bit trạng thái reset brown-out Chú ý: bit SBOREN cho phép (SBOREN = 1) trạng thái reset 1, ngược lại Giá trị reset thực tế ̅̅̅̅̅̅ 𝐏𝐎𝐑 xác định kiểu reset chip 211 Chương 6: ngắt lập trình ứng dụng ngắt 6.3.7 Ngắt ngồi INTn Các ngắt chân RB0/AN12/INT0/FLT0/SDI/SDA, RB1/AN10/INT1/SCK/SCL RB2/AN8/INT2/VMO kích khởi sườn xung clock Nếu bit INTEDGx tương ứng ghi INTCON2 đặt ngắt kích khởi sườn lên, bit bị xóa ngắt kích khởi bầng sườn xuống xung clock Khi có sườn clock tác động vào chân RBx/INTx bit cờ tương ứng INTxIF đặt Ngắt vơ hiệu cách xố bit tương ứng INTxIE, bit cờ phải xóa phần mềm trước cho phép ngắt lại Ưu tiên ngắt cho INT1 INT2 xác định giá trị bit ưu tiên ngắt INT1IP INT2IP, khơng có bit ưu tiên ngắt cho ngắt ngồi INT0 ln ln ngắt ưu tiên cao 6.3.8 Ngắt TMR0 Trong chế độ timer (định thời) 8-bit, có tràn ghi TMR0 (FFh → 00h) đặt bit cờ TMR0IF Trong chế độ timer 16-bit, có tràn cặp ghi TMR0H:TMR0L (FFFFh → 0000h) đặt bit cờ TMR0IF Ngắt cho phép/khơng cho phép cách đặt/xố bit TMR0IE (INTCON), ưu tiên ngắt Timer0 xác định giá trị bit TMR0IP (INTCON2) Ngắt TMR0 phân tích kỹ chương sau 6.3.9 Ngắt chuyển trạng thái PORTB Sự thay đổi trạng thái ngõ vào PORTB đặt bit cờ RBIF, ngắt cho phép/khơng cho phép cách đặt/xố bit RBIE (INTCON), chế độ ưu tiên ngắt chuyển trạng thái PORTB xác định giá trị bit RBIP (INTCON2) 6.3.10 Ngắt giao tiếp USB Không giống ngắt ngoại vi, khối USB có khả tạo tầm ngắt rộng với nhiều loại kiện ngắt khác nhau, kiện hoạt động truyền liệu bình thường, kiện trạng thái, kiện lỗi Để kiểm soát kiện này, khối USB trang bị logic ngắt riêng cho nó, hàm logic tương tự chức ngắt vi điều khiển, nguồn ngắt có bit cờ bit cho phép riêng Tất kiện chuyển thành ngắt đơn bit USBIF (PIR2) Không giống ngắt khác, kiện ngắt USB độc lập gán mức ưu tiên cho nó, mà mức ưu tiên xác định lúc chuyển kiện thành ngắt đơn bit USBIP 212 Chương 6: ngắt lập trình ứng dụng ngắt 6.4 LẬP TRÌNH NGẮT PIC18 Có hai bước lập trình ngắt cho PIC18: Viết thủ tục phục vụ ngắt đặt vào vị trí nhớ chương trình ấn định Đặt bit cho phép ngắt thích hợp phép thực ngắt mong muốn 6.4.1 Lập trình ngắt Assembly Ví dụ 6.1: từ hình 6.10, viết chương trình thủ tục phục vụ ngắt INT0 Chương trình khởi tạo đếm từ 0, cho phép ngắt INT0, sau vòng lặp while-loop để chờ vô tận Thủ tục ngắt INT0 đơn giản để tăng đếm lần lên xuất LED Bất kỳ đếm đến 15 thủ tục ngắt khởi tạo lại giá trị đếm Chọn giá trị linh kiện mạch cho PIC 18F4550 nhận ngắt INT0 giây Hình 6.10: mạch thiết kế ví dụ 6.1 Giải pháp: Để chu kỳ T = s f = Hz, xác định giá trị linh kiện: C = 4,7 µF R1 = 6.2 k; R2 = 150 k với giá trị linh kiện này, IC555 phát sóng vng tuần hồn có tần số Hz Chương trình thủ tục phục vụ ngắt Assembly: #include count set 0x00 org 0x00 goto main org 0x08 ; count value to be output to LEDs ; INT interrupt vector 213 Chương 6: ngắt lập trình ứng dụng ngắt goto int0_ISR retfie org 0x18 retfie main forever clrf count ; Initialize count = movlw 0xF0 ; Configure PORTD lower pins movwf TRISD ; for output movff count, PORTD ; Output count to PORTD bsf RCON, IPEN ; Enable priority interrupt bcf INTCON, INT0IF ; Clear INT0 flag movlw 0x90 ; Enable INT0 interrupt movwf INTCON ; goto forever // ; ******************************** ; INT0 pin interrupt service routine ; ******************************** int0_ISR bcf INTCON, INT0IF ; Clear the INT0 interrupt flag bit movlw 0x0F ; Put value 15 into W register cpfseq count ; Was count equal to 15 already? goto add_1 clrf count goto update add_1 incf count update movff count, PORTD ; Reset count = after reaching 15 ; Increment count by ; Output the count to LEDs retfie end ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Ví dụ 6.2: giả sử chân PORTD RD3:RD0 điều khiển LED Viết chương trình để chọn chu kỳ lệnh làm nguồn xung clock cho TIMER1 đặt hệ số chia (prescaler) cho tràn hai lần giây Chương trình tăng đếm đơn vị có ngắt báo 214 Chương 6: ngắt lập trình ứng dụng ngắt tràn TIMER1 xuất giá trị đếm LED Lập trình ngắt TIMER1 có ưu tiên thấp Giả sử thạch anh sử dụng MHz Giải pháp: Chương trình thực sau: #include led_cnt set 0x00 org 0x00 goto start org 0x08 ; led_cnt = ; retfie org 0x18 goti tmr1_ISR ; Jump to TIMER1 interrupt routine movlw 0xF0 ; Configure PORTD upper pins for movwf TRISD ; input and lower pins for output clrf led_cnt ; Initialize led_cnt = movlw 0xB1 ; Enable TMR1, 16-bit, set prescaler movwf T1CON ; value to 8, choose Fosc/4 bcf PIR1, TMR1IF ; Clear TMR1 flag bit bsf PIE1, TMR1IE ; Enable TMR1 overflow interrupt bsf RCON, IPEN ; Enable priority interrupts bcf IPR1, TMR1IP ; Set TMR1 to low priority bsf INTCON, GIEH ; Enable high priority interrupt bsf INTCON, GIEL ; Enable low priority interrupt movlw 0xDB ; Let TIMER1 overflow in movwf TMR1L ; half a second movlw 0x08 ; // movwf TMR1H ; // goto forever retfie start forever ; ********************************** 215 Chương 6: ngắt lập trình ứng dụng ngắt ; TIMER1 low-priority interrupt service routine ; ********************************** tmr1_ISR bcf PIR1, TMR1IF movlw 0xDB movwf TMR1L movlw 0x0B movwf TMR1H movlw 0x0F cpfseq led_cnt goto add_1 clrf led_cnt goto update add_1 incf led_cnt update movff led_cnt, PORTD ; Clear TMR1 overflow flag ; Was led_cnt = 15? ; Clear led_cnt = ; Update values to LEDs retfie end ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 6.4.2 Lập trình ngắt C Trong ngơn ngữ C, người sử dụng phải khai báo hàm mà xử lý ngắt cách sử dụng dẫn #pragma Từ đó, định ngắt có mức ưu tiên thấp, người sử dụng cần tạo khai báo sau: #pragma interruptlow function_name; // Low priority ISR #pragma interrupt // High priority ISR function_name; Trình biên dịch MCC18 C không đặt tự động thủ tục phục vụ ngắt vector ngắt Thông thường, lệnh goto đặt vector ngắt để truyền điều khiển tới thủ tục phục vụ ngắt thích hợp Mẫu chương trình thực ngắt C sau: #include void low_ISR(void); void high_ISR(void); 216 Chương 6: ngắt lập trình ứng dụng ngắt #pragma code high_vector = 0x08 // High-priority interrupt location void high_interrupt(void) { _asm goto high_ISR; // Jump to the interrupt service routine _endasm } #pragma code // End of code #pragma interrupt high_ISR void high_ISR(void) { // Handle high-priority interrupt } #pragma code low_vector = 0x18 // Low-priority interrupt location void low_interrupt(void) { _asm goto low_ISR; // Jump to the interrupt service routine _endasm } #pragma code // End of code #pragma interrupt low_ISR void low_ISR(void) { // Handle low-priority interrupt } Ví dụ 6.3: từ ví dụ 6.2, viết lại chương trình C Giải pháp: Chương trình C sau: 217 Chương 6: ngắt lập trình ứng dụng ngắt #include #include #define Number_LED void timer_isr(void); static unsigned char count = 0; #pragma code low_vector = 0x18 void low_interrupt(void) { _asm goto timer_isr _endasm } #pragma code #pragma interrupt timer_isr save = PROD // Save into PROD void timer_isr(void) { PIR1bits.TMR1IF = 0; // Clear TMR1IF flag count = (++count) % 16; // Set count range to 15 TMR1 = 0xBDB; PORTD = count; // Update LEDs } void main(void) { TRISD = 0xF0; 218 PORTD = 0; // Initialeze LEDs to display 0000 T1CON = 0xB1; // Enable TMR1 & its interrupt RCONbits.IPEN = 1; // Enable interrupt priority PIR1bits.TMR1IP = 0; // Configure TMR1 interrupt to low priority PIR1bits.TMR1IF = 0; // Clear flag bit Chương 6: ngắt lập trình ứng dụng ngắt INTCONbits.GIEL = 1; // Enable low interrupts INTCONbits.GIEH = 1; // Enable global interrupts PIE1bits.TMR1IE = 1; // Enable TMR1 overflow interrupt TMR1 = 0xBDB; while(1); // Stay at here } // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Ví dụ 6.4: kết nối nút nhấn đến INT0 LED nối đến RB7 PIC 18F4550 Trong chương trình, nút nhấn ấn cung cấp cạnh xung tác động ngắt INT0 làm đảo trạng thái chốt trạng thái LED Giải pháp: //