EICRA , EICRB 이 두개는 단순하게 말하면 어떤 방식으로 인터럽트를 일으킬 것이냐? 라는걸 묻는다
EICRA는 인터럽트0~3번까지를 어떤 방식으로 설정할 건지, EICRB는 인터럽트4~7번까지를 어떤 방식으로 설정할 건지를 상태에 따라
설정해 준다.
EIMSK 로 어떤 인터럽트를 설정시킬지 선택
EICRA나 EICRB로 해당 인터럽트의 발생방식을 설정해주고
sei()로 전체 인터럽트 허가를 설정해 주면 된다.
인터럽터를 구별하는 표를 벡터넘버 테이블이라고 한다.
아래는 위에서 나온 표기들을 이용한 실험이다.
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
#define PINA (*((volatile unsigned char *)0x20))
#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" :: )//
void __vector_1 (void) __attribute__((signal, used, externally_visible));
//vector_16:백터15번 타이머카운트 2에 대한것이다
int main(void)
{
DDRA = 0xFF;//활성
PORTA = 0x00;//켜기
EICRA = (3<<ISC0); //INT0 인터럽트0번을 뜻한다.2진수11은 10진수로 호출하면 3(3을왼쪽으로ISC0만큼민다)
//인터럽트 2번을 하강엣지로 하고 싶다.EICRA = (2<<ISC2)|(3<<ISC0);(INT2,INT0)
EIMSK = (1<<INT0); //결론적으로 EIMSK의 끝에 1이 들어간다.EIMSK = 1;
//ex EIMST = (1<<INT0)|(1<<INT3); 요렇게 하면 1하고3번만 연다
SREG = SREG|(1<<INT7); //7번자리만 쓰셈sei();이거와 같다
while(1)//(무한루프걸고있다)
{
sleep();
}
return 0;
}
void __vector_1 (void)
{
PORTA = ~PORTA;//(누를때마다반전된다)
}
위 소스로 하면 결과는 이상없지만
1프로 부족한 결과가 나온다.
스위치 작동시의 지연문제로 바로 바꿔지지 않는다.
이럴경우 아래의 for문을 넣어 지연시간을 설정해주면
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#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" :: )
void __vector_1(void) __attribute__((signal, used, externally_visible));//인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다)
int main(void)
{
DDRA=0xff;
PORTA=0x00;
EICRA=(3<<ISC0);//ISC0==INT0
EIMSK=(1<<INT0);//==EIMSK=1;,INT0만 열고 나머지문은 다 닫는다.만약 다른것도 열고 싶으면 (1<<INT0) | (1<<INT3);이렇게 쓴다.
SREG=SREG|(1<<7);//어셈블리보다 코드보다 느리다.SREG=SREG | (1<<7)==sei();
while(1)
{
sleep();
}
return 0;
}
void __vector_1(void)
{
volatile unsigned int uiCnt;
for(uiCnt = 0; 30000>uiCnt ; ++uiCnt);
PORTA=~PORTA;
}
조금더 깔끔한 결과를 얻을수 있다.
-부스러기-
소스 인사이트 짧막한 인사이트
소스 인사이트 실행
1,2번을 순차적으로 실행해준다.
아래 빨간박스의 칸을 체크&클릭한후 폰트를 바꿔준다.
도메인 주소 유출방법
아래의 사진에서 WWW대신 PING를 넣으면 그 사이트의 도메인주소를 보여준다.(*상시변함)
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160315_송민규_업무일지_펌웨어분석, 학습 (3) | 2016.03.16 |
---|---|
20160311-허도경-업무일지-펌웨어분석 (0) | 2016.03.15 |
20160314_정우민_인터럽트 (0) | 2016.03.15 |
20160311_오아람_업무일지_데이터시트,실습+펌웨어분석 (1) | 2016.03.15 |
main.h (0) | 2016.03.15 |
main.c (2) | 2016.03.15 |
2016.03.11 이종찬 업무일지 (3) | 2016.03.15 |
20160314_송민규_업무일지_펌웨어분석 (3) | 2016.03.15 |