본문으로 바로가기

C언어_펌웨어_인터럽트 사용법

category 개발자/C 언어 2015. 4. 17. 12:32

#define DDRD    (*((volatile unsigned char*)0x2A))    //입력 쪽 
#define PORTD   (*((volatile unsigned char*)0x2B))

#define DDRA   (*((volatile unsigned char*)0x21))    //출력 쪽
#define PORTA   (*((volatile unsigned char*)0x22))

#define SREG    (*((volatile unsigned char*)0x5F))  //상태 레지스터, 0000 0000 부분중 제일 끝 자리가 글로벌

#define EIMSK   (*((volatile unsigned char*)0x3D))    //사용할 핀을 설정.(현재 int0 번 사용 중)

#define EICRA   (*((volatile unsigned char*)0x69))  //edge setting

#define EIFR    (*((volatile unsigned char*)0x3C))  //반환

char led=0xFF;

void __vector_1(void)__attribute__((signal,used,externally_visible));//int0의 벡터 번호 1

void __vector_1(void)// 처리할 루트를 넣어준다. 끼어드는 조건이 만족하면 실행된다.
{
  //PORTA ^= 0x01;  ^ <- xor 즉, 모든것을 반전 시킨다라는 뜻이다.(이걸 설정해줘야만 꺼졌다 켜졌다를 반복할 수 있다. 같은것은 0값)
  PORTA = (~(led^(led <<1)));

  led = (led << 1);
  
  EIFR = 0x01;  //반환 값. 그쪽 인터럽트를 사용했다라는 뜻의 반환.
}

int main(void)
{
  DDRD = 0xFE;    // 입력쪽을 이런식으로 설정해준 이유는 ?

  SREG &= 0x7F;  // &= 이 의미는 형태 sreg 0x7F 가 앤드 형태로 들어가 있으니 다른 어떤 값이 들어오면 &시켜버린다. 즉 지금의 형태는 모든 인터럽트를 사용 안하겠다가 된다.
  
  DDRA = 0xFF;

  EIMSK = 0x01;

  EICRA = 0x02;  //falling edge

  //led= 0xFE;
  
  SREG |= 0x80;  //모든 인터럽트를 사용한다. 이제 ELMSK 값을 조정해주면 서로 OR을 시켜 그 핀만 인터럽트가 작용하게 된다.

  PORTA=led;

  while(1);

  return 0;
}