본문 바로가기
[Intel] 엣지 AI SW 아카데미/펌웨어 프로그래밍 75hour

[Intel] 엣지 AI SW 아카데미 13일차 (부산상공회의소 인력개발원)

by 0x01 2023. 11. 30.

제목: [Intel] 엣지 AI SW 아카데미

부제목: 13일차

일정: 2023.11.13(월)

수업 내용: 
 

 - C언어 프로그래밍

 - Micro Processor 원리 

 - Atmel사의 8bit Micro-controller 

 - KUT0128 Evaluation Board 기능과 특징

 

 - External Interrupt 제어

 

목표: 

 

 External Interrupt 제어

 

Mega128a.h에서 정의된 외부 Interrupt 

 

External Interrupt 사용법 요약

• 사용하고자 하는 External Interrupt enable bit의 set 사용 레지스터 : EMISK

• Trigger 방식 설정(rising or falling or level trigger 중 선택) 사용 레지스터 : EICRA(INT0~INT3, EICRB(INT4~INT7)

• Global(전역) Interrupt enable I bit의 set 사용 레지스터 : SREG (최상위 비트)  가능하면 모든 초기 설정이 끝난 후 제일 마지막에 I bit의 set

• 인터럽트 함수 작성

 

(예제 4-1) External Interrupt 4에 의한 LED 점멸 실험 (falling edge)

• KUT-128_COM 보드의 SW/INT4이 눌려질 때마다 External Interrupt 4가 발생하여, LED가 순차적으로 점멸하도록 프로그램을 작성하라.

• 외부 인터럽트4의 입력 Trigger 는 falling edge 에서 발생하도록 한다.

 

 

//(예제 4-1) External Interrupt 4에 의한 LED 점멸 실험 (falling edge)
//• SW1/INT4이 눌려질 때마다 점멸

#include <mega128.h> 

unsigned char led = 0xFE;

void main(void)
{ 
    // 포트 초기화
    DDRC = 0xFF; // 포트 C 출력 설정
    DDRE = 0b00000010; // 포트 E 입력(PE1 출력)
    PORTC = led; // 포트 C에 초기값 출력
    EIMSK = 0b00010000; // 외부 인터럽트4 enable
    EICRB = 0b00000010; // 외부 인터럽트4 falling edge
    SREG = 0x80; // 전역 인터럽트 enable set
    while(1);
}

// 외부 인터럽트4 서비스 루틴
interrupt [EXT_INT4] void external_int4(void) 
{ 
    SREG &= 0x7F; // All Interrupt disable
    led = led << 1; // 1비트 쉬프트
    led = led | 0b00000001; // LSB bit set
    if(led == 0xFF) led = 0xFE;
    PORTC = led; // 포트 출력
    SREG |= 0x80; // All Interrupt enable
}

 

//(예제 4-2) External Interrupt 4에 의한 LED 점멸 실험 (rising edge)
//• SW1/INT4이 눌렸다 떼어지는 순간 점멸

#include <mega128.h> 

unsigned char led = 0xFE;

void main(void)
{ 
    // 포트 초기화
    DDRC = 0xFF; // 포트 C 출력 설정
    DDRE = 0b00000010; // 포트 E 입력(PE1 출력)
    PORTC = led; // 포트 C에 초기값 출력
    EIMSK = 0b00010000; // 외부 인터럽트4 enable
    EICRB = 0b00000011; // 외부 인터럽트4 rising edge
    SREG = 0x80; // 전역 인터럽트 enable set
    while(1);
}

// 외부 인터럽트4 서비스 루틴
interrupt [EXT_INT4] void external_int4(void) 
{ 
    SREG &= 0x7F; // All Interrupt disable
    led = led << 1; // 1비트 쉬프트
    led = led | 0b00000001; // LSB bit set
    if(led == 0xFF) led = 0xFE;
    PORTC = led; // 포트 출력
    SREG |= 0x80; // All Interrupt enable
}

 

//(예제 4-3) 외부 Interrupt 4에 의한 LED 전자 룰렛 실험[Level trigger : Low level]
//• SW/INT4이 눌려지고 있는 동안 점멸

#include <mega128.h> 

#include <delay.h> 

unsigned char led = 0xFE;

void main(void)
{ 
    // 포트 초기화
    DDRC = 0xFF; // 포트 C 출력 설정
    DDRE = 0b00000010; // 포트 E 입력(PE1 출력)
    PORTC = led; // 포트 C에 초기값 출력
    EIMSK = 0b00010000; // 외부 인터럽트4 enable
    EICRB = 0b00000000; // 외부 인터럽트4 level trigger
    SREG = 0x80; // 전역 인터럽트 enable-bit set
    while(1);
}

// 외부 인터럽트4 서비스 루틴
interrupt [EXT_INT4] void external_int4(void) 
{ 
    SREG &= 0x7F; // All Interrupt disable
    led = led << 1; // 1비트 쉬프트
    led = led | 0b00000001; // LSB bit set
    if(led == 0xFF) led = 0xFE;
    PORTC = led; // 포트 출력
    delay_ms(500);
    SREG |= 0x80; // All Interrupt enable
}