본문으로 바로가기

외부 인터럽트실험2

category MicroProcessor/AVR 2012. 3. 9. 01:00


INT0, INT1 을 이용한 인터럽트 테스트

LED를 천천히 한 이유는...?

루틴 복귀지점을 정확히 파악하기 위함임... 

4번째에서 인터럽트 시키면 복귀 할 때 다음작업인 5번째에서 켜짐

아주 똑똑한 녀석임.. ^^*

( 참고 : 스위치가 정확히 눌리기가 어려워 인터럽트가 2번 발생할 경우도 있음 )

===========================================================================================

// 인터럽트를 실험 하기 위한 소스


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "avr/dy.h"

unsigned char i,pb_sum, pc_sum;

void port_init(void)
{
DDRB = 0xff;
DDRC = 0xff;
DDRD = 0x00;








PORTB = 0x00;
PORTC = 0x00;
}

void port_subinit(void)
{
 pb_sum = 0;
 pc_sum = 0;
 PORTB = 0x00;
 PORTC = 0x00;
 delay_ms(1000);
}

SIGNAL(SIG_INTERRUPT0)
{
 port_subinit();
 for(i = 32; i > 0; i/=2)
 {
  pc_sum += i;
  PORTC = pc_sum;
  delay_ms(2000);
 }

for(i = 32; i > 0; i/=2)
{
  pb_sum += i;
  PORTB = pb_sum;
  delay_ms(2000);
 }

port_subinit();
}

SIGNAL(SIG_INTERRUPT1)
{
 char num[2][6]={ {32, 48, 56, 60, 62, 63}, 
   {1, 3, 7, 15, 31, 63} };
 port_subinit(); 






for(i = 0; i < 6; i++)
 {
  PORTB = num[0][i];
  PORTC = num[1][i];
  delay_ms(2000);
 }


 
port_subinit();
}

void extint_init(void)
{
 MCUCR = (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(0<<ISC00);
}

void extpin_enable(void)
{
 GIMSK = (1<<INT1)|(1<<INT0);
}

int main(void)
{
 unsigned char i,pb_sum, pc_sum;

port_init();
 extint_init();
 extpin_enable();
 sei();

while(1)
 {
  for(i = 1; i < 64; i*=2)
  {
   pb_sum += i;
   PORTB = pb_sum;
   delay_ms(2000);
  }




 
for(i = 1; i < 64; i*=2)
  {
   PORTB = 0xff;
   pc_sum += i;
   PORTC = pc_sum;
   delay_ms(2000);
  }

pb_sum = 0;
  pc_sum = 0;
  PORTB = 0x00;
  PORTC = 0x00;
  delay_ms(1000);
 }
}



댓글을 달아 주세요