1. 마이크로 컨트롤러의 정의

 - 마이크로 프로세서 : 프로세서를 하나의 칩안에 집적하여 넣어 소형화한 형태

 - 마이크로컨트롤러(MCU: Micro Controller Unit) : 지능화와 소형화를 위하여 마이크로 프로세서에 메모리와 각종

  주변장치들을 함께 집적하여 넣은 

2. AVR 마이크로 컨트롤러 개요

 - 1997 처음 발표한 8비트 제어용 마이크로프로세서로서 RICS 기술을 기반으로 만들어 

 - 대부분의 명령이 단일 클럭으로 실행되어 동작 속도를 혁신적으로 개선

 - 임베디드 환경에 적합한 저전력 소모의 

 - AVR 데이터 메모리와 프로그램 메모리가 분리된 하버드 아키텍처를 따름 CPU 데이터 처리 속도를 높일  있음

 -  내에 프로그램 코드용으로 플래시 메모리를 내장하고사용자가 프로그램을 쉽게 다운로드   있는 isp 방식 적용

 - 많은 장점 때문에 상대적으로 늦게 출시되었음에도 불구하고 8051이나 PIC 능가하는 인기를 단시간 내에 얻게 되었음

3. AVR 마이크로 컨트롤러 특징

 - 하버드 아키텍쳐 : 명령어와 데이터 통로를 저장공간과 물리적으로 분리한 컴퓨터 아키텍처를 말함.

   CPU 없는 병렬식 컴퓨터 구조데이터와 명령어가 다른 버스를 사용

   - 장점 : 명령어를 읽을  데이터를 읽거나   있어 성능이 뛰어나다

   - 단점 : 버스 시스템이 복잡하여 설계가 복잡하다

 - 폰노이만 아키텍쳐 : 데이터는 메모리에서 읽거나 메모리에 쓰기도 하는 방면에 명령어는 메모리에서 읽기만 하는 구조

   CPU 중심의 컴퓨터데이터와 명령어가 같은 버스를 공유

   - 장점 : 범용성이 좋고 여러 목적으로 이용이 가능하기 때문에 현재 컴퓨터에 많이 사용된다

   - 단점 : 명령어를 읽을  데이터를 읽거나   없다

4. ATMega128 리셋 모드

 - Power-on Reset : 전원전압 VCC 전압 레벨에 따른 리셋

 - External Reset : /RESET 핀에 의한 외부 리셋

 - Watchdog Reset : 워치독 타이머에 의한 리셋

 - Brown-out Reset : Brown-out Detector 의한 리셋

 - JTAG AVR Reset : JTAG 시스템에 의한 리셋

5. 마이크로 컨트롤러와 GPIO

 - GPIO(General Purpose Input Output)

   - 개념 : 범용으로 사용되는 입출력 포트설계자가 마음대로 변형하면서 제어할  있도록 제공해 주는 I/O(입출력포트

   - 개요 : 

      - 입력과 출력을 마음대로 선택할  있고, 0 1 출력 신호를 임의로 만들어줄  있는 구조를 가짐

      - 입력으로 사용할 때는 외부 인터럽트를 처리할  있도록 하는 경우가 많음

      - 입출력 방향 전환용 레지스터와 출력용/입력용 데이터 레지스터 등이 필요

      - 마이크로 컨트롤러에서는 대부분의 핀들을 GPIO 설정하는 경우가 많음

6. DDRx 레지스터

 -  입출력의 방향설정을 하기 위한 레지스터.

 - DDRA~DDRG레지스터의 해당 비트에 ‘1 쓰면 출력, ‘0’ 쓰면 입력으로 설정. 0xFF : 출력  0x00 : 입력

7. PORTx 레지스터

 -  데이터를 출력하기 위한 레지스터이다

 -  출력을 원하는 데이터값을 PORTx 레지스터에 넣어주면 된다

8. PINx 레지스터

 -  데이터 입력용 레지스터이다

 -  PINx 레지스터에 해당하는 값을 읽으면 해당 핀의 값이 읽어진다.


3-1 LED

// 1)

#include<avr/io.h>

#include<util/delay.h>

int main(){

 char i;

 unsigned char LED_Data=0x0;

// 2)

 DDRE = 0xFF;

// 3)               

 while(1){

  PORTE = LED_Data;

  LED_Data++;

  for(i=0;i<100;i++)

   _delay_ms(10); //ms단위의 딜레이함수

 }         

 return 0;

}

1) AVR 입출력에 대한 헤더 파일과 delay 함수사용을 위한 헤더파일을 선언한다.

2) 포트 출력포트로 설정한다.

3) 포트E 변수 LED_Data 있는 데이타를 출력한다그리고 값을 1 더해주며, 1 딜레이를 가진 다음 루프를

   반복한다. _delay_us()함수는 104 us 까지 , _delay_ms()함수는 35ms 까지 지원한다.

3-2 switch

// 1)

#include<avr/io.h>

int main(){

// 2)

 DDRE = 0xFF;

 DDRB = 0x00;

// 3)

while(1){

 PORTE = PINB;

 }

 return 0;

}

 1) AVR 입출력에 대한 헤더 파일을 선언한다.

 2) 포트 출력포트로 설정한다포트 입력포트로 설정한다.

 3) 포트B 연결된 버튼의 값이 포트E LED 출력되고루프를 반복한다.

3-3 FND

// 1)

#include<avr/io.h>

#include<util/delay.h>

int main(){

// 2)

 unsigned char FND_DATA_TBL[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7C,0X07,0X7F,0X67,0X77,0X7C,0X39,0X5E,0X79,0X71,0X08,0X80};

 unsigned char cnt=0 , i ;

// 3)

 DDRD = 0xFF; 

// 4)

 while(1){

  PORTD = FND_DATA_TBL[cnt];

  cnt++;

  if(cnt>17) cnt=0;  //테이블 크기를 초과하는 경우 방지.

  for(i=0;i<50;i++)

   _delay_ms(10);

 }

 return 0;

}

1) AVR 입에 대한 헤더 파일과 delay 함수사용을 위한 헤더파일을 선언한다.

 

2) 0~9, A~F 그리고 ,밑줄  FND 맞추어 정리해둔 테이블을 선언한다.

3) 포트 출력포트로 설정한다.

4) 포트D FND_DATA_TBL배열에 저장된 값을 500ms 단위로 하나씩 출력한다.

  _delay_us()함수는 104 us 까지 , _delay_ms()함수는 35 ms 까지 지원한다.

5-1 interrupt_led

#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(10);  

                }

                return 0;

}

SIGNAL(SIG_INTERRUPT0){     

                cli();

                if(Time_STOP == 0)

                Time_STOP = 1;

                else

                Time_STOP = 0;

                sei();

 

}

 

1) AVR 입출력에 대한 헤더 파일과 인터럽트를 사용하기 위한 헤더delay 함수사용을 위한 헤더파일을 선언한다.

2) 인터럽트 서비스 루틴을 선언한다인터럽트 0

3) 포트 PD0 입력포트로 설정한다포트E 출력으로 선언한다.

4) 인터럽트 0 상승엣지에서 동작하도록 설정한다.

5) 모든 인터럽트를 허용하는 함수.

6) 100ms마다 LED 좌측으로 쉬프트되면서 켜진다. Time_Stop 0인경우에만 계속 쉬프트된다. Time_Stop 1 되면

   LED_Data 변하지 않게 되고, LED 멈춘다.

7) 한번 누르면 스톱한번더 누르면 재개한다. cli() 함수는 전체인터럽트 금지하는 함수이다인터럽트중에 인터럽트발생을 방지하기 위한 처리이다처리가 모두 끝나면 sei()함수로 인터럽트를 다시 허용한다.

5-2 Interrupt_stopwatch

// 1)

#include<avr/io.h>

#include<avr/interrupt.h>

#include<util/delay.h>

 

unsigned char time_10ms=0,time_100ms=0,time_1s=0,time_10s=0;

 

char Time_STOP = 1;

// 2)

SIGNAL(SIG_INTERRUPT0);

SIGNAL(SIG_INTERRUPT1);

 

int main(){

 unsigned char FND_DATA_TBL[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7C,0X07,0X7F,0X67,0X77,0X7C,

                                                                  0X39,0X5E,0X79,0X71,0X08,0X80};

// 3)

 DDRD = 0xFC;

 DDRG = 0x0F;

 DDRE = 0xFF;

// 4)

 EICRA = 0x0F;

 EICRB = 0x00;

 EIMSK = 0x03;

 

// 5)

 sei();

 Time_STOP = 1;

 while(1){

// 6) 

  PORTG = 0x07;                                                  // C3 선택한다

  PORTE = FND_DATA_TBL[time_10ms];  //FND_DATA_TBL배열에서 time_10ms만큼의 FND데이타를 출력한다.

  _delay_ms(2);                                                  //잔상을 남게하기 위한 딜레이

 

  PORTG = 0x0B;

  PORTE = FND_DATA_TBL[time_100ms];

  _delay_ms(2);

 

  PORTG = 0x0D;

  PORTE = FND_DATA_TBL[time_1s]|0x80;

  _delay_ms(3);

 

  PORTG = 0x0E;

  PORTE = FND_DATA_TBL[time_10s];

  _delay_ms(3);

 

  if(Time_STOP==1) continue;                  //인터럽트에 의한 Stop/Resume 처리 

  //여기까기 사용된 딜레이 함수가  10ms이므로 time_10ms 10ms마다 증가된다.

 

  time_10ms++;

 

  if(time_10ms == 10){

   time_10ms = 0;

   time_100ms++ ;

  }

  if(time_100ms == 10){

   time_100ms = 0;

   time_1s++ ;

  }

  if(time_1s == 10){

   time_1s = 0;

   time_10s++ ;

  }

  if(time_10s == 10){

   time_10s = 0;

  }

 }

 return 0;

}

// 7)

SIGNAL(SIG_INTERRUPT0){ // Stop/Resume 처리

 cli();

  if(Time_STOP==0)

   Time_STOP=1;

  else

   Time_STOP=0;

 sei();

}

// 8)

SIGNAL(SIG_INTERRUPT1){ //리셋

  cli();

  time_10ms=0;

  time_100ms=0;

  time_1s=0;

  time_10s=0;

  sei();

}

 1) AVR 입출력에 대한 헤더 파일과 인터럽트  사용하기 위한 헤더delay 함수사용을 위한 헤더파일을 선언한다.

 2) 인터럽트 서비스 루틴을 선언한다인터럽트 0,1

 3) 포트 PD0, PD1 입력포트로 설정한다포트E,포트G 출력으로 선언한다.

 4) 인터럽트 0,1 상승엣지에서 동작하도록 설정한다.

 5) 모든 인터럽트를 허용하는 함수.

 6) 10ms단위부터 10초단위까지의 스톱워치가 동작하면서 인터럽트에 의해 리셋스톱을 FND 출력한다.

 7) 한번 누르면 스톱한번더 누르면 재개한다. cli() 함수는 전체인터럽트 금지하는 함수이다인터럽트중에 인터럽트발생을

   방지하기 위한 처리이다처리가 모두 끝나면 sei()함수로 인터럽트를 다시 허용한다.

 8) 시간을 리셋한다.

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
64
65
66
67
68
69
/********************************************************************
 파일명 : UART_Echo.c
 
 동작  
 PC에서 보내는 데이타를 그대로 MCU에서 돌려보낸다.
 포트연결
 UART모듈의 RX에는 PE0를 TX에는 PE1를 연결한뒤 UART모듈을 컴퓨터 포트에 연결한다.
 소스 설명
 1) UART0로 한 문자를 전송한다.
 2) UART0로 한 문자를 받아온다.
 3) 출력할 문자열을 선언한다.
 4) UART0 통신을 선언한다.
 송수신 사용선언,No parity bit, 1 Stop bit, 115200bps
 5) 문자열의 끝을 의미하는 '\0' 가 올때까지 한문자씩 전송한다.
 6) 한문자씩 받아와서 다시 전송한다. 이때 '1'일 경우 특정 문자열을 출력한다.
********************************************************************/
#include<avr/io.h>
//1)
void putch(unsigned char data)
{
 while((UCSR0A & 0x20== 0);  //전송준비가 될때까지 대기 
 UDR0 = data;
 UCSR0A |= 0x20;      //UCSR0A 레지스터 중에서 5번째 비트(UDREn)를 세트하여 UDRE0를 클리어 함.
}
//2)
unsigned char getch()
{
 unsigned char data;
 while((UCSR0A & 0x80== 0);        //데이터를 받을 때까지 대기 
 data = UDR0;
 UCSR0A |= 0x80;      //UCSR0A 레지스터 중에서 7번째 비트를 세트하여 RXC0를 클리어 함.
 return data;
}
int main()
{
//3)
 unsigned char text[] = "\r\nWelcome! HONGGI TESTER!!!!!\r\n";
 unsigned char echo[]="ECHO >> ";
 unsigned char text1[]="blog.naver.com/ghdrl95 신홍기\n";
 unsigned char i=0;
//4)
 DDRE=0XFE;       //Rx(입력 0),Tx(출력,1)
 UCSR0A=0X00;
 UCSR0B=0X18;      //Rx, Tx enable
 UCSR0C=0X06;      //비동기 방식, No Parity bit, 1 Stop bit
 UBRR0H=0X00;
 UBRR0L=0X03;      //7.3728 MHz 에서 115200bps
//5)     
 while(text[i]!='\0')
  putch(text[i++]);
 i=0;
 while(echo[i]!='\0')
  putch(echo[i++]);
//6)
 while(1){
  unsigned char data=getch();
  if(data=='1')
  {
   i=0;
   while(text1[i]!='\0')
    putch(text1[i++]);
  }
  else
  {
   putch(data);
  }
 }
 return 0;
}
cs



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
/********************************************************************
 파일명 : Timer_led.c
 
 동 작 : 
 타이머0을 이용하여 LED를 1초간격으로 킨다.
       
 포트연결 :
1) 포트E 8핀을 LED에 연결
 
 소스 설명 :
 1) AVR 입출력에 대한 헤더 파일과 인터럽트를 사용하기 위한 헤더를 선언한다.
 2) 타이머 0 오버플로우 인터럽트 서비스 루틴을 선언한다.
 3) LED 모듈에 데이터를 보내기 위해 PORT E를 출력으로 설정한다.
 4) 타이머0 에 대해 1024분주, Normal모드로 설정한다. TCNT0은 내부클럭/분주기의 역수 * TCNT가카운트하는 수 = 인터럽트에 걸리는 시간
 5) 전체 인터럽트를 허용하는 함수
 6) LED_DATA를 PortE로 보내 LED를 킨다.
 7) 타이머0이 오버플로우가 발생되면 호출되는 함수로 TCNT0을 0으로 초기화하지않고 지정한값으로 초기화하고 time0Cnt 변수를 사용함으로 써 더 긴시간을 잴 수 있다.
********************************************************************/
// 1)
#include<avr/io.h>
#include<avr/interrupt.h>
 
 
unsigned char LED_Data = 0x00;
unsigned cchar timer0Cnt=0;
// 2)
SIGNAL(SIG_OVERFLOW0);  //Timper0 Overflow0 ISP
 
 
int main(){
// 3)
    DDRE = 0xFF;  //PORTE를 모두 출력으로 사용
// 4)
    TCCR0 = 0x07;//0000 0111 Timer/Count0을 1024분주기, Normal Mode로 설정
    TCNT0 = 0xff - 72; (1/ (내부 클럭 7.3728 Mhz / 분주기1024 prescaler)) * 72 => 0.01 s
    TIMSK |= 1 << TOIE0;     // 오버플로우 인터럽트 허용
    TIFR |= 1 << TOV0;    //TOV0 Timer/Counter0 overflow flag 클리어
// 5)
    sei();
// 6)
    while(1){
        PORTE = LED_DATA;
    }
    return 0;
}
// 7)
SIGNAL(SIG_OVERFLOW0)
{
    cli();
    TCNT0=0xff-72;    //0으로 초기화되는것이 아닌 0xff-72로 초기화
    timer0Cnt++;
    if(timer0Cnt == 100) {  //0.01s * 100 = 1s
        LED_Data++;
        timer0Cnt = 0;
    }
}
cs


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

(ATMega128) 정리  (0) 2016.07.10
(ATMega128) PC와의 UART통신  (0) 2016.07.10
(ATMega128) PWM 사용하기  (0) 2016.07.10
(ATMega128) 인터럽트를 이용한 LED동작 멈춤/재생  (0) 2016.07.10
(ATMega128) FND값 올리기  (0) 2016.07.10
사용한 툴 : avr studio 4

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
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
 
int main()
{
    unsigned char Light = 0 ;
    DDRB=0x10;
    TCCR0=0x71;
    TCNT0=0;
    while(1)
    {
        for(Light=0;Light<255;Light++)
        {
            OCR0=Light;
            _delay_ms(10);
        }
        for(Light=255;Light>0;Light--)
        {
            OCR0=Light;
            _delay_ms(10);
        }
    }
    return 0;
}
 
cs

8 PWM 출력값을 받기위해 PORTB의 4번핀을 출력으로 사용

9 TCCR : 7번비트 부터 0번비트까지  FOC, WGM0, COM1, COM0, WGM1, CS2, CS1, CS0 을 설정 할 수 있는데 CS는 분주기 WGM은 모드를 설정 하는 것이다.

8비트 타이머(0,2)의 설정

 WGM1

WGM0 

 Mode Name

설명 

 0

 0

 Normal mode

 TCNT값을 조정하여 TCNT가 255일때 인터럽트가 발생

 0

 1

CTC mode 

 TCNT가 특정 값에 도달하면 인터럽트 발생

 1

 0

 Fast PWM mode

 특정 값, 255일때 인터럽트 발생

 1

 1

 PC PWM mode

 0->255 업카운팅 255->0 다운카운팅 COM1,0에 따라 OCR가 업카운팅 or 다운카운팅일때 값이 일치하면 인터럽트

 

따라서 지금은 PC PWM mode를 사용하고 있으며 COM1,0도 1 1 이여서 업카운팅일때 인터럽트가 발생한다.


10 카운트 되는 것을 0으로 초기화

15,20 OCR의 값을 변경함에 따라 PWM값을 조정한다.

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
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
/********************************************************************
 파일명 : FND.c
 
 동 작 : 
  프로그램이 시작하면 500ms 마다 FND 에 0부터 9 , A ~ F 그리고 '.', '_'을
  순차적으로 출력한다.
       
 포트연결 :
 포트D 0 ~ 7 을 8핀 케이블로 FND 모듈의 SA_A ~ SA_H 에 연결한다.
 PD0 ~ PD7 -> SA_A ~ SA_H
 소스 설명 :
 1) AVR 입출력에 대한 헤더 파일과 delay 함수사용을 위한 헤더파일을 선언한다.
 2) 0~9, A~F 그리고 점,밑줄 을 FND에 맞추어 정리해둔 테이블을 선언한다. 
 3) 포트D 를 출력포트로 설정한다.
 3) 포트D에 FND_DATA_TBL배열에 저장된 값을 500ms 단위로 하나씩 출력한다.
 
  _delay_us()함수는 104 us 까지 , _delay_ms()함수는 35 ms 까지 지원한다.
********************************************************************/
// 1)
#include<avr/io.h>
#include<util/delay.h>
int main(){
// 2) 
 unsigned char FND_DATA_TBL[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7C,0X07,0X7F,0X67,0X77,0X7C,0X39,0X5E,0X79,0X71,0X08,0X80};
 unsigned char cnt=0 , i ;
// 3) 
 DDRD = 0xFF
// 4) 
 while(1){
 
  PORTD = FND_DATA_TBL[cnt];
 
  cnt++;
  if(cnt>17) cnt=0//테이블 크기를 초과하는 경우 방지.
 
  for(i=0;i<50;i++)
   _delay_ms(10);
 }
 
 return 0
}
cs


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
/********************************************************************
 파일명 : switch.c
  동 작 : 
   Switch모듈의 눌러진 버튼과 같은 LED의 불이 점등한다.
 포트연결 :
    1) 포트B의 PB0 ~PB7 을 8핀 케이블로 Switch모듈의 BT0~7에 연결한다.
      PB0 ~ PB7 -> BT0 ~ 7
    2) 포트E의 8핀을 8핀 케이블로 LED 모듈의 LED 0 ~ 7까지 연결한다. 
      PE0 ~ 7 -> LED0 ~ 7
 소스 설명 :
 1) AVR 입출력에 대한 헤더 파일을 선언한다.
 2) 포트E 를 출력포트로 설정한다.(LED8개와 연결)
     포트B 를 입력포트로 설정한다.(스위치8개와 연결)
 3) 포트B에 연결된 버튼의 값이 포트E의 LED로 출력되고, 
  루프를 반복한다.
********************************************************************/
// 1)
#include<avr/io.h>
int main(){
// 2) 
 DDRE = 0xFF
 DDRB = 0x00;
// 3) 
while(1){
 PORTE = PINB;
 }
 return 0;
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<avr/io.h>
#include<util/delay.h>
int main(){
 char i;
// 1)
 unsigned char LED_Data=0x00;
// 2) 
 DDRE = 0xFF;
 
// 3)  
 while(1){
  
  PORTE = LED_Data;
  
  LED_Data++;
  
  for(i=0;i<100;i++)
   _delay_ms(10); //ms단위의 딜레이함수
 }
 return 0;
 }
cs

1) LED값을 저장하는 변수

2) E포트 모두를 출력으로 설정 (E포트와 LED를 연결해놓아야함)

3) 무한반복을 통해 PORTE에 LED_Data값을 넣고 LED_Data를 하나 증가시킨뒤 _delay_ms를 통해 딜레이를 준다.

    _delay_ms의 매개변수는 35까지밖에 지원하지 않아 for문을 통해 딜레이를 늘리는 방법을 써야한다.

+ Recent posts