FND 실습 1 - 제어계측공학과 시스템네트워크연구실

Download Report

Transcript FND 실습 1 - 제어계측공학과 시스템네트워크연구실

마이크로프로세서설계 – 7
FND (7-segment) 출력 실습 1
시스템및센서네트워크연구실
1
ATmega128
시스템및센서네트워크연구실
2
LED sink / 스위치 풀업 회로
470
5V
PC0
+5V
PC1
…..
10K
PC7
PD2
104 (0.1uF)
시스템및센서네트워크연구실
3
시스템및센서네트워크연구실
4
FND (7-segment) 출력 연습
- FND 회로
- FND 실습
시스템및센서네트워크연구실
5
FND
 FND (7-segment)
 type
common cathode type
common anode type
10
6
1
5
DIG1
시스템및센서네트워크연구실
6
FND 회로
 common cathode type
 PAx를 다수의 FND가 공유하므로, PBx를 이용하여 스위치 기능 수행
 PBx = low (0)
• FND 활성화
• 개별 LED on : PAx = 1
• 개별 LED off : PAx = 0
 PBx = high (1)
• FND 비활성화
FND
PB0
PA0
PA1
…..
PA7
시스템및센서네트워크연구실
7
 common anode type
 common anode type은 외부 전원을 이용하여 LED를 on
 외부 전원이 다수의 FND로 들어가고, 데이터 입력 라인이 공통으로 사용
되므로,
• 외부 전원을 on/off 할 수 있는 스위치가 필요함
• 스위치가 없다면, 데이터 입력 라인의 값에 따라 모든 FND가 on됨
 TR 스위치 회로
• E(emitter), B(base), C(collector) 세 단자
+5V
 E : 순방향 전류를 공급하는 역할
 B : E에서 C로 흐르는 전류를 조절하는 역할
 C : 에미터에서 공급한 전류를 받아들이는 역할
• 동작
 PBx = high : 차단 상태
 PBx = low : 통전 상태
시스템및센서네트워크연구실
E
PBx
B
C
PNP타입
8
 PBx = low (0)
• FND 활성화
• 개별 LED on : PAx = 0 (low)
PB0
• 개별 LED off : PAx = 1 (high)
 PBx = high (1)
• FND 비활성화
1K
FND
PA0
B
C
PA1
E
+5V
PNP타입
…..
PA7
바닥에서 바라본 방향
시스템및센서네트워크연구실
9
PORT 입력 관련 레지스터
 IO register
 PORTx (port x data register) : 포트 x 데이터 출력 레지스터
• 초기값 0
 DDRx (port x data direction register) : 포트 x 데이터 방향 설정 레지스터
• 초기값 0
 PINx (port x pin input address) : 포트 x 입력 레지스터
• 초기값 N/A
• 읽기만 가능
 포트핀의 동작 상태
 DDRx – 1, PORTx – 0 : 출력, low 출력 (sink 출력 회로)
 DDRx – 1, PORTx – 1 : 출력, high 출력 (source 출력 회로)
 DDRx – 0, PINx – 0 : 입력, low 입력 (풀업 저항)
 DDRx – 0, PINx – 1 : 입력, high 입력 (풀다운 저항)
시스템및센서네트워크연구실
10
실습 1
// FND 1개 0.5초 간격으로 전체 on/off
// FND 데이터 라인 연결 – PA0 – PA7
// FND 제어 라인 연결 – PB0
DDRA = 0b11111111;
// PA 출력 설정
DDRB = 0b00000001;
// PB0 출력 설정
PORTB = 0b00000000;
// PB0 = 0 : FND 활성화
PORTA = 0xFF;
while(1){
// while(1) : 무한 루프
PORTA = 0x00;
delay_ms(500);
PORTA = 0xFF;
delay_ms(500);
}
시스템및센서네트워크연구실
11
실습 2
// FND 1개 쉬프트 시켜 출력
// FND 데이터 라인 연결 – PA0 – PA7
// FND 제어 라인 연결 – PB0
char fnd;
DDRA = 0b11111111;
DDRB = 0b00000011;
// PA 출력 설정
// PB0 출력 설정
fnd = 0b11111110;
PORTB = 0b00000000;
// PB0 = 0 : FND 활성화
while(1){
PORTA = fnd;
fnd = (fnd<<1) | 0b00000001;
if(fnd == 0xFF) fnd = 0xFE;
delay_ms(500);
}
시스템및센서네트워크연구실
// while(1) : 무한 루프
// PA0 = 0 : 0번 LED on
// 왼쪽 쉬프트 순차 점멸
12
실습 3
// FND 2개 연결, FND1과 FND2를 번갈아가면서 on
// FND 데이터 라인 연결 – PA
// FND 제어 라인 연결 – FND1 : PB0, FND2 : PB1
char fnd;
DDRA = 0b11111111;
DDRB = 0b00000011;
// PA 출력 설정
// PB0, PB1 출력 설정
fnd = 0b11111111;
PORTA = fnd;
// FND 데이터 라인에 모두 1 출력
while(1) {
PORTB = 0b00000010;
PORTA = 0xc0;
delay_ms(500);
// while(1) : 무한 루프
// PB0 = 0, PB1 = 1 : FND1 활성화, FND2 비활성화
// FND on
PORTB = 0b00000001;
PORTA = 0xa4;
delay_ms(500);
// PB0 = 1, PB1 = 0 : FND0 활성화, FND1 비활성화
// FND on
}
시스템및센서네트워크연구실
13
배열
 동일한 자료유형의 여러 변수를 일괄 선언
 연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조
 동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조
 크기
 배열의 선언은 다음과 같은 구문을 이용
• 주요 요소는 배열 변수명(이름), 자료형, 그리고 배열의 크기
시스템및센서네트워크연구실
14
배열의 크기와 첨자
 배열 원소(array element)
 배열 score에서 10개의 자료형 int가 저장되는 각각의 항목
 첨자
 배열 원소는 첨자(index)를 사용하여 참조
 즉 첫 배열 원소는 항상 첨자가 0이며, 차례로 1씩 증가
• 배열 첨자는 유효한 값의 범위를 벗어나는 경우, 문제 발생
• 항상 배열 첨자의 사용에 주의
첨자 범위 : 0 ~ size-1
시스템및센서네트워크연구실
15
배열의 초기화
 값의 초기화
 첨자를 이용하여 각 원소에 값을 대입
 배열을 선언하면서 각 원소의 값을 지정: 배열 초기화(initialization)
배열의 초기화에서 배열
의 크기 생략 가능
시스템및센서네트워크연구실
16
실습 4
// FND1에 16진수 0에서 F까지 0.5초 간격으로 증가
// FND 데이터 라인 연결 – PORTA
// FND 제어 라인 연결 – FND1 : PORTB.0, FND2 : PORTB.1
char seg_pat[16]= {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
void main(void)
{
int i=0;
DDRA = 0b11111111;
DDRB = 0b00000001;
// PA 출력 설정
// PB0 출력 설정
PORTB = 0b00000000;
// PB0 = 0 : FND1 활성화
while(1){
for(i=0 ; i<16 ; i++) {
PORTA = seg_pat[i];
delay_ms(500);
}
}
// while(1) : 무한 루프
// PA에 16진수 값 표시
}
시스템및센서네트워크연구실
17
실습 5
// SW1을 누르면, FND1 1씩 증가 (9까지 증가한 후 0으로 변경)
char seg_pat[16]= {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
int key, oldkey, num=0;
DDRA = 0b11111111;
DDRB = 0b00000001;
DDRD = 0b00000000;
oldkey = PIND & 0b00000100;
PORTB = 0b00000000;
PORTA = seg_pat[num];
while(1){
key = PIND & 0b00000100;
if(oldkey != 0 && key == 0) {
num++;
if(num > 9) num = 0;
}
PORTA = seg_pat[num];
oldkey = key;
delay_ms(20);
}
시스템및센서네트워크연구실
// PA 출력 설정
// PB0 출력 설정 (FND1)
// PD2 입력 설정 (SW1)
// SW1 상태 추출
// PB0 = 0 : FND1 활성화
// while(1) : 무한 루프
// PD2 값 읽어오기 – 비트 마스킹 기능
18
실습 6
// SW1을 누르면, FND1 1씩 증가 (9까지 증가한 후 0으로 변경)
// SW2를 누르면, FND1 1씩 감소 (0까지 증가한 후 9로 변경)
char seg_pat[16]= {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
char key, oldkey;
int num=0;
DDRA = 0b11111111;
DDRB = 0b00000001;
DDRD = 0b00000000;
oldkey = PIND & 0b00000110;
while(1){
key = PIND & 0b00000110;
if(oldkey != key) {
switch(key) {
case 0b00000100 :
num++;
break;
case 0b00000010 :
num--;
break;
default:
break;
}
시스템및센서네트워크연구실
// PA 출력 설정
// PB0 출력 설정 (FND1)
// PD2, PD3 입력 설정 (SW1, SW2)
// SW1 상태 추출 -> 누르지 않았으므로, 0b00000110
// while(1) : 무한 루프
// PD2, PD3 값 읽어오기 - 비트 마스킹 기능
// 키 값에 변화가 있는 지를 체크, 변화가 있는 경우 switch문 실행
if(num > 9) num = 0;
// SW1이 눌러진 경우, PD2=0, PD3=1
if(num < 0) num = 9;
}
// SW2가 눌러진 경우, PD2=1, PD3=0
PORTA = seg_pat[num];
delay_ms(10);
oldkey = key;
// 스위치가 눌러지지 않은 경우
}
19