Thứ Tư, 28 tháng 11, 2018

Bài 8. PIC 18F450 Ngắt Ngoài

Giới thiệu

Ngắt là những tín hiệu làm thay đổi dòng chảy của một chương trình thực thi bằng cách làm cho nhảy vi điều khiển chuyển sang Interrupt Service Routine để phục vụ ngắt. Các ngắt này được cấp cho bộ vi điều khiển thông qua các chân ngoài của bộ vi điều khiển.
                             
Khái niệm về ngắt bên ngoài
Khái niệm về ngắt bên ngoài


  • Một khi bộ điều khiển hoàn thành các thói quen, nó trở về vị trí từ nơi nó đã thực hiện một bước nhảy.
  • Trong trường hợp các ngắt không được sử dụng, chương trình sẽ cần phải liên tục thăm dò các tín hiệu đầu vào để giám sát các sự kiện bên ngoài để bắt các xung khi chúng xảy ra. Nhưng trong một số trường hợp, chương trình có thể bỏ lỡ một sự kiện.  
  • Ví dụ: Một cảm biến khe hồng ngoại cố gắng để bắt một giọt tiền xu. Trong tình huống này, việc sử dụng ngắt có thể giải phóng bộ vi điều khiển để thực hiện một số công việc khác trong khi không thiếu đầu vào. Trong trường hợp này, các ngắt ngoài được sử dụng.

Chân ngắt gián đoạn bên ngoài

PIC18F4550 có ba ngắt phần cứng bên ngoài - INT0, INT1 và INT2. Họ đang trên PORTB pins RB0, RB1 và ​​RB2 thể hiện trong hình dưới đây.
Các chân ngắt bên ngoài PIC18F4550
Chân ngắt gián đoạn bên ngoài
Các ngắt này là các ngắt được kích hoạt cạnh, tức là được kích hoạt bởi một trong hai cạnh đang tăng hoặc bằng cạnh giảm.
Bit kích hoạt cạnh có mặt trong thanh ghi INTCON2.
Vì vậy, hãy xem Đăng ký INTCON2.

Đăng ký INTCON2

INTCON2 : Đăng ký kiểm soát ngắt
Đăng ký gián đoạn INTCON2
Đăng ký INTCON2
INTEDG0: External Interrupt 0 Edge chọn bit
               1 = Gián đoạn trên cạnh tăng
               0 = Gián đoạn trên cạnh ngã
INTEDG1: External Interrupt 1 Edge chọn bit
               1 = Gián đoạn trên cạnh tăng
               0 = Gián đoạn trên cạnh ngã
INTEDG2: External Interrupt 2 Edge chọn bit
               1 = Gián đoạn trên cạnh tăng
               0 = Gián đoạn trên cạnh ngã
RBPU: PORTB Pull-up cho phép bit
  • PORTB có sức kéo nội bộ yếu. Vì vậy, để kích hoạt chúng bit RBPU được sử dụng.
              1 = Tất cả các Pull-up PORTB bị vô hiệu hóa
              0 = Tất cả các Pull-up PORTB được bật
TMR0IP: Ưu tiên ngắt tràn TMR0
              1 = Mức độ ưu tiên cao
              0 = Mức độ ưu tiên thấp
RBIP: Ưu tiên ngắt thay đổi RB PORT
              1 = Mức độ ưu tiên cao
              0 = Mức độ ưu tiên thấp

Các bước lập trình

Khởi tạo
  1. Đặt mã băm External PORTB làm đầu vào.
  2. Ngoài ra, làm cho PORTB chân như đầu vào kỹ thuật số vì nó được ghép kênh với các kênh ADC. Điều này được thực hiện bằng cách vô hiệu hóa bit ADON trong thanh ghi ADCON1 hoặc bằng cách làm cho bit cấu hình PBADEN ở mức thấp.
  3. Cấu hình đăng ký INTCON2 cho cạnh kích hoạt tức là cạnh dương hoặc âm.
  4. Cho phép ngắt ngoài (INT0, INT1, INT2) bằng cách thiết lập một bit kích hoạt ngắt tương ứng trong thanh ghi INTCON.
  5. Kích hoạt Global Interrupt (GIE).
void External_Interrupt_Init()
{
    TRISBbits.TRISB0=1;  /* Make INT0 pin as an input pin*/
    
    /* Also make PBADEN off in Configuration file or clear ADON 
    in ADCON0 so as to set analog pin as digital*/

    INTCON2=0x00;  /* Set Interrupt detection on falling Edge*/
    INTCONbits.INT0IF=0; /* Clear INT0IF flag*/
    INTCONbits.INT0IE=1; /* Enable INT0 external interrupt*/
    INTCONbits.GIE=1;  /* Enable Global Interrupt*/
}
  1. Khi một ngắt xảy ra, nó sẽ nhảy tới ISR ​​để phục vụ ngắt.
  2. Cuối cùng, xóa cờ ngắt và tiếp tục.

Ứng dụng

Chúng tôi sẽ phát triển một ứng dụng nhỏ trên PIC18F4550 bằng cách sử dụng ngắt bên ngoài. Trong điều này, chúng ta sẽ chuyển đổi LED được kết nối với chân PORTC.0 khi một ngắt bên ngoài xảy ra.

Sơ đồ

                         
PIC18f4550 bên ngoài gián đoạn LED toggling
LED Toggling sử dụng PIC18F4550 External Interrupt
  • Ở đây, sự kiện ngắt bên ngoài đến từ công tắc kết nối với chân PORTB.0 (INT0). Sự kiện này là cạnh tiêu cực được kích hoạt. Khi công tắc được nhấn, một xung thấp sẽ được tạo ra trên chân INT0. Điều này sẽ tạo ra một ngắt như đăng ký INTCON2 được cấu hình để phát hiện kích hoạt cạnh tiêu cực (cao đến thấp xung).
  • Sau đó, điều khiển sẽ chuyển sang ISR trong đó LED trên PORTC.0 sẽ chuyển đổi và điều khiển sẽ chuyển sang chương trình chính.
  • Vì vậy, không cần phải thăm dò liên tục pin PORTB.0.
#include "osc.h"
#include <p18f4550.h>

#define LED LATC

void External_Interrupt_Init();
void MSdelay(unsigned int);

void main()
{
    OSCCON=0x72;  /* Set internal oscillator to 8MHz*/
    TRISC0=0;   /* Make PORTC.0 as output*/
    LED=0;            
    External_Interrupt_Init(); /* Initialize External Interrupt*/   
    while(1);
}

void External_Interrupt_Init()
{
    TRISBbits.TRISB0=1;  /* Make INT0 pin as an input pin*/

    /* Also make PBADEN off in Configuration file or
    clear ADON in ADCON0 so as to set analog pin as digital*/
  
    INTCON2=0x00;  /* Set Interrupt on falling Edge*/
    INTCONbits.INT0IF=0; /* Clear INT0IF flag*/
    INTCONbits.INT0IE=1; /* Enable INT0 external interrupt*/
    INTCONbits.GIE=1;  /* Enable Global Interrupt*/
}


void interrupt ISR()
{   
    LED = ~(LED);  /* Toggle LED on interrupt*/
    MSdelay(200);
    INTCONbits.INT0IF=0;
}

void MSdelay(unsigned int val)
{
 unsigned int i,j;
 for (i=0; i<val; i++)
     for (j=0; j<165; j++); /* Delay count for 1ms for 8MHz freq. */
}

Code mô phỏng

Không có nhận xét nào:

Đăng nhận xét