이 튜토리얼에서는 PIC 마이크로 컨트롤러에서 외부 인터럽트를 사용하는 방법 과 필요한 이유 / 장소에 대해 알아 봅니다. 이것은 PIC 마이크로 컨트롤러를 처음부터 배우기 시작한 PIC 튜토리얼 시퀀스의 일부입니다. 따라서이 자습서에서는 MPLABX를 사용하여 PIC MCU를 프로그래밍하는 방법과 LCD를 PIC와 인터페이스하는 방법에 익숙하다고 가정합니다. 그렇지 않은 경우 해당 링크로 돌아가서 먼저 읽어보십시오. 이미 여기에서 다룬 대부분의 정보를 건너 뛸 것입니다.
필요한 재료:
- PIC16F877A 성능 보드
- 16x2 LCD 디스플레이
- 누름 단추
- 전선 연결
- 브레드 보드
- PicKit 3
인터럽트 란 무엇이며 어디에 사용합니까?
PIC 마이크로 컨트롤러 인터럽트를 프로그래밍하는 방법을 시작하기 전에 인터럽트가 실제로 무엇이며 어디에 사용해야하는지 이해합시다. 또한 마이크로 컨트롤러에는 많은 유형의 인터럽트가 있으며 PIC16F877A에는 약 15 개의 인터럽트가 있습니다. 지금은 그것들을 모두 머리 속으로 혼동하지 않도록합시다.
그래서! 마이크로 컨트롤러의 인터럽트 란 무엇입니까?
우리 모두 알고 있듯이 마이크로 컨트롤러는 입력에 따라 필요한 출력을 트리거하는 사전 정의 된 (프로그래밍 된) 활성화 세트를 수행하는 데 사용됩니다. 그러나 마이크로 컨트롤러가 코드 한 조각을 실행하는 데 바쁘지만 다른 코드 조각에 즉각적인주의가 필요한 긴급 상황이있을 수 있습니다. 즉각적인주의가 필요한 다른 코드는 인터럽트로 처리되어야합니다.
예: 모바일에서 좋아하는 게임을하고 있고 휴대 전화 내부의 컨트롤러 (가정)가 게임을 즐기는 데 필요한 모든 그래픽을 던지느라 바쁘다고 가정 해 보겠습니다. 그런데 갑자기 여자 친구가 전화를 겁니다. 이제 최악의 상황은 게임을 하느라 바쁘기 때문에 여자 친구의 전화를 무시하는 모바일 컨트롤러입니다. 이 악몽이 일어나지 않도록 우리는 인터럽트라는 것을 사용합니다.
이러한 인터럽트는 특정 작업이 발생하기 위해 항상 활성 목록이며, 발생하면 코드 조각을 실행 한 다음 일반 기능으로 돌아갑니다. 이 코드를 ISR (인터럽트 서비스 루틴)이라고합니다. 인터럽트가 필수 인 실제 프로젝트 중 하나는 "PIC 마이크로 컨트롤러를 사용하는 디지털 속도계 및 주행 거리계 회로"입니다.
마이크로 컨트롤러에는 두 가지 주요 유형의 인터럽트가 있습니다. 외부 인터럽트 및 내부 인터럽트입니다. 내부 인터럽트는 타이머 인터럽트, ADC 인터럽트 등과 같은 작업을 수행하기 위해 Microntroller 내부에서 발생합니다. 이러한 인터럽트는 소프트웨어에 의해 트리거되어 각각 타이머 작업 또는 ADC 작업을 완료합니다.
외부 인터럽트는 사용자가 트리거 할 수있는 것입니다. 이 프로그램에서는 푸시 버튼을 사용하여 인터럽트 를 트리거하여 외부 인터럽트를 사용하는 방법을 배웁니다. LCD를 사용하여 0에서 1000까지 증가하는 숫자를 표시하고 인터럽트가 트리거되면 인터럽트 서비스 루틴 ISR 에서 이에 대해 알리고 계속해서 숫자를 증가 시켜야 합니다.
회로도 및 설명:
PIC16F877 인터럽트 를 사용하기위한 회로도 는 위 이미지에 나와 있습니다. LCD 인터페이스 튜토리얼에서했던 것처럼 LCD를 PIC에 연결하기 만하면됩니다.
이제 인터럽트 핀을 연결하기 위해 데이터 시트를보고 외부 인터럽트에 사용되는 PIC 핀 을 알아야 합니다. 우리의 경우 I N PIC16F877A 33 번째의 핀은 RBO / INT는 외부 인터럽트에 이용된다. 이 핀 이외의 다른 핀은 사용할 수 없습니다. 이 회로도의 핀 연결은 아래 표에 나와 있습니다.
S.No: |
핀 번호 |
핀 이름 |
연결됨 |
1 |
21 |
RD2 |
LCD의 RS |
2 |
22 |
RD3 |
LCD의 E |
삼 |
27 |
RD4 |
LCD의 D4 |
4 |
28 |
RD5 |
LCD의 D5 |
5 |
29 |
RD6 |
LCD의 D6 |
6 |
30 |
RD7 |
LCD의 D7 |
7 |
33 |
RBO / INT |
누름 단추 |
PORT B에서 내부 풀업 저항을 활성화 했으므로 푸시 버튼을 통해 RB0 핀을 접지에 직접 연결할 수 있습니다. 따라서이 핀이 LOW가 될 때마다 인터럽트가 트리거됩니다.
아래 그림과 같이 브레드 보드에서 연결할 수 있습니다.
튜토리얼을 따라왔다면 여기에서 사용한이 Perf Board에 익숙했을 것입니다. 그렇지 않다면 그것에 대해 많이 생각할 필요가 없습니다. 단지 회로도를 따르기 만하면 모든 것이 작동합니다.
PIC 마이크로 컨트롤러의 인터럽트 시뮬레이션:
이 프로젝트의 시뮬레이션은 Proteus를 사용하여 만들어졌습니다.
프로젝트를 시뮬레이션 할 때 LCD 디스플레이에서 일련의 숫자가 증가하는 것을 볼 수 있습니다. 이것은 메인 루프 내부에서 발생하며 푸시 버튼을 누를 때마다 LCD는 ISR에 들어갔다는 것을 표시해야합니다. 코드를 수정하고 여기에서 테스트 해 볼 수 있습니다.
코드 설명:
이 프로젝트의 전체 코드는이 튜토리얼의 끝에서 찾을 수 있습니다. 그러나 프로그램은 중요한 부분으로 나누어 져 있으며 이해를 돕기 위해 아래에 설명되어 있습니다.
모든 프로그램과 마찬가지로 프로그램에서 사용하는 핀에 대한 핀 구성을 정의하여 코드를 시작해야합니다. 또한 여기서는 RB0 / INT를 입력 또는 출력 핀이 아닌 외부 인터럽트 핀으로 사용하고 있음을 정의해야합니다. 아래 코드 줄은 7 번째 비트를 0 으로 만들어 포트 B의 내부 풀업 저항을 활성화합니다.
OPTION_REG = 0b00000000;
그런 다음 Global / Peripheral 인터럽트를 활성화하고 RB0을 외부 인터럽트 핀으로 사용하고 있음을 선언합니다.
GIE = 1; // 글로벌 인터럽트 활성화 PEIE = 1; // 주변 인터럽트 활성화 INTE = 1; // RB0을 외부 인터럽트 핀으로 활성화
RB0 핀이 외부 인터럽트 핀으로 정의되면 로우가 될 때마다 외부 인터럽트 플래그 INTF가 1이되고 ISR (Interrupt Service Routine)이 호출되기 때문에 void 인터럽트 기능 내부의 코드가 실행됩니다.
void interrupt ISR_example () {if (INTF == 1) // 외부 인터럽트 감지 {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR 입력"); INTF = 0; // 완료 후 인터럽트 플래그를 지 웁니다. __delay_ms (2000); Lcd_Clear (); }}
보시다시피 인터럽트 함수의 이름을 ISR_example으로 지정했습니다. 원하는대로 이름을 지정할 수 있습니다. 인터럽트 기능 내에서 INTF 플래그가 높은지 확인하고 필요한 작업을 수행합니다. 루틴을 마치면 인터럽트 플래그 를 지우는 것이 매우 중요합니다. 그래야만 프로그램이 다시 무효 주 기능으로 돌아갑니다. 이 정리는 라인을 사용하는 소프트웨어에 의해 수행되어야합니다.
INTF = 0; // 완료 후 인터럽트 플래그를 지 웁니다.
주요 기능 내에서 500ms마다 숫자를 증가시켜 LCD 화면에 표시합니다. RB0 핀의 상태를 확인할 수있는 특정 라인이 없습니다. 인터럽트는 항상 활성 상태로 유지되며 누름 버튼을 누를 때마다 void main에서 빠져 나와 ISR의 라인을 실행합니다.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("주 루프 내부"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("숫자:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); 숫자 ++;
PIC16F877A 인터럽트 작동:
인터럽트가 어떻게 작동하는지 이해 한 후에 는 하드웨어에서 시도해 볼 수 있습니다. 여기에 제공된이 프로그램은 인터럽트가 감지 될 때 LCD 화면의 디스플레이를 변경하는 외부 인터럽트의 매우 기본적인 예입니다.
프로젝트의 전체 작업은 아래의 비디오에서 찾을 수 있습니다. 인터럽트 및 사용 위치 / 방법에 대해 이해하기를 바랍니다. 의심스러운 점이 있으면 포럼이나 댓글 섹션을 통해 저에게 연락 할 수 있습니다.