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

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

by 0x01 2023. 11. 17.

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

부제목: 9일차

일정: 2023.11.08(수)

수업 내용: 
 

 - C언어 프로그래밍

 - Micro Processor 원리 

 - Atmel사의 8bit Micro-controller 

 - KUT0128 Evaluation Board 기능과 특징

 

 - IO Port 제어

 

목표: 

 

  스위치 상태에 따른 값의 변화를 코드로 나타낼 수 있다.

 

off -> on, falling edge (1 => 0)

on -> off, rising edge (0 => 1)

 

예제) 스위치 OFF  ON 될 때마다 LED 순차 점멸하기

 

#include <mega128.h>

void main(void)
{
    unsigned char old_sw, new_sw;
    unsigned char led = 0xFE;
    
    DDRC = 0xFF; // 포트C 출력 설정
    DDRE = 0x00; // 포트E 입력 설정
    PORTC = led; // 포트C.0=0 led on 초기값 출력
    
    old_sw = PINE & 0b00010000; // PE4 SW1 상태값 추출
    
    while(1){
        
        new_sw = PINE & 0b00010000;
        
        if((old_sw != 0) && (new_sw == 0)){ // OFF(1) -> ON(0) 되는 순간 체크
        	led = (led << 1) | 0x01; // 1비트 쉬프트, 0비트 1로 채움
        
        if(led == 0xFF) led = 0xFE; // LED 모두 off상태이면 초기값 재설정
        	PORTC = led;
        } 
        old_sw = new_sw; // 이전상태 <- 현재상태
    }
}


7-Segment 구동회로

7-Segment : FND(Flexible Numeric Display)

FND(Flexible Numeric Display) : 숫자 표시용 소자

 – 7개의 세그먼트(a, b, c, d, e, f, g)와 도트(p)로 구성

  • 각각의 세그먼트는 LED로 구성

  • CC(Common Cathode)형 : (−)극이 공통(common)

  • CA(Common Anode)형 : (+)극이 공통(anode)

 

 

 7-Segment 구동회로

 

 

예제) 각 Segment를 1개씩 점멸하기

#include <mega128.h>
#include <delay.h>

void main(void)
{ 
    char i, value;
    
    DDRB = 0xF0; // PORTB 4,5,6,7 비트 출력 설정
    DDRD = 0xF0; // PORTD 4,5,6,7 비트 출력 설정
    DDRG = 0x0F; // PORTG 0,1,2,3 비트 출력 설정
    
    PORTG = 0b00001000; // 맨 우측 7-Segment DIG4 ON (PORTG3=1)
    PORTB = 0x00; // 초기값 PORTB 4,5,6,7 출력 0
    PORTD = 0x00; // 초기값 PORTD 4,5,6,7 출력 0
    
    while(1){ 
        PORTD = 0b00010000;
        delay_ms(500);
        PORTD = 0b00000000;
    }
}

 

 예제) 7-Segment 구동연습 2

#include <mega128.h>
#include <delay.h>

const unsigned char seg_pat[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
									0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

void main(void) { 

    int i;

    DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
    DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
    DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정

    PORTG = 0b00001000; // 맨 우측 7-Segment DIG4 ON(PG3=1)
    PORTB = 0x00; // E, F, G, DP off (초기값)
    PORTD = 0x00; // A, B, C, D off (초기값)

    while(1){ // 16진수 순차 표시
        for(i = 0; i < 16; i++){
            PORTD = ((seg_pat[i] & 0x0F) << 4) | (PORTD & 0x0F); // seg_pat 하위 4bit A, B, C, D
            PORTB = (seg_pat[i] & 0x70 ) | (PORTB & 0x0F); // seg_pat 상위 3bit E, F, G
            delay_ms(1000);
        }
    }
}

 

예제) 7-Segment 구동연습 3

 

#include <mega128.h>
#include <delay.h>

const char seg_pat[10]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void Seg2_out(int); 
void main(void) { 

    int num = 0;
    
    DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
    DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
    DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
    
    PORTB = 0x0; // E, F, G, DP off
    PORTD = 0x0; // A, B, C, D off
    
    while(1){ 
        Seg2_out(num);
        num++;
    	if(num > 99) num = 0;
    }
}