ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Atmega128 - 장애물 피하기 게임 만들기(1)
    공부 2022. 9. 30. 16:45

     

    본 포스팅은 작성자가 2021년에 수강했던 마이크로프로세서 강의에 제출한 과제를 바탕으로 작성되었으며, 현재와 문법이 다를 수 있습니다. 또한 학부 수준의 지식으로 작성되었기에 틀린 부분이 존재할 가능성이 다분합니다.

    .

    .

     

    Atmega128을 이용하여 장애물 피하기 게임을 만들 것이다. 게임은 16$\times$2 LCD에 디스플레이 한다. 주인공은 LCD의 가장 왼쪽에 위치하며, 스위치를 누를 때마다 외부 인터럽트를 발생시켜 위, 아래로 이동한다. 장애물은 LCD의 가장 오른쪽에서 생성되어 왼쪽 방향으로 한 칸씩 이동하는데, 스위치를 눌러 주인공을 이동시키며 장애물을 피하는 게임이다.

     

    - 게임 진행 설명

    Atmega128에 전원을 연결하면 LCD에 "HURDLE GAME"이라는 문구가 나타난다. 이 때 스위치를 누르면 게임이 시작된다. 처음 생명은 2로 시작하며, 생명은 게임이 진행되는 동안 FND에 표시된다.

    게임이 시작되면 스위치를 눌러  ' o '로 표시되는 주인공을 위, 아래로 이동시키며 ' * '로 표시되는 장애물을 피해야한다. 장애물과 부딪힌다면 생명이 1 감소하고 1초간 부저가 울린 후 게임이 재개된다.

    게임이 진행되면서 장애물의 생성확률은 점점 증가한다. 이외의 요소로 인하여 실제 확률은 더 낮지만 기본적인 확률은 1 라인당 1/9로 시작하며 게임이 진행되면서 최대 1 라인당 1/2 까지 증가한다.

    장애물 뿐만 아니라 생명또한 생성된다. 생명은 ' + '로 표시되며 생명을 얻는다면 생명이 1 증가하고 0.02초간 부저가 울린 후 게임이 재개되는데, 굉장히 짧은 시간이라 부저가 울리는 동안의 정지가 체감이 되진 않는다. 생명의 생성 확률은 1 라인당 1/200로 일정하며, 생명이 8 이상이면 더 이상 생성되지 않는다.

    생명이 0이 되면 LCD에 "GAME OVER"라는 문구가 나타나며 FND에 점수가 표시된다. 점수의 기준은 장애물이 한 칸 움직일 때마다 1점씩 증가한다. 또한 "GAME OVER" 화면에서 스위치를 누르면 생명, 장애물 생성확률, 점수가 초기화되며 게임이 재시작된다.

     

     - 인터럽트

    atmega128에는 여러 종류의 인터럽트가 있다. 프로젝트에서 쓰일 인터럽트는 외부 인터럽트인데,  atmega128에는 8개의 외부 인터럽트 pin이 있다.

    외부 인터럽트를 활성화하기 위해서는 먼저 EIMSK에 값을 할당해야한다. EIMSK에 할당하는 값에 따라 8개의 외부 인터럽트 pin 중 일부만 선택하여 활성화할 수 있는데, 이 프로젝트에서는 PD0에 스위치를 연결하였기 때문에 EIMSK에 16진수 01을 할당하여 INT0만 활성화하였다.

    외부 인터럽트의 발생 순간은 EICRA, EICRB에 값을 할당함으로써 설정한다. EICRA는 INT0, INT1, INT2, INT3의 인터럽트 발생 순간을 설정하고, EICRB는 INT4, INT5, INT6, INT7의 인터럽트 발생 순간을 설정한다.

    인터럽트 발생순간은 3가지가 있는데, 전압 레벨이 음(-)일 때, 하강 에지일 때, 상승 에지일 때가 있다.

    이 실험에서는 PD0에 스위치를 연결하였고, 스위치를 누르는 순간의 전압 레벨은 하강 에지이다.

    따라서 스위치를 누르는 순간 인터럽트를 발생시키기 위해서는 INT0의 전압 레벨이 하강 에지일 때 인터럽트를 발생시켜야 하므로 EICRA에 16진수 01을 할당하였다.

     

     - LCD

     직접 빛을 내지 않고 외부 입사광을 산란, 간섭, 변조 시키는 소자에 의한 화상 표시장치이다.

    LCD는 VSS(전원 GND), VDD(전원5V), VEE(화면 밝기 조정용 단자), RS(Register Select), R/W(읽기/쓰기 단자), E(Enable), DB0~7(Data Bus), LED A(광원 애노드), LED K(광원  캐소드)로 구성되어있다.

    이 중에서 RS, R/W, DB0~7에 코드를 넣어 화면 클리어, 문자 입력 모드, 디스플레이 on/off 제어, DDRAM, CCRAM 주소 설정 등을 동작명령 할 수 있다.

     

    - 피에조 부저

    피에조 부저는 피에조 효과를 이용하여 음파를 발생시키는 장치이다. 피에조 효과란 기계적인 압력을 가하면 전압이 발생하고, 전압을 가하면 기계적인 변형이 발생하는 현상이다. 이를 이용해서 부저에 교류전압을 가하면 진동판이 진동하며 음파를 발생시킬 수 있다. PW신호는 디지털 소스를 사용하여 아날로그 신호를 생성하는 방법이다.

    피에조 부저에는 능동부저와 수동부저가 있다. 능동부저는 부저에 전원만 공급하면 음파가 발생하며, 지정된 주파수의 음파만 발생된다. 수동부저는 부저에 교류신호를 인가하여야 음파가 발생하며, 인가하는 교류신호의 주파수에 따라 다양한 주파수의 음파가 발생된다. 프로젝트에서 사용할 부저는 수동부저이다.

     

    - FND

    FND는 7개의 선분과 1개의 소수점으로 구성되어 있으며, 0~9의 숫자를 표현할 수 있고, 4자리 FND를 활용하여 0~9999까지의 숫자를 표현할 수 있다.

    프로젝트에서 사용할 FND는 공통 애노드 구조이다. 공통 애노드 구조는 공통단자에 양(+)의 전압레벨을 인가하고 a, b, c, d와 같은 조명단다에 음(-)의 전압레벨을 인가하면 전류가 흘러 불이 켜진다. 예를 들어 공통단자에 양의 전압레벨을 인가한 후 a, b, c, d, g에는 음(-) 나머지에는 양(+)의 전압레벨은 인가하면 a, b, c, d, g에 불이 켜지며 숫자 3이 나타난다.

     

    - 잔상효과

    프로젝트에서 FND는 0부터 9999까지의 숫자를 나타낼 수 있어야 한다.

    위는 프로젝트에서 사용될 FND 장치의 회로도인데 A, B, C, D, E, F, G, DP의 단자가 한개씩 밖에 없어서 한 번에 한 가지의 숫자밖에 출력하지 못한다. 다만 각 FND에 숫자를 빠르게 번갈아가며 출력하기를 반복하면 각각 다른 숫자가 계속해서 켜져 있는 것처럼 보인다. 이를 잔상효과라 하는데, 이 프로젝트에서는 잔상효과를 이용하여 0부터 9999까지의 숫자를 나타낼 것이다.

    댓글

Designed by Tistory.