AVR - Chapter 5 류대우 davidryu@ewtc.co.kr
I/O (GPIO) 제어 I/0 제어 ATmega128의 I/O 구성및특징 I/O PORT 구성 8비트 / 양방향 / 범용 / 병렬 I/O포트 (PORT A ~PORT F) 6개 5비트 / 양방향 / 범용 / 병렬 I/O포트 (PORT G) 1개 I/O PORT 특징 Read-modify-Write 동작최대구동전류 40mA 풀업저항 (Pull-up resistor) 설정가능
I/O (GPIO) 제어 I/O 관련레지스터 각포트에는 3 개의 I/O 레지스터 (DDRx, PORTx, PINx) 영 역을가짐. DDRA(Data Directio Register) PORT A 의입 / 출력방향설정을위한레지스터 레지스터를 SET(1) 하면출력으로 CLEAR(0) 하면입력으로 설정
I/O (GPIO) 제어 PORTA(Data Register) 출력용데이터값을위한레지스터 PINA(Iput Pis Address) 입력핀에해당하는레지스터로서입력된값을표시
I/O (GPIO) 제어 SFIOR(Special Fuctio I/O Register) Bit2. PUD(Pull-up Disable) 모든포트의풀업저항설정을위한레지스터 1= Disable / 0=Eable
PORT 입 / 출력제어 PORT 출력제어 DDRx 레지스터의각비트를 1 로셋트하면해당포트의핀이 출력핀으로설정 PORTx 레지스터의각비트를 1 로셋트하면해당포트의핀 이 1 값을출력 PORTx 레지스터의각비트를 0 로셋트하면해당포트의핀 이 0 값을출력한다.
I/O 부가기능 I/O 포트의각핀들은대부분기본적인범용 I/O 기능 이외에부수적인기능을가지고있다. PORT A 시분할다중화된데이터버스 하위어드레스버스 PORT B 타이머 / 카운터 SPI PORT C 상위어드레스버스
I/O 부가기능 PORT D 타이머 / 카운터 외부인터럽트 USART1 TWI 직렬통신 PORT E 타이머카운터 외부인터럽트 USART0
I/O 부가기능 PORT F A/D 컨버터 JTAG PORT G 타이머 / 카운터 외부메모리인터페이스
PORT 의기본설정 void port_iit(void) { PORTA = 0x00; DDRA = 0x00; // 입력모드로설정 PORTB = 0x00; DDRB = 0xFF; // 출력모드로설정 PORTC = 0x00; //m103 output oly DDRC = 0x00; PORTD = 0xFF; //PORTD의기본값을 1로출력 DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; PORTF = 0x0F; // 상위 (4~7) 은입력으로, 하위 (0~3) 까지는출력으로설정 DDRF = 0x0F; // 상위 (4~7) 은 0으로, 하위 (0~3) 까지는 1로설정 PORTG = 0x00; DDRG = 0x00; }
외부포트의초기화 void ktm128_iit(void) { EX_SS_DATA=0x00; EX_SS_SEL=0x00; EX_DM_SEL=0x00; EX_DM_DATA=0x00; EX_LED=0x00; EX_STEPPING=0x00; } 위초기화는써줘야한다.
사용자초기화헤더파일 -1 #ifdef KTM128 H #defie KTM128 H #defie EX_LCD_DATA #defie EX_LCD_CONTROL #defie EX_SS_DATA #defie EX_SS_SEL #defie EX_DM_SEL #defie EX_DM_DATA #defie EX_LED #defie EX_STEPPING #defie EX_DCMOTOR #defie EX_SERVO (*(volatile usiged char *)0x8000) (*(volatile usiged char *)0x8001) (*(volatile usiged char *)0x8002) (*(volatile usiged char *)0x8003) (*(volatile usiged it *)0x8004) (*(volatile usiged it *)0x8006) (*(volatile usiged char *)0x8008) (*(volatile usiged char *)0x8009) (*(volatile usiged char *)0x800A) (*(volatile usiged char *)0x800B)
사용자초기화헤더파일 -2 void ktm128_iit(void) { EX_SS_DATA=0x00; EX_SS_SEL=0x00; EX_DM_SEL=0x00; EX_DM_DATA=0x00; EX_LED=0x00; EX_STEPPING=0x00; } void s_delay(it ct){ it i, j; for(i=0; i < ct;i++){ for(j=0; j < 265; j++) ; } }
사용자초기화헤더파일 -3 void delay(it ct){ it i, j; for(i=0; i < ct;i++){ for(j=0; j < 1000; j++) ; } } void l_delay(it ct){ it i, j; for(i=0; i < ct;i++){ for(j=0; j < 2650; j++) ; } } #edif KTM128 H
사용자초기화헤더파일 -4 파일을 KTM128.h 로저장한다. 저장위치 ICC AVR 이설치되어있는폴더의하위폴더인 iclude 폴 더에설치 ( 복사 ) ICCAVR 6.0 기본설치시 : C:\icc\iclude ICCAVR 7.0 기본설치시 : C:\iccv7avr\iclude 이후부터새프로젝트를만들면 #iclude <ktm128.h> 쓰면된다.
LED LED( 발광다이오드 ) 전압이인가되면회로가통하고, 역방향전압이인가되면회를차단하는특징을가짐.
LED LED 양단전압은다이오드순방향전압 (Vd) 인 0.7[V] 가걸리게된다. LED 는 13.03[mA] 에비례하는밝기로불이켜진다.
PORTD 의 LED 제어 LED 회로도 1 일때 LED 가점등함.
PORTD 의 LED 제어
PORTD 의 LED 제어 void mai(void) { iit_devices(); } while(1){ } PORTD = 0x80; delay(100); PORTD = 0x40; delay(100);
4 x 4 매트릭스 LED 4 x 4 매트릭스 LED 제작하기.(0 일때점등 ) A733YC 형이 Low Active
4 x 4 매트릭스 LED LED 배열 PORTx 4 PORTx 6 PORTx 5 PORTx 7 PORTx 0 PORTx 1 PORTx 2 PORTx 3
4 x 4 매트릭스 LED LED 배열 PORTx 4 PORTx 6 PORTx 5 PORTx 7 LED 점등위치 PORTx 0 PORTx 1 PORTx 2 PORTx 3
4 x 4 매트릭스 LED LED 배열 PORTx 4 PORTx 6 LED 점등을위한값설정 PORTx 5 PORTx 7 PORTx 0 PORTx 1 PORTx 2 PORTx 3 1 0 1 1 1 0 1 1
4 x 4 매트릭스 LED 0x D D 0b 1 1 0 1 1 1 0 1
4 x 4 매트릭스 LED LED 배열 (Low Active 가아닐때 ) PORTx 4 PORTx 6 LED 점등을위한값설정 PORTx 5 PORTx 7 PORTx 0 PORTx 1 PORTx 2 PORTx 3 0 1 0 0 0 1 0 0
4 x 4 매트릭스 LED 0x 2 2 0b 0 0 1 0 0 0 1 0
4 x 4 매트릭스 LED 제어 void mai(void) { iit_devices(); } while(1){ } PORTF = 0xDD;
FND 정식명칭 7-Segmet LED 7-segmet Display Multi- Segmeted Display 숫자표시기줄여서통상 FND 라고부른다
FND 제어
FND 기본회로도 (1)
FND 기본회로도 (2) PORTF.0 PORTF.1 PORTF.2 PORTF.3 PORTF.4 PORTF.5 PORTF.6 Vcc Gd PORTF.7
FND 제어
FND 제어 cost char digit[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x 7f,0x67}; void dis(usiged char um) { PORTF =~digit[um]; //NOT게이트 }
FND 매트릭스제어 FND 회로도
FND 매트릭스제어 cost char digit[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x 7f,0x67}; void rusevesegmet(char i,char um) { } EX_SS_SEL = 0x0f; EX_SS_DATA = digit[um]; EX_SS_SEL = ~(0x01 << i);
도트매트릭스
도트매트릭스 크기 10X10, LED : 100 개사용 LED 접속방식
도트매트릭스 Data 신호에첫째줄의데이터를출력하고그줄의 Sel1 신호를 0으로만들어주면첫째줄만켜지게된다. 다음에두번째줄의데이터를출력하고 Sel2 신호를 0으로만들면두번째줄만켜지게된다. 10개를순서대로빠른속도로켜면동시에켜진것으로보이게된다.
도트매트릭스 도트메트릭스출력할데이터만드는방법 도트메트릭스한줄출력 출력값 0x1C6
도트매트릭스 도트메트릭스셀렉트 ( 하위 ) 출력메모리번지 : 0x8004 (Write 전용 ) 7 6 5 4 3 2 1 0 Sel[7] Sel[6] Sel[5] Sel[4] Sel[3] Sel[2] Sel[1] Sel[0] 도트메트릭스셀렉트 ( 상위 ) 출력메모리번지 : 0x8005 (Write 전용 ) 7 6 5 4 3 2 1 0 Sel[9] Sel[8] Sel[] 도트메트릭스 번째줄선택 (H:Eable, L:Disable)
도트매트릭스 도트메트릭스데이터 ( 하위 ) 출력메모리번지 : 0x8006 (Write 전용 ) 7 6 5 4 3 2 1 0 Data[7] Data[6] Data[5] Data[4] Data[3] Data[2] Data[1] Data[0] 도트메트릭스데이터 ( 상위 ) 출력메모리번지 : 0x8007 (Write 전용 ) 7 6 5 4 3 2 1 0 Data[9] Data[8] Data[] 도트메트릭스한줄의데이터 (H:O L:Off) 0x8006, 0x8004 의 Iteger Poiter 를사용하여하위 10bit 를사용하여프로그래밍할수있습니다.
도트매트릭스 도트메트릭스출력포트지정 #defie DM_SEL #defie DM_DATA (*(volatile usiged it *)0x8004) (*(volatile usiged it *)0x8006) 도트메트릭스의 Data 가매핑되어있는 0x8006 번지를 usiged it 형포인터의 포인터변수로지정하고 Sel 신호가매핑되어있는 0x8004 번지를 usiged it 형 포인터의포인터변수로지정한것이다. 앞에 volatile 은해당메모리가레지스터의주소이기때문에해당메모리번지에대 하여최적화를하지않도록컴파일러에게알리는것이다.
도트매트릭스 // 도트메트릭스출력데이터 it dm_data[10] = {0x000, 0x0cc, 0x132, 0x201, 0x205, 0x10a, 0x084, 0x048, 0x030, 0x000}; it dmi=0; // 실행할때마다한줄씩켜짐 void rudotmatrix(void) { } EX_DM_SEL = 0; EX_DM_DATA = dm_data[dmi]; EX_DM_SEL = 1<<dmi; dmi++; if(dmi>9) dmi=0; // 현재출력할줄선택 // dmi 번째줄데이터출력 // dmi 번째줄선택
도트매트릭스 void mai(void) { } while(1){ } rudotmatrix(); delay(10);
숙제 1 다음데이터값을채우시오. 도트메트릭스한줄출력 Data ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) Sel 0x001 0x002 0x004 0x008 0x010 0x020 0x040 0x080 0x100 0x200
숙제 2 다음 LED 가순서대로점등되도록만드시오. 순서는빨강 -> 노랑 -> 파랑 -> 보라 -> 녹색 빨강이점등된후에노랑이점등될때빨강은계속켜져있도록한다. 최종녹색이들어오면빨강부터다시한다. 오른쪽은녹색까지전부점등된화면입니다.
스위치 스위치회로도 (KD-128)
스위치 스위치회로도 (KT-M128)
스위치제어 스위치를눌렀을경우해당비트를 1 로반환한다. 0x 0 2 0b 0 0 0 0 0 0 1 0
스위치제어 void mai(void) { volatile usiged char i, cout=0; volatile usiged char *sw_i; volatile usiged char *led_out; iit_devices(); sw_i=(volatile usiged char *)0x36; led_out=(volatile usiged char *)0x8008; pritf("\\r\\kt-m128 V01\\r"); pritf("traiig Board Lab5 Example.\\r"); } while(1){ *led_out = *sw_i; delay(200); pritf("cout : %d\\r", cout); cout++; }
스위치제어 스위치를 1 번누르면해당 LED 가점등되고, 다시 1 번 누르면소멸되게작성하시오.
스위치채터링 스위치를한번을눌렀을경우에도여러번눌렀다고판 단한다. 스위치를누른횟수는크리스탈클럭과시간에비례한다. 여러번눌렸을경우한번만인식하기위해채터링을 사용한다. 채터링의종류 선채터링 후채터링
선채터링예제 채터링으로인하여대기한후, 스위치를떼고나면처리내용을실행 스위치에서누르고있는경우 while 에서대기, 떼고나면처리내용실행 if(pinb & 0b00010000){ while(pinb & 0b00010000) ; // 처리내용 }
후채터링예제 처리내용이 1 번실행되고, 채터링으로인하여다음명령어를실행하지못하게함. 처리내용을먼저실행후 while 에서대기 if(pinb & 0b00010000){ // 처리내용 while(pinb & 0b00010000) ; }
4 x 4 위치 ( 키 ) 매트릭스 회로도
4 x 4 스위치 ( 키 ) 매트릭스 스위치배열 PINx 4 PINx 6 PINx 5 PINx 7 키누른위치 PINx 0 PINx 1 PINx 2 PINx 3
4 x 4 스위치 ( 키 ) 매트릭스 스위치배열 PINx 4 PINx 6 키값설정 PINx 5 PINx 7 PINx 0 PINx 1 PINx 2 PINx 3 1 0 1 1 1 0 1 1
4 x 4 스위치 ( 키 ) 매트릭스 스위치배열 PINx 4 PINx 6 PINx 5 PINx 7 PINx 0 PINx 1 PINx 2 PINx 3 1 0 1 1 1 0 1 1 1. 하위 4 비트를먼저읽어온다.
4 x 4 스위치 ( 키 ) 매트릭스 스위치배열 PINx 4 PINx 6 PINx 5 PINx 7 2. 상위 4 비트를읽어온다 PINx 0 PINx 1 PINx 2 PINx 3 1 0 1 1 1 0 1 1
4 x 4 스위치 ( 키 ) 매트릭스 usiged char PORTC_KEY(){ usiged char left, right, result; DDRC PORTC left = 0x0F; = 0x0F; = PINC; DDRC = 0xF0; PORTC = 0xF0; right = PINC; } result retur = left right; result;
숙제 스위치 ( 키 ) 매트릭스와 LED 매트릭스를연결하여, 매 트릭스로누른키와매칭되는 LED 매트릭스의 LED 를 점등시키시오. (KD-128) 스위치 ( 키 ) 매트릭스를눌렀을경우해당키가 2 x 2 라고가정할때, FND 를이용하여 22 라고표현될 수있도록작성하시오.(KT-M128)