Switch 실습 2

Download Report

Transcript Switch 실습 2

마이크로프로세서설계 – 6
스위치 입력 및 LED 출력 실습
시스템및센서네트워크연구실
1
ATmega128
시스템및센서네트워크연구실
2
LED sink / 스위치 풀업 회로
470
5V
PC0
+5V
PC1
…..
10K
PC7
PD2
104 (0.1uF)
시스템및센서네트워크연구실
3
시스템및센서네트워크연구실
4
스위치 입력 및 LED 출력 연습
- PORT 입출력 관련 레지스터
- 스위치 입력 및 LED 출력 연습
시스템및센서네트워크연구실
5
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 입력 (풀다운 저항)
시스템및센서네트워크연구실
6
실습 1
// LED(PORTC) 왼쪽 순차 점등, SW1(PD2)를 누르고 있을 때 오른쪽 순차 점
#include <mega128.h> // mega128 마이크로컨트롤러 관련 헤더 파일
#include <delay.h>
// delay 함수 정의 헤더 파일
void main(void)
{
char key, led;
DDRD = 0b00000000;
DDRC = 0b11111111;
// PD2 입력 설정
// PORTC 출력 설정
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) {
led = (led>>1) | 0b10000000;
if(led == 0xFF) led = 0x7F;
PORTC = led;
}
시스템및센서네트워크연구실
// while(1) : 무한 루프
// PD2 값 읽어오기 - 비트 마스킹 기능
// 키가 눌러지지 않았을 때
// 왼쪽 쉬프트 순차 점멸
// 키가 눌러졌을 때
// 오른쪽 쉬프트 순차 점멸
delay_ms(500);
}
}
7
실습 2
// 누르지 않을 때 LED(PORTC) 전체 점등, SW1(PD1) 누르고 있을 때 왼쪽 순차 점등, SW2(PD2) 누르고 있을 때 오른쪽 순차 점등
char key, led, led_all;
DDRD = 0b00000000;
// PD1, 2 입력 설정
DDRC = 0b11111111;
// PORTC 출력 설정
led = 0xFE;
led_all = 0xFF;
while(1){
key = PIND & 0b00000110;
switch(key) {
case 0b00000100 :
led = (led<<1) | 0x01;
if(led == 0xFF) led = 0xFE;
PORTC = led;
break;
case 0b00000010 :
led = (led>>1) | 0x80;
if(led == 0xFF) led = 0x7F;
PORTC = led;
break;
default:
led_all ^= 0xFF;
PORTC = led_all;
break;
}
delay_ms(500);
시스템및센서네트워크연구실
}
// while(1) : 무한 루프
// PD1, 2 값 읽어오기 – 비트 마스킹 기능
// SW1이 눌러진 경우, PD1=0, PD2=1
// 왼쪽 쉬프트 순차 점멸
// SW2가 눌러진 경우, PD1=1, PD2=0
// 오른쪽 쉬프트 순차 점멸
// 스위치가 눌러지지 않은 경우
// led_all값 반전
8
실습 3
// SW1(PD2)을 누르지 않을 때 LED(PORTC) 전체 점등, SW1(PD2)를 누르고 있을 때 LED 1개 랜덤 점등
#include <stdlib.h>
#include <math.h>
// rand 함수 정의 헤더 파일
// pow(x, y) 함수 정의 헤더 파일
char key, led_all;
char position = 0;
DDRD = 0b00000000;
DDRC = 0b11111111;
// 자리수를 결정하는 변수
// PD1, 2 입력 설정
// PORTC 출력 설정
led_all = 0b11111111;
while(1){
key = PIND & 0b00000100;
// while(1) : 무한 루프
// PD1, 2 값 읽어오기 - 비트 마스킹 기능
if(key != 0) {
// 키가 눌러지지 않았을 때
led_all ^= 0xFF;
// led_all값 반전
PORTC = led_all;
}
if(key == 0) {
// 키가 눌러졌을 때
position = (char) (rand() % 8);
// 랜덤 숫자를 8로 나머지 연산을 수행. 결과는 1 – 7
PORTC = (char) pow(2, position) ^ 0xFF; // pow(2, position) : position 위치에 있는 비트만 1로 설정
// ^ 0xFF : sink 회로이므로 반전 연산
}
delay_ms(500);
}
시스템및센서네트워크연구실
9
MCU에서 입력을 받아들이는 방법
 폴링(polling)
 사용자가 명령어를 사용하여 입력 핀의 값을 계속 읽어서 변화를 알아내
는것
 MCU가 지속적으로 동작하여야 함
 건전지 등을 사용하는 경우에는 파워 소모의 문제가 있음
 인터럽트(interrupt)
 MCU 자체가 하드웨어적으로 그 변화를 체크하여 변화시에만 일정한 동
작을 하는 것
 인터럽트는 MCU에서 지원해야 되는 기능이므로, MCU에서 지원되지 않
는 기능은 사용할 수 없음
시스템및센서네트워크연구실
10
실습 4-1
// SW1(PD2)이 누를 때마다 PORTC 왼쪽으로 한 칸 쉬프트
// 폴링 방식을 사용하지 않을 때  스위치를 누르고 있는 시간동안 LED가 계속 쉬프트되거나,
//
SW를 빨리 누르면 SW 누른 횟수만큼 LED가 쉬프트되지 않음
char key, oldkey, led;
DDRD = 0b00000000;
DDRC = 0b11111111;
// PD2 입력 설정
// PORTC 출력 설정
led = 0b11111110;
PORTC = led;
// 0번 비트만 on
// PORTC 출력
while(1){
key = PIND & 0b00000100;
if(key == 0) {
led = (led << 1) | 0x01;
if(led == 0xFF) led = 0xFE;
PORTC = led;
}
// while(1) : 무한 루프
// SW1 상태 추출
// 키가 눌러졌을 때
// 1비트 쉬프트
// 마지막 비트까지 왔을 때, 0번 비트 on
delay_ms(100);
// 100 일때 : 지연이 적으면 누르고 있는 시간 동안 LED가 많이 쉬프트됨
// 1000일때 : 지연이 많으면 지연시간 내에 SW를 누르면 쉬프트되지 않음
}
시스템및센서네트워크연구실
11
실습 4-2
// SW1(PD2)이 누를 때마다 PORTC 왼쪽으로 한 칸 쉬프트
// 폴링 방식을 사용할 때  한번 누를 때 한번씩 움직이는 정상적인 동작이 가능함
char key, oldkey, led;
DDRD = 0b00000000;
DDRC = 0b11111111;
// PD2 입력 설정
// PORTC 출력 설정
led = 0b11111110;
PORTC = led;
oldkey = PIND & 0b00000100;
// 0번 비트만 on
// PORTC 출력
// SW1 상태 추출 -> 누르지 않았으므로, 0b00000100
// while(1) : 무한 루프
// SW1 상태 추출
// 누르지 않은 경우 : oldkey – 0b00000100, key – 0b00000100
// 누른 경우 :
oldkey – 0b00000100, key – 0b00000000 -> 이 때만 실행
led = (led << 1) | 0x01;
// 1비트 쉬프트
if(led == 0xFF) led = 0xFE; // 마지막 비트까지 왔을 때, 0번 비트 on
PORTC = led;
while(1){
key = PIND & 0b00000100;
if(oldkey != 0 && key == 0) {
}
oldkey = key;
delay_ms(100);
}
시스템및센서네트워크연구실
// 계속 누르고 있는 경우 : oldkey – 0b00000000, key – 0b00000000
// 손을 뗐을 때 :
oldkey – 0b00000000, key – 0b00000100
// 키의 떨림 현상을 방지하기 위하여 100msec 지연
12
실습 5
// SW1(PD2)이 누를 때마다 PORTC LED 1개 랜덤 점등
char key, oldkey, led;
char position = 0;
DDRD = 0b00000000;
DDRC = 0b11111111;
// 자리수를 결정하는 변수
// PD2 입력 설정
// PORTC 출력 설정
led = 0b11111110;
PORTC = led;
oldkey = PIND & 0b00000100;
// 0번 비트만 on
// PORTC 출력
// SW1 상태 추출 -> 누르지 않았으므로, 0b00000100
// while(1) : 무한 루프
// SW1 상태 추출
// 누르지 않은 경우 : oldkey – 0b00000100, key – 0b00000100
// 누른 경우 :
oldkey – 0b00000100, key – 0b00000000 -> 이 때만 실행
position = (char) (rand() % 8);
// 랜덤 숫자를 8로 나머지 연산을 수행. 결과는 1 – 7
PORTC = (char) pow(2, position) ^ 0xFF; // pow(2, position) : position 위치에 있는 비트만 1로 설정
// ^ 0xFF : sink 회로이므로 반전 연산
while(1){
key = PIND & 0b00000100;
if(oldkey != 0 && key == 0) {
}
oldkey = key;
delay_ms(100);
}
시스템및센서네트워크연구실
// 계속 누르고 있는 경우 : oldkey – 0b00000000, key – 0b00000000
// 손을 뗐을 때 :
oldkey – 0b00000000, key – 0b00000100
// 키의 떨림 현상을 방지하기 위하여 100msec 지연
13
실습 6
// SW1(PD2)이 눌러지면 왼쪽으로 한칸 쉬프트, SW2(PD3)가 눌러지면 오른쪽으로 한칸 쉬프트
// 폴링 방식으로 구현하는 경우
char key, oldkey, led;
DDRD = 0b00000000;
DDRC = 0b11111111;
// PD2, 3 입력 설정
// PORTC 출력 설정
led = 0b11111110;
PORTC = led;
oldkey = PIND & 0b00001100;
while(1){
// while(1) : 무한 루프
key = PIND & 0b00001100;
// PD2, PD3 값 읽어오기 - 비트 마스킹 기능
if(oldkey != key) {
// 키 값에 변화가 있는 지를 체크, 변화가 있는 경우 switch문 실행
switch(key) {
case 0b00001000 :
// SW1이 눌러진 경우, PD2=0, PD3=1
led = (led<<1) | 0x01; // 왼쪽 쉬프트
if(led == 0xFF) led = 0xFE;
default:
// 스위치가 눌러지지 않은 경우
PORTC = led;
break;
break;
}
case 0b00000100 :
// SW2가 눌러진 경우, PD2=1, PD3=0
oldkey = key // 현재 키 값을 직전 키 값으로 변경
led = (led>>1) | 0x80; // 오른쪽 쉬프트
delay_ms(100);
if(led == 0xFF) led = 0x7F;
// 키의 떨림 현상을 방지하기 위하여 100msec 지연
PORTC = led;
break;
}
}
시스템및센서네트워크연구실
14