본문 바로가기
코스웨어/16년 스마트컨트롤러

20160314_정우민_인터럽트

by 알 수 없는 사용자 2016. 3. 15.
728x90
반응형

펌웨어 실습(인터럽트)


#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21)) //메모리 21번지에서 하는 일은 DDRA
#define PORTA (*((volatile unsigned char *)0x22))
#define EICRA (*((volatile unsigned char *)0x69))
#define EICRB (*((volatile unsigned char *)0x6A))
#define EIMSK (*((volatile unsigned char *)0x3D))
#define SREG (*((volatile unsigned char *)0x5F))


#define INT7 7
#define INT6 6
#define INT5 5
#define INT4 4
#define INT3 3
#define INT2 2
#define INT1 1
#define INT0 0

#define ISC7 6
#define ISC6 4
#define ISC5 2
#define ISC4 0
#define ISC3 6
#define ISC2 4
#define ISC1 2
#define ISC0 0

#define sei()   __asm__ __volatile__ ("sei" ::) //어셈블리명령어 7번비트만 1로 만든다. 어셈블리가 더빠름

#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: ) // 어셈블리어, 자라, 무한 while보다 좋다.

void __vector_1 (void) __attribute__((signal, used, externally_visible));

int main(void)
{
 DDRA=0xff;
 PORTA=0x00;
 EICRA=(3<<ISC0); //ISC0은 INT0을 의미,OR이용해서 다른 인터럽터도 사용.
 EIMSK=(1<<INT0);
 SREG=SREG | (1<<7); // sei(); 랑 같다
 
 while(1)
 {
 }
 return 0;
}

void __vector_1 (void) //채터링현상 주의, 시간지연하는 방법이있음. sw적으로 해결가능하지만, hw적으로도 가능.
{
 PORTA=~PORTA;
}

728x90