티스토리 뷰

카테고리 없음

EIFR 레지스터 및 인터럽트 벡터

시작이반입니다 시작이반입니다 2021. 7. 11. 07:00

EIFR 레지스터

앞에서 설명한 것들은 "외부 인터럽트 허용(enable) 여부"를 결정하는 레지스터들이지만, EIFR 레지스터는 인터럽트 발생 상태를 표시하는 "인터럽트 발생 표시용 플래그"입니다. 인터럽트 허용 여부를 결정하는 비트들은 프로그램에서 CBI 또는 SBI 등의 명령으로 소프트웨어 클리어 또는 세트되지만, 인터럽트 발생 상태를 표시하는 플래그들은 CPU가 직접 세트합니다. INTn을 통하여 인터럽트가 요청되면 CPU가 자동적으로 이들을 세트합니다. 여기서 명심할 것은 이들 인터럽트 플래그들은 SREG의 I비트나 EIMSK의 개별 인터럽트 허용 비트와는 아무 상관이 없이 세트된다는 사실입니다. INTn 외부 인터럽트 조건만 성립하면 이들과는 상관없이 자동적으로 세트됩니다. 실제 인터럽트가 발생되느냐 그렇지 않느냐는 개별 인터럽트 허용 비트와 전체 허용 비트의 내용에 의해서 결정됩니다. 실제 인터럽트가 발생하면 이들 플래그 비트는 자동적으로 클리어됩니다. 그러므로 인터럽트 루틴에서 별도로 이들을 클리어할 필요가 없습니다. 다른 인터럽트 플래그들도 같습니다. 이것은 다른 마이크로컨트롤러와 다른 점이니 주의를 요합니다. 그렇다고 프로그램 중에 이들 플래그를 클리어시키는 것이 틀리다는 것은 아닙니다. 다만 그럴 필요가 없을 뿐입니다. 굳이 소프트웨어로 클리어하고 싶으면 해당 비트에 논리 1을 기록해야 합니다. 논리 0을 기록하지 않는다는 것을 유의해야 합니다. 특히 주의할 것은 INT7:0을 저레벨 인터럽트로 했을 경우에 이들 플래그는 항상 클리어 된다는 것입니다. 그러므로 이 경우에는 플래그를 이용하는 프로그램이 불가능합니다. 또 sleep 모드로 들어갔을 때에는 INT3:0 인터럽트는 금지됩니다.

인터럽트 벡터

앞에서 밝혔듯이 인터럽트 소스로부터 EICRA 및 EICRB가 지정한 인터럽트 요청이 있으면 해당 인터럽트 플래그는 자동적으로 세트되고, 그 이전에 EIMSK에 그 인터럽트가 개별적으로 허용되고, SREG에 전체적으로도 허용되어 있으면 인터럽트가 발생합니다. 인터럽트가 발생하면 물론 인터럽트 소스가 요청하는 일을 해야 합니다. 소위 인터럽트 서비스 루틴을 처리해야 합니다. 문제는 인터럽트 서비스 루틴을 처리하기 위해서 어떻게 해야 하느냐에 있습니다. 인터럽트 서비스 루틴을 처리하기 위해서는 그 루틴으로 뛰어가야 합니다. 이 문제가 인터럽트 3대요소 중 하나인 인터럽트 벡터입니다. 결국 인터럽트 벡터란 인터럽트가 발생하는 경우 그에 합당한 서비스를 해주기 위해서 뛰어가는 곳입니다. 인터럽트 벡터는 마이크로컨트롤러에 따라 어떤 특정의 번지로 고정되어 있는 것도 있고, 인터럽트를 요구한 외부장치가 데이터버스를 통하여 지정하는 것도 있는데, Z80에서는 후자의 방법에 의하지만 AVR에서는 전자의 방법에 의합니다. AVR에 있어서는 인터럽트 종류에 따라 뛰어가는 곳이 어느 특정의 번지에 고정되어 있습니다. 이와 같이 인 터럽트 벡터가 인터럽트 종류에 따라 특정 번지에 고정되므로, 이들 번지에서부터 인터럽트 서비스 루틴을 두든지, 아니면 이곳에 jump 명령을 둠으로써 다른 곳으로 뛰어가서 그 곳에서부터 인터럽트 서비스 루틴을 두어야 하는데, AVR에서는 후자의 방법을 사용합니다.

댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
1,227
Today
0
Yesterday
4
링크
TAG
more
«   2021/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함