#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;
}
'개발자 > C 언어' 카테고리의 다른 글
C언어_교환법칙, (2,3)차원 배열, 더블 포인터의 이해 (0) | 2015.04.17 |
---|---|
C언어_구조체 메모리 최적화(전처리어 pragma 사용법),구조체 활용, 공용체 사용법 (0) | 2015.04.17 |
C언어_구조체의 활용(배열 통째로 옮기기, 구조체 메모리 저장 형태) (0) | 2015.04.17 |
C언어_펌웨어_주사위 인터럽트 사용. (0) | 2015.04.17 |
C언어_펌웨어_int0 count dn , int4 count up (0) | 2015.04.17 |