Transcript Switch 실습 1
마이크로프로세서설계 – 5
시스템 관련 회로
스위치 입력 실습 1
시스템및센서네트워크연구실
1
ATmega128
시스템및센서네트워크연구실
2
LED sink 회로
PC0
+5V
PC1
…..
PC7
시스템및센서네트워크연구실
3
시스템및센서네트워크연구실
4
시스템 관련 회로
- 시스템 클럭 / 클럭 발생 회로
- 전원 회로
- 리셋 회로
시스템및센서네트워크연구실
5
시스템 클럭
시스템 클럭
마이크로컨트롤러의 기능들은 일정한 클럭 신호에 따라서 동작을 하는
데, 이러한 클럭을 시스템 클럭이라 함
어셈블리 명령어 한 개가 1 시스템 클럭에 동작
시스템 클럭은 다양한 클럭 소스를 이용하여 발생시킴
• 외부 크리스탈/세라믹 레조네이터 사용 – 주로 사용
• 외부 저주파 크리스탈 사용
• 외부 RC 오실레이터 사용
• 내부 RC 오실레이터 사용
• 외부 클럭
시스템및센서네트워크연구실
6
클럭 발생
클럭 발생 회로 (p14 Fig. 1-1)
16MHz 크리스탈/세라믹 레조네이터 발진기
XTAL1, XTAL2에 연결
콘덴서 c1, c2 권장값 (table 3-13)
• 16MHz 클럭에서 12-22 (20)pF 사용
16MHz 크리스탈 또는 세라믹 레조네이터 사용시
• Fuse byte 중 CKOPT -> 1, CKSLE3..1 -> 101, 110, 111로 설정
• 퓨즈 비트는 컴파일러에서 클럭 선택시 자동으로 설정됨
XTAL2
c1
20p
시스템및센서네트워크연구실
16MHz
XTAL1
c2
20p
7
전원 및 리셋
전원 관련 회로 (p14 Fig. 1-1)
관련 핀 : VCC,GND, AVCC, AGND, /RESET
VCC – 5V 전원, 충분한 전원 공급을 위하여 모든 VCC 연결
GND – 접지
AGND – GND와 접지
AVCC – ADC의 전원, ADC 사용을 위하여 VCC 연결
리셋 회로 (p14 Fig. 1-1)
1.5us 이상의 low 신호 인가시 리셋
5V
리셋시 프로그램이 처음부터 다시 시작됨
10K
/RESET
시스템및센서네트워크연구실
8
스위치 입력 연습
- 풀업저항, 풀다운저항
- 스위치 실습 회로
- PORT 입력 관련 레지스터
- 스위치 실습
시스템및센서네트워크연구실
9
풀업 저항, 풀다운 저항
풀업 저항(pullup resistor), 풀다운 저항(pulldown resistor)
논리적으로 H레벨 상태를 유지하기 위하여 신호의 입력 또는 출력단자
와 전원 단자 사이에 접속하는 저항을 풀업 저항이라 함
논리적으로 L레벨 상태를 유지하기 위하여 신호의 입력 또는 출력 단자
와 접지 단자 사이에 접속하는 저항을 풀다운 저항이라 함
풀업 저항
시스템및센서네트워크연구실
풀다운 저항
10
풀업/풀다운 저항의 사용 이유
풀업/풀다운 저항의 사용 이유
입력단 회로에서의 풀업/풀다운 저항
• 입력 논리값을 H, L로 올바르게 인가하려는 경우
• 현재는 입력 신호를 사용하지 않으나 나중에 사용할지도 모르는 경우
출력단 회로에서의 풀업/풀다운 저항
• 출력 전류를 증대시키려는 경우
초기값을 정확하게 부여하기 위한 풀업/풀다운 저항
시스템및센서네트워크연구실
11
L 스위치 입력과 풀업 저항
입력 논리값을 H, L로 올바르게 인가하려는 경우
그림 1의 (a)
• 스위치를 누른 상태에서는 L 상태
• 오픈 상태에서는 L도 H도 아닌 상태가 되어 불안한 동작 상태가 됨
그림 1의 (b)와 같이 풀업 저항을 달아주면,
• 스위치를 누르면 확실한 L 상태
• 스위치를 놓으면 확실한 H 상태
수 mA 이내로 전류가 흐르도록 수 K옴의 저항 선정
시스템및센서네트워크연구실
12
H 스위치 입력과 풀다운 저항
입력 논리값을 H, L로 올바르게 인가하려는 경우
그림 2의 (a)
• 스위치를 누른 상태에서는 H 상태
• 오픈 상태에서는 L도 H도 아닌 상태가 되어 불안한 동작 상태가 됨
그림 2의 (b)와 같이 풀다운 저항을 달아주면,
• 스위치를 누르면 확실한 H 상태
• 스위치를 놓으면 확실한 L 상태
수 mA 이내로 전류가 흐르도록 수 K옴의 저항 선정
시스템및센서네트워크연구실
13
나중에 입력신호가 사용될 것을 고려한 풀업 저항
(a)와 같이 설계하는 경우
(c)와 같이 스위치를 추가하는 경우 (c)는 전원이 숏트가 되어 쓸 수 없음
(b)와 같이 풀업 저항을 추가하여 설계하는 경우
(d)와 같이 스위치를 추가하면, L 스위치 입력 회로가 됨
시스템및센서네트워크연구실
14
출력 전류를 증대시키는 풀업 저항
H 상태 출력시의 동작
부하 전류(출력 전류)를 증가시키기 위한 목적
소자의 전류 + 저항전류가 외부 소자로 출력됨
시스템및센서네트워크연구실
15
초기값을 정확히 부여하기 위한 풀다운 저항
초기 출력 데이터를 0x00로 지정하기 위한 풀다운 저항
전원을 투입하는 초기에는 모든 IC의 내부 동작이 불안한 영역이 발생할
수도 있음
D/A 입력 조건은 확실한 H 신호가 들어올 때까지는 L로 유지하고 있으라
는 의미
수 mA 이내로 전류가 흐르도록 수 K옴의 저항 선정
시스템및센서네트워크연구실
16
스위치 실습 회로
5V
10K
PD2
104 (0.1uF)
시스템및센서네트워크연구실
17
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 입력 (풀다운 저항)
시스템및센서네트워크연구실
18
실습 1
// PD2를 이용하여 스위치 입력
// PC0를 이용하여 LED를 스위치 입력값에 따라 점등
// 풀업 저항과 풀다운 저항 방식으로 연결하면, 스위치를 누를 때 어떻게 변하는가?
// LED는 소스 회로 연결
#include <mega128.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
void main(void)
{
char key;
DDRD = 0b00000000;
DDRC = 0b00000001;
// PD2 입력 설정
// PC0 출력 설정
while(1){
key = PIND & 0b00000100;
key >>= 2;
PORTC = key;
// while(1) : 무한 루프
// PD2 값 읽어오기 – 비트 마스킹 기능
// 풀업 저항에서 누르면 00000000, 누르지 않으면 00000100
// 풀다운 저항에서 누르면 00000100, 누르지 않으면 00000000
// 2번 비트가 0번 비트 자리에 오도록 쉬프트 연산
// PORTC 출력
// 풀업 저항에서 01과 XOR
}
}
시스템및센서네트워크연구실
19
실습 2
// PD2를 이용하여 스위치 입력
// PC0를 이용하여 LED를 스위치 입력값에 따라 점등
// 풀업 저항과 풀다운 저항 방식으로 연결하면, 스위치를 누를 때 어떻게 변하는가?
// LED는 싱크 회로 연결
#include <mega128.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
void main(void)
{
char key;
DDRD = 0b00000000;
DDRC = 0b11111111;
// PD2입력 설정
// PORTC 출력 설정
while(1){
key = PIND & 0b00000100;
key >>= 2;
PORTC = key ^ 0xFE;
// while(1) : 무한 루프
// PD2 값 읽어오기 – 비트 마스킹 기능
// 2번 비트가 0번 비트 자리에 오도록 쉬프트 연산
// 풀업 저항에서 누르면 00000000, 누르지 않으면 000000001
// 풀다운 저항에서 누르면 00000001, 누르지 않으면 000000000
// PORTC 출력 – 반전시켜 출력
// 풀업 저항에서 FE와 XOR
// 풀다운 저항에서 FF와 XOR
}
}
시스템및센서네트워크연구실
20
실습 3
// PD1(SW1), PD2(SW2)를 이용하여 스위치 입력
// PORTC의 0, 1번 비트에 SW1, SW2의 값을 출력
// 스위치는 풀업 저항, LED는 싱크 회로 연결
#include <mega128.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
void main(void)
{
char key;
DDRD = 0b00000000;
DDRC = 0b00000011;
// PD1, 2 입력 설정
// PORTC 출력 설정
while(1){
key = PIND & 0b00000110;
key >>= 1;
PORTC = key ^ 0b11111100;
// while(1) : 무한 루프
// PD2, PD3 값 읽어오기 – 비트 마스킹 기능
// 2번 비트가 0번 비트 자리에 오도록 쉬프트 연산
// 풀업 저항에서 누르면 00000000, 누르지 않으면 00000011
// PORTC 출력 – 반전시켜 출력
}
}
시스템및센서네트워크연구실
21
실습 4
// PORTC의 LED가 순차 점멸되고 있는 도중에 SW1(PD2)를 누르면 전체 점등, SW1을 누르지 않으면 다시 순차 점멸
char key, led, led_all;
DDRD = 0b00000000;
// PD2 입력 설정
DDRC = 0b11111111;
// PORTC 출력 설정
led_all = 0b11111111;
led = 0b11111110;
PORTC = led;
while(1){
key = PIND & 0b00000100;
if(key != 0) {
led = (led<<1) | 0b00000001;
if(led == 0xFF) led = 0xFE;
PORTC = led;
}
if(key == 0) {
PORTC = led_all;
led_all ^= 0b11111111;
}
delay_ms(500);
}
시스템및센서네트워크연구실
// while(1) : 무한 루프
// PD2 값 읽어오기 - 비트 마스킹 기능
// 키가 눌러지지 않았을 때
// 왼쪽 쉬프트 순차 점멸
// 키가 눌러졌을 때
// led_all값 반전
22
Switch 문
중첩된 if 문에서 조건식이 정수형의 등호식이라면
시스템및센서네트워크연구실
23
실습 5
// PD1(SW1), PD2(SW2) 값에 따라 PORTC 다른 값 출력
char key;
DDRD = 0b00000000;
DDRC = 0b11111111;
while(1){
key = PIND & 0b00000110;
switch(key) {
case 0b00000100 :
PORTC = 0b00001111;
break;
case 0b00000010 :
PORTC = 0b11110000;
break;
default:
PORTC = 0b11111111;
break;
}
}
시스템및센서네트워크연구실
// PD1, 2 입력 설정
// PORTC 출력 설정
// while(1) : 무한 루프
// PD1, PD2 값 읽어오기 – 비트 마스킹 기능
// SW1이 눌러진 경우, PD1=0, PD2=1
// PORTC의 상위 4비트 on
// SW2가 눌러진 경우, PD1=1, PD2=0
// PORTC의 하위 4비트 on
// 스위치가 눌러지지 않은 경우
// PORTC의 모든 비트 off
24