2015-02-15

외부 인터럽트( External Interupt) 강좌 질문

외부 인터럽트 강좌 내용의 질문과 답변을 정리한 글입니다.

출처 : http://cafe.naver.com/lazydigital/delay

외부 인터럽트 강좌 관련하여 궁금증한 점이 있습니다.

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
 DDRA = 0xff;                      
 DDRE = 0x00;                     
 SREG |= 0x80;                   
 EIMSK = 0x30;                    
 EICRB = 0x00;                    
 while (1)
 PORTA = 0x00;                   
}

ISR (INT4_vect)                              
{
 PORTA = 0x80;                   
}

ISR (INT5_vect)                               
{
 PORTA = 0x01;                   
}

위에서 DDRE를  입력으로 선언하지 않고 해봤는데 똑같이 작동하고 있어서 DDRE값을 입력으로 선언하지 않아도 되는지

궁금합니다.

외부인터럽트는 ATmega128  핀의 I/O 기능외에  각핀마다 있는 고유 기능중에 하나라고 알고 있습니다.

핀에 있는 특수한 기능을 사용하면 그핀의 I/O 기능은 어떻게 되는지에 대해선 아직 잘 모르는 부분입니다.

위에서는 DDRE 를 입력으로 하고 PINE 값을 FND에 출력해보니 스위치 누르는 값에 따라 변화되서 들어가는걸

확인해보긴했습니다.

그런데 DDRE를 입력으로 선언하지않고  PINE값을 FND에 출력해보니 값이 스위치 누르는값에 따라 변화되서

들어가늘걸 보았습니다.

DDRE를 출력으로 선언하면 당연히 PINF값은 물론이고 인터럽트도 동작하지는 않는건 이해하고 확인해보았습니다.

왜 입력으로 선언하지 않고 그 핀의 특수기능만을 사용했는데도 핀이 입력으로 작동됐는지 궁금해서 질문 드려 봅니다..

핀에 있는 특수한 기능을 사용하면 그핀의 I/O 기능은 어떻게 되는지가 제일 궁금합니다.

아래는 제가 연습해본 코드입니다 위와 동일하고 FND하고 PINE만 값을 넣어서 PORTC 에 출력해보았습니다.

  
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
 unsigned char FND=0;

 DDRA = 0xff;
 DDRC = 0xff;
 DDRG = 0x0f;                      
 //DDRE = 0x00;                     
 SREG |= 0x80;                   
 EIMSK = 0x30;                    
 EICRB = 0x00;                    
 while (1){
  
 {
  
  FND= PINE ;
  
  PORTC = (0x30 & FND);
  PORTG = 0x0f;
 }
  
 }
}

ISR (INT4_vect)                              
{
 PORTA = 0x80;                   
}

ISR (INT5_vect)                               
{
 PORTA = 0x01;                   
}



DDRE 는 칩이 시작할때(리셋) 0 입니다. 즉 입력상태입니다.(초기화 없어도 됨).

핀에 있는 특수한 기능을 사용하면 그핀의 I/O 기능은 어떻게 되는지가 제일 궁금합니다.
=> 
핀을 IO 로 사용하지 않고 다른 기능핀(alternate function)을 할때, 특수 기능에 따라 다릅니다.
예를 들어 interrupt는 input 모드로 해야 한다든지.
하지만 uart 는 핀의 입력/출력을 지정하지 않아도 uart를 enable 하기만 하면 해당 핀의 방향은 
저절로(DDRx 프로그램 할 필요없음) 된다든지,
-> uart tx핀을 출력으로, uart rx를 입력핀으로 명시적으로 DDRx 값을 설정할 필요가 없음.

따라서 기능을 이용할때 해당 핀의 DDRx를 설정해야 하는지는 해당 기능의 데이타쉬트를 확인해야 합니다.

interrupt 핀 (INT4,INT5 같은) 을 input으로 지정해야 하는건 상식적으로 당연해 보이죠?
하지만
이렇게 하면 어떻게 될까요?

INT4,5핀을 출력으로 지정하고(DDRx)
해당값을 program에서 해당 핀값을 쓰기 하면(PORTx) 어떻게 될까요?

그렇게 해도 인터럽트는 발생합니다. 한번 해 보세요.
예를 들어
INT4핀을 출력으로 지정하고
INT4는 edge 인터럽트로 초기화 하고

while(1)
{
PORTE |= 1 << 4; // INT4 를 1로
PORTE &= ~(1 << 4); // INT4를 0으로
_delay_ms(1000);
}

1초마다 한번씩 INT4에 해당핀을 출력으로 1,0인 펄스를 생성
이렇게 해도 인터럽트가 걸립니다.

No comments:

Post a Comment

Total Pageviews