본문 바로가기

AVR(ATmega128)로 장난하기

AVR(ATmaga128)로 8스위치 장난하기




안녕하세요 고군입니다~

이번 시간에는 입력부품으로 가장 흔하게 사용되는 택트 스위치에 관하여 알아보겠습니다. 먼저 스위치구조와 원리에 대해 알아보고 AVR로 테스트를 해보겠습니다.



1. 택트 스위치 특성 및 전자 회로



그림1. 택스스위치 외형 및 내부 결선도


그림1은 택스스위치의 외형과 내부 결선도를 보여줍니다. 택트 스위치는 종류도 많고 모양도 다양한데 4핀으로 구성된 스위치는 위와 같이 생겼다고 생각하시면 됩니다. 택트 스위치의 내부 결선도를 보시면 1,2 그리고 3,4은 내부적으로 하나로 연결되 있습니다. 그러니 1,2번이나 3,4은 스위치를 누르던 누르지 않던 항상 연결될어 있습니다. 스위치를 ON/OFF로서 사용하기 위해서는 1,2과 3,4에 독립적으로 회로를 구성해 주시면 됩니다. 




그림2. 택스스위치 여러형태듸 결선 방법


택트스위치 결선은 가장 흔하게 저지르는 실수 중 하나입니다. 택트 스위치 외형을 잘 보시고 연결시 항상 주의 하시기 바랍니다.


2. 택트스위치 제어에 사용되는 디지털 출력 레지스터


그림3. 8스위치 제어를 위한 입/출력 관련 레지스터


DDRx 레지스터는 포트의 입출력 방향을 결정하는 레지스터이며 DDRxndml 비트값이 0이면 입력, 1이면 출력으로 설정됩니다. Atmega128에서 레지스터는 0~7번까지 8비트가 존재합니다. PORTx 레지스터는 포트에 출력할 논리 값을 저장하는 레지스터이며 x는 포트명입니다. PINx는 DDRx레지스터, PORTx 레지스터 등과는 달리 포트의 논리를 읽을 수 있는 어드레스이면 x는 포트명입니다.


3. AVR 연습용 키트를 사용한 실제 8스위치 블록 전자회로


그림4. 8스위치 블록

그림5. 8스위치 회로 연결도


그림 5에서 10k옴 어레이 저항은  스위치가 눌리지 않았을 때 포트의 디지털 값을 1로 하기 위한 풀업 저항이며, 스위치 아래 연결한 콘덴서는 스위치 ON/OFF 될 때 발생하는 채터링(스위치가 짧은 시간동안에 반복적으로 ON/OFF가 되는 현상)을 방지하기 위해 연결되었습니다. 1k옴의 연결은 디지털 입출력 할 때 없어도 됩니다. 그러나 8스위치가 연결된 포트가 ISP 기능을 가졌을 때 프로그래밍 하는데 간섭이 일어나지 않도록 분리하기 위한 목적으로 연결하였습니다.



그림6. 8스위치 입력 테스트를 위한 회로 연결


4. AVR 예제 코드


>> 예제1. 8스위치에서 입력된 값에 따라 해당되는 LED가 토글되게 하기.


[단계 1] AVR Studio4로 Project를 생성하고, C언어 소스 작성하기 링크


AVR Studio4 편집 화면에 아래 C언어 소스 프로그램을 작성하여 화일명.c로 저장합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// ATmega128의 레지스터 등이 정의되어 있음
#include <avr/io.h>
#include<util/delay.h>
 
// C 언어의 주 실행 함수
int main(void){
    unsigned char led = 0B11111111;
    unsigned char key;
    // 포트 A의 방향 설정, 0 : 입력, 1 : 출력
    DDRA = 0B11111111;
    // 포트 C의 방향 설정, 0 : 입력, 1 : 출력
    DDRC = 0B00000000;
 
    PORTA = led;
    // while 블록 안의 문장을 무한 반복
    while(1){
        // 스위치 상태를 읽고 key 변수에 저장
        key = PINC;        
        // 스위치 상태에 따라 led 변수 토글
        led ^= ~key;        
        
        // LED와 연결된 포트 A에 led 변수의 토글 상태 출력
        PORTA = led;        
 
        // 스위치가 모두 떨어질 때 까지 대기
        while(0xFF != PINC);    
        _delay_ms(10);    // 10ms 동안 대기
    }
 
    // 함수의 형태와 같이 정수형(int)의 값을 반환함
    return 1;
}
 
cs


[단계 2]AVR Studio 4로 C언어 소스프로그램을 빌드한다링크
[단계 3]AVR Studio 4로 타겟보드에 라이팅을 한다. 링크