PIC에서 여러 외부 인터럽트 사용


9

여러 프로젝트에 PIC16F877( datasheet )를 사용 했습니다. 단일 외부 핀 변경 인터럽트의 경우 PORTB0인터럽트 를 사용할 수 있습니다 . 그러나 이제 단일 회로에서 8 개의 독립적 인 외부 핀 변경 인터럽트를 지원해야합니다.

데이터 시트에는에 15 개의 인터럽트가 있다고 말하지만 PIC16F877타이머 오버플로 인터럽트 등을 포함하여 계산됩니다.이 경우에는 쓸모가 없습니다.

이것이 바로 INTCON레지스터 에 대한 데이터 시트 입니다.

여기에 이미지 설명을 입력하십시오

bit0을 사용하여 4 개의 독립적 인 인터럽트를 가질 수 있습니까 RBIF? 의 변화를 나타냅니다 PB7:PB4. 인터럽트 루틴에서 포트 값을 읽어 어떤 핀이 변경되었는지 식별하려면 어떻게해야합니까?

위의 긍정적 인 답변을 얻었더라도 8 개의 인터럽트가 필요합니까? 물론 변경을 INTE위해 여전히을 사용할 수 PORTB0있습니다. 그렇다면 4 + 1 = 5다른 3은 어떻습니까? (그러나 8 개의 인터럽트 이벤트가 모두 같은 유형 인 4 + 1 + 3 = 8것은 추한 것 같지 않습니까?)

8 핀을 모니터링하는 다른 마이크로 컨트롤러에서 예상되는 다른 무거운 작업은 없습니다. (다른 작업에 대해 말하면 별도의 카운터 변수 세트를 유지 관리하고 PC에 직렬로 약 4 바이트를 자주 전송해야합니다)

어떤 제안이라도 환영합니다. 더 적합한 것을 위해 마이크로 컨트롤러를 변경하는 것에 관한 것이더라도 (그러나 .... PICs 에서 멀어 지라고 말하지 마십시오 ).


2
인터럽트를 사용하지 않으면 메인 프로그램에서 핀을 모니터링 할 수 있습니다. 그러나 그것은 완벽하지 않습니다. 대안으로 Arduino로 갈 수 있습니다. PIC는 아니지만 매우 간단하지만 이미 PIC에 익숙하므로 쉽게 이해할 수 있습니다.
아누비스

1
RBIE 인터럽트를 사용하는 경우 매번 이전 값과 XOR을 버퍼링하여 변경된 내용을 찾을 수 있습니다. 실행이 매우 빠릅니다.
PeterJ

@PeterJ 나는 그것을 이해하지 못했습니다. 어떤 값을 버퍼링합니까?
코드 명 SC

트윗 담아 가기 대기 중
코드 명 SC

1
한 가지 방법은 외부 8 입력 게이트 (예 : 74LS30과 같은)를 사용하여 외부 신호를 하나의 인터럽트 핀에 결합하는 것입니다. 74 (HC) 30은 NAND 게이트이므로 대기 상태에서 높은 모든 입력이 필요합니다. 또한 포트를 읽으면 활성화 된 인터럽트를 식별 할 수 있도록 포트 핀에 연결해야합니다.
Brian Drummond

답변:


3

이것은 하나의 아이디어를 설명하는 C 의사 코드입니다. 그리고 독점 OR을 사용하여 어떤 핀이 변경되었는지 알아 내고 하나의 RBIE 인터럽트 내에서 다른 핸들러를 호출합니다. 응용 프로그램의 중요도에 따라 인터럽트가 실행되는 동안 이벤트가 발생하지 않도록 PIC가 포트 변경과 같은 상황을 처리하는 방법을 확인할 수 있습니다.

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}

알겠습니다, 감사합니다! 그러나 그것은 내가 찾고있는 정확한 대답이 아닙니다. 이렇게하면 RB7:RB44 개의 핀만 모니터링 할 수 있습니다 . 그러나 8 핀을 모니터링하는 방법을 요구하고 있습니다. 어떠한 제안?
코드 명 SC

위의 방법으로 RB0-RB7을 사용할 수없는 이유가 있다고 생각합니다. 그렇지 않으면 실제로 방법을 생각할 수 없습니다. 코드를 빠르게 분류하는 것이 중요하지 않은 경우 타이머 인터럽트 (또는 주 루프)에서 위의 코드 스타일을 사용할 수 있습니다.
PeterJ

해당 PIC의 경우 인터럽트를 사용하여이 작업을 수행하려면 RB4 : RB7의 XOR 트릭과 RB0 : RB3의 4 가지 인터럽트가 필요합니다. 인터럽트가 필요하지 않은 경우 코드에서 전체 포트를 폴링하거나 하드 샘플링 속도가 필요한 경우 타이머 인터럽트를 사용하여 폴링을 처리하십시오.
Scott Seidman

and four interrupts for the RB0:RB3? PIC16F877은에 대한 인터럽트를 지원하지 않습니다 RB1:RB3.
코드 명 SC

데이터 시트에서 전체 포트를 포괄한다고 가정했습니다. 그러나 나는 당신의 다른 의견을 초당 한 번 보았으므로 이것을 메인 루프에서 실행하는 것이 더 좋을 것이라고 생각합니다. 인터럽트를 사용하면 실행 중 언제라도 변수 업데이트와 인터럽트가 실행되는 동안 핀 변경을 처리하는 방법을 관리해야합니다. 실제 이득을 얻기 위해 복잡하게 만드는 것처럼 들립니다. 내가 생각할 수있는 유일한 예외는 인터럽트시 절전 모드에서 깨우기를 사용하려는 경우 하드웨어 MUX가 필요하다는 것입니다.
PeterJ

1

해당 부품에는 4 개의 핀 변환 인터럽트와 선택한 에지에서 설정할 수있는 몇 가지 다른 인터럽트 만 있습니다. 한 가지 전략은 외부에서 8 비트 값의 변화를 감지 한 다음 불일치를 중단하는 것입니다. 하드웨어가 지저분하지만 원하는대로 정확하게합니다.

언급하지 않은 중요한 매개 변수는 핀 변경에 얼마나 빨리 응답해야하는지, 핀 변경이 유효하기 위해 지속되는 최소 시간입니다. 답변에 따라 정기적 인 펌웨어 인터럽트를 기반으로 폴링 할 수 있습니다. 16F877은 5MHz 명령 속도로 실행할 수 있으며 변경 사항을 확인하는 데는 몇 가지 명령 만 필요합니다. 50 명령어마다 인터럽트를 설정했다고 가정 해 봅시다. 그것은 프로세서 시간의 많은 부분을 포 그라운드 코드로 남겨 둘 것입니다. 인터럽트 속도는 100kHz이고주기는 10µs입니다. 물론 포 그라운드 코드는 여전히 변경 플래그를보고 이에 대해 무언가를 수행해야하므로 응답 시간은 10 µs 이상이지만 변경이 감지 될 때 수행해야 할 작업에 대해서는 언급하지 않았습니다. 이것이 인간의 시간에 반응해야한다면


세부 정보가 누락되어 죄송합니다. 예상 응답 속도 once per second로 충분합니다. 핀 변경 (한 에지, 상승이라고 함)이 감지되면 카운터 (변수)를 증분시켜야합니다. 메인 루프에서는 카운터 값을 모니터링해야하며 특정 값보다 높아지면 4 바이트 USART를 PC 로 전송해야합니다 . 그런 다음 관련 카운터 값을 0으로 재설정하십시오. 그렇게 간단합니다. 폴링 옵션이 제대로 작동 할 것 같습니까?
코드 명 SC

2
초당 한 번 ! 그렇다면 인터럽트에 대한 모든 고통은 무엇입니까? 이것은 정기적으로 폴링으로 쉽게 수행됩니다. 그럼 뭐가 문제 야?
Olin Lathrop

음 ... 나는 그들 중 8 개가 있기 때문에 가장 좋을 것입니다. 또한 응답을 예측할 수 없습니다 (그러나 그 값은 최소라고 가정 할 수 있습니다). 야! 사람들은 실수를 할 수 있습니다 .. :(
Codenamed SC

1

@Brian Drummond가 언급 한대로 8 입력 게이트 NAND를 사용하여 INT 핀을 통해 인터럽트를 발생시키고 인터럽트 소스를 "74HC165N"과 같은 8 비트 병렬 입력 / 직렬 출력 시프트 레지스터에 연결할 수 있습니다. 인터럽트가 발생한 후 Shift 레지스터에서 데이터를 읽고 실제 인터럽트 소스에 대한 정보를 제공합니다. 가장 빠른 방법은 아니지만 확장이 쉽고 5 핀 이하를 사용합니다. 주소 제어 시스템 (MUX, LATCH, ...)을 추가하면 인터럽트 알림을 위해 하나의 소나무 만 필요하며 다른 핀은 다른 자원에 대해 다른 시간에 재사용 될 수 있습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.