본문 바로가기
MCU/AVR

AVR128DB48 GPIO 사용 방법 및 예제 코드

by linuxgo 2025. 8. 18.

1. AVR128DB48 GPIO 모듈 개요

Microchip의 AVR128DB48은 AVR DB 시리즈의 8비트 마이크로컨트롤러로, 저전력 애플리케이션, 센서 인터페이스, LED 제어, 모터 제어 등 다양한 GPIO(General Purpose Input/Output) 애플리케이션에 적합합니다. GPIO 모듈은 유연한 입출력 설정, 풀업 저항, 인터럽트, 그리고 주변 장치 멀티플렉싱 기능을 제공합니다. 이 문서에서는 AVR128DB48의 GPIO 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.

주요 사양

  • 포트 : PORTA, PORTB, PORTC, PORTD, PORTE, PORTF (최대 48개의 GPIO 핀)
  • 핀당 기능 :
    •   디지털 입출력
    •   풀업 저항 설정
    •   인터럽트 (상승/하강/양방향 에지, 저레벨)
    •   멀티플렉스드 주변 장치 (UART, SPI, TWI 등)

AVR128DB48 Port block diagram

  • 클럭 소스 : 시스템 클럭 (최대 24MHz, OSCHF 내부 오실레이터)
  • 인터럽트 : 각 포트별 인터럽트 지원 (PORTx_INT)
  • 주요 레지스터 :
    •   DIR: 입출력 방향 설정
    •   OUT: 출력 데이터 설정
    •   IN: 입력 데이터 읽기
    •   PINxCTRL: 핀별 제어 (풀업, 인터럽트, 반전)
    •   PORTCTRL: 슬루율 제한
  • 전력 관리 : 저전력 모드에서 GPIO 동작 지원
  • 전압 레벨 : 1.8V~5.5V 동작 지원

2. GPIO Bitfield 설정 상세

AVR128DB48의 GPIO 레지스터는 Bitfield 구조로 정의되어 있으며, <avr/io.h> 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:

2.1 DIR (방향 레지스터)

  • bit[7:0]: 핀 방향 설정 (0: 입력, 1: 출력)
  • 예: PORTA.DIRSET = PIN0_bm (PA0 출력 설정)

2.2 OUT (출력 데이터 레지스터)

  • bit[7:0]: 출력 값 설정 (0: Low, 1: High)
  • 예: PORTA.OUTSET = PIN0_bm (PA0 High 출력)

2.3 IN (입력 데이터 레지스터)

  • bit[7:0]: 입력 값 읽기 (0: Low, 1: High)
  • 예: PORTB.IN & PIN0_bm (PB0 입력 상태 확인)

2.4 PINxCTRL (핀 제어 레지스터, x=0~7)

  • bit.ISC[1:0]: 인터럽트 감지 설정 (2비트 필드)
    • 0x00: 비활성화
    • 0x01: 상승 에지
    • 0x02: 하강 에지
    • 0x03: 양방향 에지
    • 0x04: 저레벨
    • 0x05: 하이 레벨
  • bit.PULLUPEN: 풀업 저항 활성화 (1: 활성화)
  • bit.INVEN: 출력 반전(Inverted Output) (1: 반전)

2.5 PORTCTRL (포트 제어 레지스터)

  • bit.SRL: 슬루율 제한 활성화 (1: 활성화, 전력 소모 감소)

3. GPIO 설정 절차

  • 시스템 초기화:
    •   set_system_clock()로 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
    •   (인터럽트 비활성화는 GPIO 설정에 불필요, 인터럽트 사용 시에만 cli()/sei() 고려)
  • 포트 클럭 활성화:
    •   AVR128DB48에서는 포트 클럭은 기본적으로 활성화되어 별도 설정 불필요
  • 방향 설정:
    •   PORTx.DIRSET 또는 PORTx.DIRCLR로 입출력 방향 설정
  • 출력 설정:
    •   PORTx.OUTSET 또는 PORTx.OUTCLR로 출력 값 설정
  • 입력 설정:
    •   PORTx.PINxCTRL |= PORT_PULLUPEN_bm으로 풀업 저항 설정
  • 인터럽트 설정 (필요 시):
    •   PORTx.PINxCTRL |= PORT_ISC_FALLING_gc 등으로 인터럽트 조건 설정
    •   PORTx.INTFLAGS로 인터럽트 플래그 확인
  • 포트 실행:
    •   설정 후 즉시 동작 (별도 활성화 불필요)

4. GPIO 설정 고려사항

  • 클럭 설정 : 시스템 클럭(24MHz) 및 XOSC32K 안정화 확인
  • 풀업 저항 : 입력 핀에서 노이즈 방지용 권장
  • 인터럽트 : 다중 핀 인터럽트 시 우선순위 주의
  • 저전력 : 슬루율 제한(PORTCTRL.SRLEN)으로 전력 소모 감소
  • 멀티플렉싱 : GPIO 핀을 다른 주변 장치(UART, SPI 등)로 사용할 경우 충돌 주의

5. 실용적인 GPIO 예제 코드 (Bitfield 구조)

아래는 AVR128DB48 GPIO를 Bitfield 구조로 설정한 5개의 예제 코드입니다. 각 예제는 Atmel Studio 또는 MPLAB X IDE와 AVR-GCC 환경에서 실행 가능합니다. 

5.1 예제 1: 기본 GPIO 출력 (LED 제어)

#ifndef F_CPU
#define F_CPU 24000000UL  // 시스템 클록 주파수 (24 MHz, delay.h용)
#endif

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);

    // XOSC32K 안정화 대기 (타임아웃 약 1초)
    uint32_t timeout = 24000000UL;
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm) && timeout--) {
        ;
    }
    if (timeout == 0) {
        // 타임아웃 발생 시 기본 클록으로 폴백 (디버깅용)
        return;
    }

    // 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);

    // 시스템 클록 소스를 OSCHF로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);

    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);

    // 시스템 클록 안정화 대기 (타임아웃 약 1초)
    timeout = 24000000UL;
    while ((CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) && timeout--) {
        ;
    }
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano LED0)
    PORTB.OUTCLR = PIN3_bm; // PB3 초기값 Low (LED 켜짐, Active-Low)
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    gpio_init();        // GPIO 초기화

    while (1) {
        PORTB.OUTTGL = PIN3_bm; // LED 토글 (켜짐/꺼짐)
        _delay_ms(500);         // 500ms 지연
    }

    return 0; // 도달하지 않음
}

설명:

  • 기능 : PB3에 연결된 LED를 500ms 간격으로 점멸
  • 설정 : PB3 출력 설정, 초기 High, 토글로 점멸
  • 출력 : PB3에 LED 점멸 출력

5.2 예제 2: GPIO 입력 (버튼 읽기)

#ifndef F_CPU
#define F_CPU 24000000UL  // 시스템 클록 주파수 (24 MHz, delay.h용)
#endif

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);

    // XOSC32K 안정화 대기 (타임아웃 약 1초)
    uint32_t timeout = 24000000UL;
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm) && timeout--) {
        ;
    }
    if (timeout == 0) {
        return; // 타임아웃 시 기본 클록으로 폴백 (디버깅용)
    }

    // 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);

    // 시스템 클록 소스를 OSCHF로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);

    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);

    // 시스템 클록 안정화 대기 (타임아웃 약 1초)
    timeout = 24000000UL;
    while ((CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) && timeout--) {
        ;
    }
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로, PB0(SW0)를 입력으로 설정
    PORTB.DIRSET = PIN3_bm;          // PB3 출력 (Curiosity Nano LED0)
    PORTB.DIRCLR = PIN0_bm;          // PB0 입력 (Curiosity Nano SW0)
    PORTB.PIN0CTRL |= PORT_PULLUPEN_bm; // PB0 풀업 저항 활성화
    PORTB.OUTSET = PIN3_bm;          // PB3 초기값 High (LED 꺼짐, Active-Low)
}

uint8_t read_button(void) {
    // 버튼 상태를 3번 샘플링하여 디바운싱
    uint8_t samples = 3;
    uint8_t pressed = 0;
    for (uint8_t i = 0; i < samples; i++) {
        if (!(PORTB.IN & PIN0_bm)) { // PB0 Low (버튼 눌림)
            pressed++;
        }
        _delay_ms(5); // 샘플 간 5ms 대기
    }
    return (pressed >= samples / 2); // 다수결로 버튼 상태 결정
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    gpio_init();        // GPIO 초기화

    while (1) {
        if (read_button()) {          // 버튼 눌림
            PORTB.OUTCLR = PIN3_bm;   // PB3 Low (LED 켜짐, Active-Low)
        } else {
            PORTB.OUTSET = PIN3_bm;   // PB3 High (LED 꺼짐)
        }
    }

    return 0; // 도달하지 않음
}

설명:

  • 기능 : PB0에 연결된 버튼 입력에 따라 PB3 LED 제어
  • 설정 : PB3 출력, PB0 입력(풀업 저항), 버튼 Low 감지
  • 출력 : 버튼 누름 시 LED ON, 놓을 시 LED OFF

5.3 예제 3: GPIO 인터럽트 (버튼 트리거)

#ifndef F_CPU
#define F_CPU 24000000UL  // 시스템 클록 주파수 (24 MHz, delay.h용)
#endif

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <avr/interrupt.h> // 인터럽트 처리 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);

    // XOSC32K 안정화 대기 (타임아웃 약 1초)
    uint32_t timeout = 24000000UL;
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm) && timeout--) {
        ;
    }
    if (timeout == 0) {
        return; // 타임아웃 시 기본 클록으로 폴백
    }

    // 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);

    // 시스템 클록 소스를 OSCHF로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);

    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);

    // 시스템 클록 안정화 대기 (타임아웃 약 1초)
    timeout = 24000000UL;
    while ((CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) && timeout--) {
        ;
    }
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로, PB0(SW0)를 입력으로 설정
    PORTB.DIRSET = PIN3_bm;          // PB3 출력 (Curiosity Nano LED0)
    PORTB.DIRCLR = PIN0_bm;          // PB0 입력 (Curiosity Nano SW0)
    PORTB.PIN0CTRL |= PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // PB0 풀업, 하강 에지 인터럽트
    PORTB.OUTSET = PIN3_bm;          // PB3 초기값 High (LED 꺼짐, Active-Low)
}

ISR(PORTB_PORT_vect) {
    // 버튼 디바운싱을 위한 지연
    _delay_ms(10);
    
    // 인터럽트 플래그 확인 및 처리
    if (PORTB.INTFLAGS & PIN0_bm) {
        PORTB.OUTTGL = PIN3_bm;      // LED 토글 (Active-Low)
        PORTB.INTFLAGS = PIN0_bm;    // PB0 인터럽트 플래그 클리어
    }
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    gpio_init();        // GPIO 초기화
    sei();              // 글로벌 인터럽트 활성화

    while (1) {
        // 인터럽트로 LED 제어
    }

    return 0; // 도달하지 않음
}

설명:

  • 기능 : PB0 버튼의 에지 변화로 PB3 LED 토글
  • 설정 : PB3 출력, PB0 입력(풀업, 양방향 에지 인터럽트)
  • 출력 : 버튼 누름/놓음 시 LED 상태 토글

5.4 예제 4: 슬루율 제한 (저전력 출력)

// File: gpio_slew_rate.c
// Description: AVR128DB48 GPIO 슬루율 제한 예제 (저전력 LED 제어)
// Compiler: AVR-GCC
// Target: AVR128DB48

#ifndef F_CPU
#define F_CPU 24000000UL  // 시스템 클록 주파수 (24 MHz, delay.h용)
#endif

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);

    // XOSC32K 안정화 대기 (타임아웃 약 1초)
    uint32_t timeout = 24000000UL;
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm) && timeout--) {
        ;
    }
    if (timeout == 0) {
        return; // 타임아웃 시 기본 클록으로 폴백
    }

    // 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);

    // 시스템 클록 소스를 OSCHF로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);

    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);

    // 시스템 클록 안정화 대기 (타임아웃 약 1초)
    timeout = 24000000UL;
    while ((CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) && timeout--) {
        ;
    }
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로 설정, 슬루율 제한 활성화
    PORTB.DIRSET = PIN3_bm;          // PB3 출력 (Curiosity Nano LED0)
    PORTB.PORTCTRL |= PORT_SRL_bm;   // PORTB 전체에 슬루율 제한 활성화 (저전력, EMI 감소)
    PORTB.OUTCLR = PIN3_bm;          // PB3 초기값 Low (LED 켜짐, Active-Low)
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    gpio_init();        // GPIO 초기화

    while (1) {
        PORTB.OUTTGL = PIN3_bm; // LED 토글 (Active-Low)
        _delay_ms(500);         // 500ms 지연
    }

    return 0; // 도달하지 않음
}

설명:

  • 기능 : PB3에 연결된 LED를 500ms 간격으로 점멸, 슬루율 제한 적용
  • 설정 : PB3 출력, 슬루율 제한 활성화, 초기 High
  • 출력 : PB3에 저전력 LED 점멸 출력

5.5 예제 5: 다중 핀 출력 (LED 패턴)

#ifndef F_CPU
#define F_CPU 24000000UL  // 시스템 클록 주파수 (24 MHz, delay.h용)
#endif

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);

    // XOSC32K 안정화 대기 (타임아웃 약 1초)
    uint32_t timeout = 24000000UL;
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm) && timeout--) {
        ;
    }
    if (timeout == 0) {
        return; // 타임아웃 시 기본 클록으로 폴백
    }

    // 내부 OSCHF를 24 MHz로 설정, XOSC32K 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);

    // 시스템 클록 소스를 OSCHF로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);

    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);

    // 시스템 클록 안정화 대기 (타임아웃 약 1초)
    timeout = 24000000UL;
    while ((CLKCTRL.MCLKSTATUS & CLKCTRL_SOSC_bm) && timeout--) {
        ;
    }
}

void gpio_init(void) {
    // PA0, PA1, PA2를 출력으로 설정
    PORTA.DIRSET = PIN0_bm | PIN1_bm | PIN2_bm; // PA0, PA1, PA2 출력
    PORTA.OUTSET = PIN0_bm | PIN1_bm | PIN2_bm; // 초기값 High (LED 꺼짐, Active-Low)
}

int main(void) {
    set_system_clock(); // 시스템 클록 설정
    gpio_init();        // GPIO 초기화

    while (1) {
        // PA0 ON, PA1/PA2 OFF
        PORTA.OUTCLR = PIN0_bm;                // PA0 Low (LED 켜짐)
        PORTA.OUTSET = PIN1_bm | PIN2_bm;      // PA1, PA2 High (LED 꺼짐)
        _delay_ms(500);                        // 500ms 지연

        // PA1 ON, PA0/PA2 OFF
        PORTA.OUTCLR = PIN1_bm;                // PA1 Low (LED 켜짐)
        PORTA.OUTSET = PIN0_bm | PIN2_bm;      // PA0, PA2 High (LED 꺼짐)
        _delay_ms(500);                        // 500ms 지연

        // PA2 ON, PA0/PA1 OFF
        PORTA.OUTCLR = PIN2_bm;                // PA2 Low (LED 켜짐)
        PORTA.OUTSET = PIN0_bm | PIN1_bm;      // PA0, PA1 High (LED 꺼짐)
        _delay_ms(500);                        // 500ms 지연
    }

    return 0; // 도달하지 않음
}

설명:

  • 기능 : PA0, PA1, PA2에 연결된 LED를 순차적으로 점등
  • 설정 : PA0~PA2 출력 설정, 순차적 패턴 출력
  • 출력 : LED가 순차적으로 점등 (500ms 간격)

6. 사용 방법

6.1 환경 설정

  • AVR-GCC 설치 : Atmel Studio 또는 MPLAB X IDE에 AVR-GCC 툴체인 설치
  • 헤더 파일 : <avr/io.h>, <avr/interrupt.h>, <util/delay.h> 포함
  • 프로젝트 설정 : AVR128DB48 타겟으로 프로젝트 생성
  • 클럭 정의 : #define F_CPU 24000000UL로 시스템 클록 설정

6.2 코드 실행

  • 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
  • 다른 예제 코드 주석 처리
  • Atmel Studio/MPLAB X IDE에서 빌드 및 플래싱

6.3 하드웨어 준비

  • LED 출력 : PB3, PA0, PA1, PA2에 LED 및 전류 제한 저항(예: 330Ω) 연결
  • 버튼 입력 : PB0에 버튼 및 풀업/풀다운 저항 연결
  • 디바운싱 : 버튼 입력 시 10ms 이상 대기
  • 전원 : 1.8V~5.5V 전원 공급

6.4 디버깅

  • Atmel Studio/MPLAB X IDE의 디버거 사용
  • PORTx.IN, PORTx.OUT, PORTx.INTFLAGS 레지스터 확인
  • 오실로스코프 또는 로직 분석기로 GPIO 신호 점검

7. 추가 팁

  • 클럭 설정 : set_system_clock()로 XOSC32K 안정화 및 24MHz 설정 확인
  • 노이즈 감소 : 입력 핀에 풀업 저항 사용, 외부 디바운싱 회로 추가
  • Microchip 리소스 : Microchip AVR128DB48 데이터시트, Application Notes (AN), AVR-GCC 예제
  • 문제 해결 :
    •   출력 없음: PORTx.DIRSET 및 PORTx.OUTSET 설정 확인
    •   인터럽트 실패: PORTx.PINxCTRL 및 PORTx.INTFLAGS 확인
    •   버튼 입력 불안정: 디바운싱 처리(소프트웨어/하드웨어) 추가
  • 커뮤니티 : Microchip Community, AVR Freaks 포럼 참고

8. 결론

이 문서는 AVR128DB48 GPIO 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 다양한 애플리케이션에 적용 가능하도록 구성했습니다. 초보자는 기본 LED 제어 예제부터 시작하고, 숙련자는 인터럽트 및 다중 핀 제어를 활용하여 복잡한 시스템을 구현할 수 있습니다.

키워드 : AVR128DB48, GPIO, AVR, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, LED 제어, 버튼 입력, 인터럽트, 풀업 저항, 슬루율 제한, 다중 핀