한백전자기술연구소 HBE-MCU-Multi 로배우는 마이크로컨트롤러 (AVR편) 마이크로컨트롤러기능 제 3 장 GPIO 입출력제어
GPIO 입출력제어 1. HBE-MCU-Multi 구동 2. 마이크로컨트롤러와 GPIO 3. AVR 마이크로컨트롤러의입출력포트 4. GPIO 를이용하여 LED 켜기 5. GPIO를이용한스위치눌러 LED 불켜기 6. GPIO 를이용하여 FND LED 켜기
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi 장비의모듈구성 MCU Module Zone MCU 및 CPLD Module 장착 56mm*45mm Module Zone LED, FND, Array FND, Text LCD, Sensor, Memory, Relay, DAC, Audio, UART Module 장착 56mm*60mm Module Zone OLED, Step Motor, Switch, Key Pad, Freq Measure, Interrupt Analysis Module 장착 Option Module Interface 추가로제공되는옵션모듈의연결을위한인터페이스 케이블수납함 제품에사용되는각종케이블수납
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi 전원케이블연결
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi 전원스위치
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi ISP 프로그램케이블연결
HBE-MUC-Multi Multi 구동 AVR MCU 모듈구성 ATmega128 MCU Port 커넥터 Port 커넥터 JATG 디버거커넥터 ISP 커넥터
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi 신호선연결
HBE-MUC-Multi Multi 구동 HBE-MCU-Multi 기능모듈 (LED 모듈 ) 구성 Signal 커넥터
마이크로컨트롤러와 GPIO GPIO(General Purpose Input Output) 범용으로사용되는입출력포트 : 설계자가마음대로변형하면서제어할수있도록제공해주는 I/O( 입출력 ) 포트 입력과출력을마음대로선택할수있고, 0과1의출력신호를임의로만들어줄수있는구조를가짐 입력으로사용할때는외부인터럽트를처리할수있도록하는경우가많음. 입출력방향전환용레지스터와출력용 / 입력용데이터레지스터등이필요 마이크로컨트롤러에서는대부분의핀들을 GPIO로설정하는경우가많음.
AVR 마이크로컨트롤러의입출력포트 AVR 마이크로컨트롤러입출력포트 6 개의 8 비트 I/O 포트와 1 개의 5 비트 I/O 포트로구성. 출력포트의버퍼는많은유입전류와유출전류를사용 ( 최대 40 ma) 할수있음. 모든포트핀은개별적으로내부풀업저항을사용할수있음. 모든 I/O핀은 VCC와 GND사이에다이오드를접속하여포트를보호. Read-Modify-Write기능을가지고있어, 비트단위의포트설정이가능. 각포트에대한데이터출력용레지스터 (PORTx) 와데이터입출력방향지정용레지스터 (Data Direction Register: DDRx), 그리고데이터입력용레지스터 (PINx) 를보유.
AVR 마이크로컨트롤러의입출력포트 입출력포트제어용레지스터 DDRx 레지스터 입출력의방향설정을하기위한레지스터. DDRA~DDRG레지스터의해당비트에 1을쓰면출력, 0 을쓰면입력으로설정. PORTx 레지스터 데이터를출력하기위한레지스터이다 출력을원하는데이터값을 PORTx 레지스터에넣어주면된다 PINx 레지스터 데이터입력용레지스터이다 PINx 레지스터에해당하는값을읽으면해당핀의값이읽어진다. SFIOR 레지스터 Special Function IO Register. AVR 입출력포트의특수기능을제어하기위한레지스터 SFIOR의비트2(PUD: Pull-Up Disable) 를 1 로세트하면풀업저항을비활성화시킨다
AVR 마이크로컨트롤러의입출력포트 ATMega128 의범용입출력포트 : A 포트 (PA7~PA0: 핀 44-51) 내부풀업저항이있는 8 비트양방향입출력단자 외부메모리를둘경우에는주소버스 (A7-A0) A0) 와데이터버스 (D7-D0) D0) 로사용 포트핀 부가기능 PA7 AD7( 외부메모리인터페이스주소와데이터비트 7) PA6 AD6( 외부메모리인터페이스주소와데이터비트 6) PA5 AD5( 외부메모리인터페이스주소와데이터비트 5) PA4 AD4( 외부메모리인터페이스주소와데이터비트 4) PA3 AD3( 외부메모리인터페이스주소와데이터비트 3) PA2 AD2( 외부메모리인터페이스주소와데이트비트 2) PA1 AD1( 외부메모리인터페이스주소와데이터비트 1) PA0 AD0( 외부메모리인터페이스주소와데이터비트 0)
AVR 마이크로컨트롤러의입출력포트 ATMega128 의범용입출력포트 : B 포트 (PB7~PB0: 핀 10-17) 내부풀업저항이있는 8비트양방향입출력단자타이머 / 카운터나 SPI 용단자혹은 PWM 단자로도사용 포트핀 PB7 부가기능 OC2/OC1C( 출력비교또는타이머 / 카운터2의 PWM 출력, 또는출력비교와타이머 / 카운터2의 PWM출력 C) PB6 OC1B( 출력비교또는타이머 / 카운터 1 의 PWM 출력 B) PB5 OC1A( 출력비교또는타이머 / 카운터 1 의 PWM 출력 A) PB4 OC0( 출력비교또는타이머 / 카운터 0 의 PWM 출력 ) PB3 MISO(SPI 버스마스터입력 / 종속출력 ) PB2 MOSI(SPI 버스마스터출력 / 종속입력 ) PB1 SCK(SPI 버스직렬클럭 ) PB0 /SS(SPI 종속선택입력 )
AVR 마이크로컨트롤러의입출력포트 ATMega128 의범용입출력포트 : C 포트 (PC7~PC0: 핀 35-42) 내부풀업저항이있는 8비트양방향입출력단자외부메모리를둘경우에는주소버스 (A15-A8) A8) 로사용 포트핀 부가기능 PC7 AD7( 외부메모리인터페이스주소비트 15) PC6 AD6( 외부메모리인터페이스주소비트 14) PC5 AD5( 외부메모리인터페이스주소비트 13) PC4 AD4( 외부메모리인터페이스주소비트 12) PC3 AD3( 외부메모리인터페이스주소비트 11) PC2 AD2( 외부메모리인터페이스주소비트 10) PC1 AD1( 외부메모리인터페이스주소비트 9) PC0 AD0( 외부메모리인터페이스주소비트 8)
AVR 마이크로컨트롤러의입출력포트 ATMega128 의범용입출력포트 : D 포트 (PD7~PD0: 핀 25-32) 내부풀업저항이있는 8 비트양방향입출력단자 타이머용단자혹은외부인터럽트용단자로도사용. 포트핀 부가기능 PD7 T2( 타이머 / 카운터 2 클럭입력 ) PD6 T1( 타이머 / 카운터 1 클럭입력 ) PD5 XCK1(USART1 외부클럭입 / 출력 ) PD4 IC1( 타이머 / 카운터 1 입력캡쳐트리거 ) PD3 INT3/TXD1( 외부인터럽트 3 입력또는 USART1 전송핀 ) PD2 INT2/RXD1( 외부인터럽트 2 입력또는 USART1 수신핀 ) PD1 INTI/SDA( 외부인터럽트 1 입력또는 TWI 직렬데이터 ) PD0 INT0/SCL( 외부인터럽트 0 입력또는 TWI 직렬클럭 )
AVR 마이크로컨트롤러의입출력포트 ATMega128 의범용입출력포트 : E 포트 (PE7~PE0: 핀 2-9) 내부풀업저항이있는 8 비트양방향입출력단자 타이머용단자, 외부인터럽트, 아날로그비교기, USART 용단자로도사용. 포트핀 부가기능 PE7 INT7/IC3( 외부인터럽트 7 입력또는타이머 / 카운터 3 입력캡쳐트리거 ) PE6 INT6/T3( 외부인터럽트 6 입력또는타이머 / 카운터3 클럭입력 ) PE5 INT5/OC3C( 외부인터럽트 5 입력또는타이머 / 카운터 3 의출력캡쳐와 PWM 출력 C) PE4 INT4/OC3B( 외부인터럽트 4 입력또는타이머 / 카운터3의출력캡쳐와 PWM 출력 B) PE3 AIN1/OC3A( 아날로그비교반대입력또는타이머 / 카운터3의출력비교와 PWM 출력A) PE2 AIN0/XCK0( 아날로그비교입력또는 USART0 외부클럭입 / 출력 ) PE1 PDO/TXD0( 프로그램데이터출력또는 UART0 전송핀 ) PE0 PDI/RXD0( 프로그램데이터입력또는 UART0 수신핀 )
AVR 마이크로컨트롤러의입출력포트 ATMega128 의범용입출력포트 : F 포트 (PF7~PF0: 핀 54-61) 내부풀업저항이있는 8 비트양방향입출력단자 AD 변환기혹은 JTAG 인터페이스용단자로도사용. 포트핀 PF7 PF6 PF5 PF4 부가기능 ADC7/TDI(ADC 입력채널 7 또는 JTAG Test Data Input) ADC6/TDO(ADC 입력채널 6 또는 JTAG Test Data Output) ADC5/TMS(ADC 입력채널 5 또는 JTAG Test Mode Select) ADC4/TCK(ADC 입력채널 4 또는 JTAG Test Clock) PF3 ADC3 (ADC 입력채널 3) PF2 ADC2 (ADC 입력채널 2) PF1 ADC1 (ADC 입력채널 1) PF0 ADC0 (ADC 입력채널 0)
AVR 마이크로컨트롤러의입출력포트 ATMega128의범용입출력포트 : G 포트 (PG4~PE0: 핀19, 18, 43, 34, 33) 내부풀업저항이있는 8 비트양방향입출력단자 외부메모리접속을위한스트로브신호용, RTC(Real Time Counter) 타이머용발진기단자로도사용. 포트핀 부가기능 PG4 TOSC1(RTC 오실레이터타이머 / 카운터 0) PG3 TOSC2(RTC 오실레이터타이머 / 카운터 0) PG2 ALE( 외부메모리에주소래치인에이블 ) PG1 RD( 외부메모리에스트로브읽기 ) PG0 WR( 외부메모리에스트로브쓰기 )
실습 1 GPIO 로 LED 켜기
실습 1:GPIO 로 LED 켜기 실습개요 ATmega128 마이크로컨트롤러의 GPIO를이용하여 LED를켜는가장단순한실습 입출력포트를출력으로설정하고, 그포트를이용하여 LED 에신호를보내점등 프로그램이시작하면 1초마다 LED 에불이점등. 실습목표 GPIO 입출력포트의방향제어및출력제어방법습득 LED 동작원리습득 프로그램에서시간지연방법습득
실습 1:GPIO 로 LED 켜기 LED 구조 LED(Light-emitting diode) : 빛을발산하는반도체소자 ( 발광다이오드 ) 순방향에전류를흘리는것에따라전자와정공이재결합하여발광다리가긴부분이양극 (Anode), 짧은쪽이음극 (Cathode) 심볼 패키지형상
실습 1:GPIO 로 LED 켜기 LED 구동방법 정적구동방식 : 각각의 LED 를독립해서구동 동적구동방식 : 여러개의 LED 를매트릭스구조로엮어서함께구동. 정적구동 동적구동
실습 1:GPIO 로 LED 켜기 사용모듈 MCU 모듈, LED 모듈 MCU 모듈포트 E MCU 모듈 LED 모듈 LED 모듈 Signal
실습 1:GPIO 로 LED 켜기 사용모듈의회로 (MCU 모듈 )
실습 1:GPIO 로 LED 켜기 사용모듈의회로 (LED 모듈 )
실습 1:GPIO 로 LED 켜기 모듈결선방법 AVR 모듈포트 E 의 PE0 ~PE7 <-> LED 모듈의 LED 0 ~ 7
실습 1:GPIO 로 LED 켜기 구동프로그램 : 사전지식 LED 를점등하기위해서는 LED 신호에 1 을인가해야함. 즉, MCU E포트에서 1 을출력하도록해야함. MCU E 포트에 1 을출력하려면 입출력포트 E 의 GPIO 방향을출력으로만들어야함. 입출력포트를출력으로선언하려면 DDRx 레지스터 ( 여기서는 E 포트를사용하므로 DDRE 레지스터 ) 에 1 을적어주어야함. PORTx 레지스터 ( 여기서는 PORTE 레지스터 ) 에 1 을적어주어야함.
실습 1:GPIO 로 LED 켜기 구동프로그램 : 소스분석 Led.c #include<avr/io.h> #include<util/delay.h> 1) int main(){ char i; unsigned char LED_Data = 0x00; 2) DDRE = 0xFF; // 포트 E 를 (0~7 비트까지모두 ) 출력포트로사용 3) } while(1){ PORTE = LED_Data; // 포트E를 LED_Data로두고, LED_Data를하나씩늘인다. LED_Data Data++; for(i=0;i<100;i++) _delay_ms(10); // ms단위의딜레이함수 } return 0;
실습 1:GPIO 로 LED 켜기 AVR 시스템헤더파일 헤더파일명 <avr/interrupt.h> <avr/signal.h> <avr/pgmspace.h> <avr/eeprom.h> <avr/wdt.h> 설명 ATmega128의인터럽트에관련된내용을정의 ATmega128에서발생되는신호에관련된내용을정의 ATmega128의프로그램공간에관련된내용을정의 ATmega128의 EEPROM에관련된내용을정의 ATmega128의워치독타이머에관련된내용을정의
실습 1:GPIO 로 LED 켜기 마이크로컨트롤러구동시시간지연방법 반복문에의한시간지연 for-loop 나 while-loop l 를사용하여시간을지연. void delay(unsigned char i){ while(i--); } 혹은 void oddeay(u delay(unsigned sg edchar i){ int k; for(k=0;k<=i;k++) ; } 매우부정확한방법임 (MCU상태, 클럭속도에따라달라짐 ) 그러나가장손쉬운방법.
실습 1:GPIO 로 LED 켜기 마이크로컨트롤러구동시시간지연방법 시스템제공함수를이용하는시간지연 시스템에서소프트웨어적으로제공하는라이브러리함수를이용하여시간지연을하는방법. AVR 개발환경에서제공하는시간지연용함수들은 delay.h라는헤더화일에정의되어있음. _delay_ms(unsigned int i), _delay_us(unsigned int i) 비교적정확한시간지연을얻을수있음. 인터럽트등에의해지연발생이가능함. 하드웨어에의한시간지연 마이크로컨트롤러에서하드웨어로제공하는내부타이머 / 카운터를사용하는방법. 가장정확한방법.
실습 1:GPIO 로 LED 켜기 실행결과
실습 2 스위치눌러 LED 불켜기
실습 2: 스위치눌러 LED 불켜기 실습개요 단순출력이아니고, GPIO 포트를통해신호를입력하여그신호에따라LED의불을켜는실습 스위치모듈의스위치를누르면해당되는 LED 모듈의 LED 가점등되도록함. 입출력포트를스위치쪽은입력으로 LED쪽은출력으로설정하도록함. 실습목표 GPIO 입출력포트의방향제어및입력제어방법습득 스위치동작원리습득
실습 2: 스위치눌러 LED 불켜기 사용모듈 : MCU 모듈, 스위치모듈, LED 모듈사용 MCU 모듈포트 E MCU 모듈포트 B MCU 모듈 LED 모듈 LED 모듈 Signal 스위치모듈 Switch 모듈버튼스위치 Signal
실습 2: 스위치눌러 LED 불켜기 스위치모듈의버튼스위치부회로도
실습 2: 스위치눌러 LED 불켜기 모듈결선방법 포트 E 의 PE0 ~PE7 을 LED 모듈의 LED 0 ~ 7 까지연결 (MCU-LED) 포트 B 의 PB0~PB7PB7 을 Switch 모듈의 BT0~BT7BT7 까지연결 (MCU-Switch)
실습 2: 스위치눌러 LED 불켜기 구동프로그램 : 사전지식 스위치를누르면 1 신호가나오고놓으면 0 신호가나옴. 이신호를입력받기위해서는 MCU의입출력포트를입력으로선언해야함. 즉, 입력으로사용하기로한 MCU B 포트를입력으로선언해야함. 입출력포트를입력으로선언하려면 DDRx 레지스터 ( 여기서는 B 포트를사용하므로 DDRB 레지스터 ) 에 0 을적어주어야함. 스위치모듈의버튼을누른다면 PINx 레지스터 ( 여기서는 B 포트를사용하므로 PINB 레지스터 ) 에 1 이라는값이입력되어들어옴. LED 출력방법은앞의예제와동일
실습 2: 스위치눌러 LED 불켜기 구동프로그램 : 소스분석 Switch.c 1) #include<avr/io.h> int main(){ 2) DDRE = 0xFF; // 포트E를출력포트로사용 (0~7비트까지모두사용 ) DDRB = 0x00; // 포트B를입력포트로사용 (0~7비트까지모두사용 ) 3) while(1){ PORTE = PINB; } /* 포트 E 를포트 B 의핀으로둠 (PORT 는 R/W 모두가능하지만, PIN 은 R 만가능 ) */ } return 0;
실습 2: 스위치눌러 LED 불켜기 실행결과 Switch 모듈의눌러진버튼과같은 LED 의불이점등한다.
실습 3 GPIO 로 FND LED 켜기
실습 3:GPIO 로 FND LED 켜기 실습개요 단순 LED가아닌 FND(Flexible Numeric Display: 7-Segment L ED) 를이용하여숫자를표시하는실습 마이크로컨트롤러의포트를출력으로선언하고, 이포트를 FND 모듈의 7-Segment LED에연결함. 일정시간마다클럭에의해 FND(7-Segment) 에숫자와문자가디스플레이되도록함. 실습목표 GPIO 입출력포트의방향제어및출력제어방법습득 FND LED 동작원리습득
실습 3:GPIO 로 FND LED 켜기 FND(7-Segment LED) 구조 7- 세그먼트는 LED 8 개를그림과같이배열 숫자나간단한기호표현에많이사용됨. 공통 (Common) 단자에인가되는전원에따라서 Common Anode(+ 공통 ) 과 Common Cathode(- 공통 ) 으로분류
실습 3:GPIO 로 FND LED 켜기 FND(7-Segment LED) 구동방법 Common-Cathode 방식 : 각단자에 1 이입력되면해당 LED 가켜짐 7-Segment 에서 16진수표시방법 16 진수 7- 세그먼트의비트값데이터값 H G F E D C B A ( HEX ) 0 0 0 1 1 1 1 1 1 0X3F 1 0 0 0 0 0 1 1 0 0X06 2 0 1 0 1 1 0 1 1 0X5B 3 0 1 0 0 1 1 1 1 0X4F 4 0 1 1 0 0 1 1 0 0X66 5 0 1 1 0 1 1 0 1 0X6D 6 0 1 1 1 1 1 0 1 0X7D 7 0 0 1 0 0 1 1 1 0X27 8 0 1 1 1 1 1 1 1 0X7F 9 0 1 1 0 1 1 1 1 0X6F A 0 1 1 1 0 1 1 1 0X77 B 0 1 1 1 1 1 0 0 0X7C C 0 0 1 1 1 0 0 1 0X39 D 0 1 0 1 1 1 1 0 0X5E E 0 1 1 1 1 0 0 1 0X79 F 0 1 1 1 0 0 0 1 0X71
실습 3:GPIO 로 FND LED 켜기 사용모듈 : MCU 모듈, FND 모듈 MCU 모듈포트 D MCU 모듈 FND 모듈 FND 모듈 Signal
실습 3:GPIO 로 FND LED 켜기 FND 모듈회로 Common-Cathode : (-) 공통
실습 3:GPIO 로 FND LED 켜기 모듈결선방법 MCU 모듈포트 D 의 PD0 ~PD7 을 FND 모듈의 SA_A~SA_H 로연결
실습 3:GPIO 로 FND LED 켜기 구동프로그램 : 사전지식 MCU 모듈의 D 포트를 FND 의불을켜기위한출력포트로설정. DDRx 레지스터 ( 여기서는 DDRD 레지스터 ) 에 1 을적어줌. 표를참조하여 PORTx( 여기서는 PORTD 레지스터 ) 에 1 을출력. 16 진수 7-세그먼트의비트값데이터값 H G F E D C B A ( HEX ) 0 0 0 1 1 1 1 1 1 0X3F 1 0 0 0 0 0 1 1 0 0X06 2 0 1 0 1 1 0 1 1 0X5B 3 0 1 0 0 1 1 1 1 0X4F 4 0 1 1 0 0 1 1 0 0X66 5 0 1 1 0 1 1 0 1 0X6D 6 0 1 1 1 1 1 0 1 0X7D 7 0 0 1 0 0 1 1 1 0X27 8 0 1 1 1 1 1 1 1 0X7F 9 0 1 1 0 1 1 1 1 0X6F A 0 1 1 1 0 1 1 1 0X77 B 0 1 1 1 1 1 0 0 0X7C C 0 0 1 1 1 0 0 1 0X39 D 0 1 0 1 1 1 1 0 0X5E E 0 1 1 1 1 0 0 1 0X79 F 0 1 1 1 0 0 0 1 0X71
실습 3:GPIO 로 FND LED 켜기 1) 구동프로그램 : 소스분석 FND.c #include<avr/io.h> #include<util/delay.h> AVR 입출력에대한헤더파일과 delay 함수사용을위한헤더파일을선언한다 int main(){ unsigned char FND_DATA_TBL[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07, 2) 0x7F,0x67,0x77,0x7C,0x39,0x5E,0x79,0x71,0x08,0x80}; unsigned char cnt=0, i ; 3) DDRD = 0xFF; // 포트 D를출력포트로사용 (0~7비트까지모두사용 ) 4) } while(1){ } FND_DATA_TBL [] : 7-Segment 에표시할글자의입력데이터를저장 PORTD = FND_DATA_TBL[cnt]; cnt++; if(cnt>17) cnt=0; // 테이블크기를초과하는경우방지. for(i=0;i<50;i++) _delay_ms(10); return 0; 출력되는데이터는 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, _,.}
실습 3:GPIO 로 FND LED 켜기 실행결과 프로그램이시작하면 500ms 마다 FND 에 0부터 9, A ~ F 그리고 _,. 을순차적으로출력한다.