1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/********************************************************************
 파일명 : Interrupt_led.c
 
 동 작 : 
  LED의 불이 100ms마다 좌측으로 쉬프트 되면서 켜진다. 버튼을 누르면 LED가 멈추었다가 한번 더 누르면 다시 동작한다.
       
 포트연결 :
1) 포트D의 0번비트를 Switch에 연결
2) 포트E 8핀을 LED에 연결
 
 소스 설명 :
 1) AVR 입출력에 대한 헤더 파일과 인터럽트를 사용하기 위한 헤더와 delay 함수사용을 위한 헤더파일을 선언한다.
 2) 인터럽트 0 서비스 루틴을 선언한다. 
 3) 포트D의 0번비트를 입력, 포트E를 출력으로 선언
 4) 인터럽트 0을 상승엣지에서 동작하도록 설정한다.
 5) 모든 인터럽트를 허용하는 함수
 6) 100ms마다 LED가 좌측으로 쉬프트되면서 켜진다. Time_Stop이 0인경우에만 계속 쉬프트하고 1일경우 쉬프트를멈추게된다.
 7) 인터럽트를 멈추고 Time_STOP이 0일때는 1로 1일땐 0으로 값을 변경해준뒤 인터럽트를 다시 허용시킨다.
  _delay_us()함수는 104 us 까지 , _delay_ms()함수는 35 ms 까지 지원한다.
********************************************************************/
 
// 1)
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
unsigned char Time_STOP = 0;
// 2)
SIGNAL(SIG_INTERRUPT0);
int main(){
 unsigned  char LED_Data = 0x01,i; 
// 3)
 DDRD = 0xFE;   
  DDRE = 0xFF;  
// 4)
 EICRA = 0x0F;  
 EICRB = 0x00
 EIMSK = 0x01;  
 EIFR = 0x01
// 5)
 sei();
 while(1){
// 6)
     PORTE = LED_Data;
  if(Time_STOP == 0) {
    if(LED_Data == 0x80) { LED_Data = 0x01; }
    else { LED_Data <<= 1; }
  }
 
 for(i=0;i<10;i++)
     _delay_ms(100);  
 
 }
 return 0
}
// 7)
SIGNAL(SIG_INTERRUPT0){      
 cli();
 if(Time_STOP == 0)
 Time_STOP = 1;
 else
 Time_STOP = 0;
 sei();
}
cs


'프로그래밍 > ATMega128' 카테고리의 다른 글

(ATmega128) 타이머로 LED 켜기  (0) 2016.07.10
(ATMega128) PWM 사용하기  (0) 2016.07.10
(ATMega128) FND값 올리기  (0) 2016.07.10
(ATMega128) Switch 누른데로 LED켜기  (0) 2016.07.10
(ATMega128) LED 켜기  (0) 2016.07.10

+ Recent posts