임베디드시스템기초 (#514115 ) #2. GPIO & Matrix Keypad 한림대학교전자공학과이선우
Short Review #1 General Purpose Input Output (GPIO) Output port Input port Switch 사용방법 2
General Purpose Input Output(GPIO) port 모든 MCU의가장기본적이고중요한주변장치 (Peripheral device) 줄여서 Digital I/O or digital port라고도함. MCU 칩의각핀 (pin) 이수행하는기능의하나. 대개핀하나로입출력기능수행 (I/O 기능선택 direction 설정 ) Port 복수개의디지털입출력핀을묶어서 ( 보통 8 개, 8bit) 지칭하는용어 Digital Output 기능 스위치기능 : ON (Vcc 연결 ), OFF (GND 연결 ) Digital Input 기능 핀의상태 (H/L) 를아는기능 3
Digital output 기능 일반적인 logical gate 의출력과동일기능 즉, 논리값 1 = Vcc 가연결 3V/5V 출력 논리값 0 = GND가연결 모든외부장치 ON/OFF 제어에사용 Switch 와동일기능 ( 회로적으론다름 ) 전기적특성 (Electrical characteristics) Vcc=3V, I OH(max) < 48mA Vcc=2.2V, I OH(max) < 12mA 4
MSP430FG461x Digital I/O ports MSP430FG4618 P1/P2: 2x8 I/O, 인터럽트발생가능 P3/P4/P5/P6: 4X8 I/O P7/P8/P9/P10: 4X8/2X16 I/O 각핀별로 Direction(I/O) 설정가능 5
Digital I/O Registers PxOUT: Output 으로설정되었을때각핀의논리값 (1/0) 결정 P1OUT.1 =1 P1.1 pin=vcc PxDIR: Direction 을설정하는 SFR P1DIR.1 =1 P1.1 pin: output direction Special Function Reg. (SFR) 내장주변장치를제어하는조정기 6
Digital Output 관련 SFR 역할 P3DIR 7 6 5 4 3 2 1 0 0 0 1 1 1 1 1 1 방향결정 Vcc Vcc GND GND GND GND Vcc P3OUT 7 6 5 4 3 2 1 0 0 0 1 0 0 0 1 1 각 output pin 값결정 7
실습보드장착 LED ON/OFF 제어 #include "msp430.h" int main(void) { unsigned int i; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P2DIR = 0x06; P2OUT = 0x02; for (;;) { P2OUT ^= 0x06; i = 30000; do i--; while (i!= 0); PORT 의입출력방향설정 P2DIR 0000 0110 B (P2.2=LED1, P2.1=LED2) 각핀의출력설정 각핀의논리값을결정. 1: H(ON,3.3V) 0: L(OFF,0V) Toggle ^= P2OUT ^ 0000 0110 8
Mechanical switch 관련특징 / 용어 일반적인키보드 / 키패드의경우순간접촉방식의스위치사용 모든기계적스위치의경우접촉시그림과같은펄스를만들어냄 바운스 (Bounce) 채터링 (chattering) 현상 9
Debouncing (chattering 방지 ) 기법 Contact bounce(chatter) 에의한 read error 를방지하기위한방법 Hardware 적인방법 RC Low-pass filter 회로이용 장점 : 간단한회로 단점 : 느린응답성 별도전용칩을사용 ELM410 Software 적인방법 일정시간간격 ( 약수백 ms) 을두고 2 번읽어동일한값이면인정하는방법 10
입력포트사용하기 ( 외부상태알기 ) P1.0=SW1 P1.1=SW2 회로도 입력포트사용하기 ( 외부상태알기 ) SW2 open DVcc (3V) SW2 pushed GND 11
입력포트사용하기 ( 외부상태알기 ) void main(void) { WDTCTL = WDTPW + WDTHOLD; P2DIR = 0x06; P1DIR &= 0xFC; while(1) { unsigned char swstatus; swstatus = P1IN; swstatus &= 0x03; swstatus = swstatus<<1; P2OUT = swstatus; delay(10000); PORT 의입출력방향설정 output: P2.2=LED1, P2.1=LED2 input: P1.0=SW1, P1.1=SW2 핀상태값을읽음 INPUT 1: H(ON,3.3V), 0: L(OFF,0V) 만약 SW 가눌려있다면 L 의값을가짐 신호처리 &= 0x03; bit1,bit0 만값을유지시키고나머지비트는 0 으로. <<1: shift left 1bit SW 상태반대로 LED 로표시, 즉누르면꺼짐. 12
연속입력문제 원하는 switch 동작즉, H L 만을감지! 무한루프에의한연속입력발생 원하지않는 auto-repeat * 문제해결방법스위치가원상태로돌아온것을감지하여 H L 을 enable 시킴. 13
의도하지않은 repeat 방지법 unsigned char rd_flag, sw1, sw2; // 최초설정, 보통 initial condition 이라함 rd_flag = 1; IF 조건문의미 2 번읽어두값모두 0 일때만 TRUE. 즉, 스위치눌렸을때 while(1) { sw1 = P1IN & 0x01; delay(10000); sw2 = P1IN & 0x01; if (!sw1 &&!sw2) { if( rd_flag) { P2OUT ^= 0x02; //LED1 toggle rd_flag =0; else if ( sw1 && sw2 ) { rd_flag = 1; 문제해결방법 rd_flag 가 1 일때만응답 rd_flag=0 으로리셋시킴으로오직한번만실행됨. SW1 Read enable SW1 이다시원래상태 (H) 를감지하여 rd_flag=1 시킴. 14
Matrix Keypad What? How to use? How to make a code? 15
Keypad 란? Keypad A Keypad is a set of buttons arranged in a block which usually bear digits, symbols and usually a complete set of alphabetical letters. (http://en.wikipedia.org/wiki/keypad ) Numeric keypad, telephone keypad, etc. 3X4 keypad 4X4 keypad 16
Keypad 사용방법 사용이유 적은수의포트로많은키입력가능 (Ex: 16 개스위치 4x4 8 DIO 필요 ) 동작원리 Pull-up된 X1~X4와스위치로연결된 Y1~Y4 라인중하나씩 Low 로만들면서 P2.4~P2.7 핀의상태를읽어 4개스위치중하나의눌림을판단하는방식 scanning Ex.:P2.0=L, 나머지 =H 상태에서 P2.4~P2.7 READ. 만약 1번스위치가눌렸다면 P2IN=1110 0000 ( 즉 P2.4=L) 됨. 17
Example: 4X4 Keypad GPIO 설정 P2.0~P2.3: output P2.4~P2.7:input Output Input Key mapping table - If Y1=L, read [P2.7-4] 4bit [1110] = 1 4bit [1101] = 2 4bit [1011] = 3 4bit [0111] = F - If Y2=L, read [P2.7-4] 4bit [1110] = 4 4bit [1101] = 5 4bit [1011] = 6 4bit [0111] = E 18
Code for 4X4 keypad reading void main() { int num = 0; char rd; while(1) { do { num = 0xff; P2OUT &= ~(0x01); //P2.0=L rd = P2IN & 0xf0; if (rd!= 0xf0) switch(rd) { case 0x0e: num=1; break; case 0x0d: num=2; break; case 0x0b: num=3; break; case 0x07: num=0xf; P2OUT = (0x01); //Y1 disable P2OUT &= ~(0x02); //P2.1=L // 위와비슷한루틴수행하여 Y2 line 을 //enable 시켜 2~E 4 개스위치의눌림을감지함.. P2OUT!= (0x02); //Y2 disable //Y3 enable & check 4 SWs (7~D) //Y4 enable & check 4 SWs (A~C) while(num == 0xff); //16 개스위치중하나가눌렸고이를읽은상태.. 이곳에서눌린스위치에따른작업을수행하면된다. 19