안녕하세요 이번에 atmega128 개발 키트를 구매하게되서 예전에는 atmel7 스튜디오였던 개발툴인 Microchip Studio를 설치해보고 프로젝트를 생성하여 스위치 제어 LED 출력을 해볼겁니다 재가구매한 키트는 아래 사진과같습니다.
먼저 아래 주소에 접속해서 설치를 진행해줍니다.
다운로드 받은 설치파일을 실행하면 아래 사진처럼 뜨는데 동의체크박스와 Next를 눌러주면서 설치를 진행합니다.
중간에 드라이버 설치창이뜨면 ok를 눌러야 설치가 계속진행하니 유의하세요
설치가 완료되고 마이크로칩 스튜디오를 열면 아래 화면이 나오는데 여기서 New Project를 클릭하여 프로젝트를 생성합니다.
프로젝트를 생성하기위해 GCC C Executable Project를 선택하고 솔루션과 프로젝트이름을 정해주고 OK를 눌러줍니다.
그리고 MCU를 선택하는데 ATmega128이니까 당연히 그에 맞게 선택해야하죠
이제 아래 화면처럼 main.c 화면이 뜨면서 코드를 작성할수있는 프로젝트가 만들어졌습니다.
개발 키트를 USB-mini-to-USB-A 케이블를 사용하여 PC와 연결해주고 Add target을 STK500, 컴포트를 맞춰 Apply해줍니다.
그리고 Selected debugger/programmer에서 STK500, ISP로 설정해줍니다.
그리고 메인함수에서 아래 사진처럼 코드를 작성합니다.
코드에 대해서 설명을하자면 먼저 DDRx라는 레지스터가 있는데 GPIO 핀의 input/output 모드 설정하는 값이라고 이해하면 편합니다.
LED1~8은 PA이기 때문에 DDRA로 설정하고 SW1, SW2는 PE이기 때문에 DDRE 설정하는 거죠(x에 포트 이름을 넣으면 된다)
Atmega128의 DDRx 레지스터는 8bit입니다. 각 포트의 PIN과 1:1로 대응되고 해당 비트가 '1'이면 Output, '0'이면 input 모드로 동작을 하죠 LED와 같은 경우 출력 모드로, SW는 입력 모드로 설정되어야 합니다.
그리고 LED 회로도를 보면 PortA가 High(1)일때 켜진다는걸 확인하고 Swith같은경우 눌렀을때 Low(0)라는 논리값을 받을수있다는걸 확인하고 코드를 작성해야합니다.
그런데 코드를 보면 의문들 겁니다. DDRx라는 레지스터가 입출력 모드 설정하는 값이라는 걸 알겠는데
그렇다면 DDRA = 0xFF; DDRE = 0x00;으로 하면 되지 않나? 라는 생각이 말이죠
엄밀히 따지면 맞습니다. 저렇게 코드를 작성해도 스위치를 사용한 LED 출력 기능은 전혀 문제없습니다.
그런데 굳이 비트 연산자를 사용하느냐?
그 이유는 레지스터 비트 중 자신이 제어하고 싶은 비트만 건드는 것에 익숙해져야 하기 때문입니다.
PE를 예로 설명하자면 SW1, SW2가 4,5비트에 할당돼있으니 나머지 비트는 초기값이 High 인지 low 인지 알 필요가 없고 건들 필요가 없습니다. 그런데 DDRE = 0x00;으로 작성하게 되면 4,5뿐만 아니라 나머지 0,1,2,3,6,7 비트도 입력 모드로 설정해 버린다는 거죠 불필요한 행동이고 나중에 코드량이커졌을때 재수 없으면 버그가 생길 수도 있겠죠ㅎㅎ;
그래서 내가 원하는 핀의 비트를 설정하기 위해서 PE 비트의 초깃값이 우리는 뭔지 모르니 (XXXX XXXX)라고 가정해봅시다. 여기에 0xCF(1100 1111)를 &연산한 값을 할당을 하게 되면 XXXX XXXX & 1100 1111 = XX00 XXXX 즉 4,5비트를 0으로, 그 외 비트들은 초깃값 그대로 설정하겠다 라는 것입니다.
동일하게 DDRA도 0xFF(1111 1111)와 or 연산을 하여 1111 1111로 설정한다는 뜻이 되겠고요
while 문은 첫번째 조건문만 설명하고 넘어갈게요 SW1이 눌렸을때 LOW(0) 논리값을 받으니 조건문에서 0을 받았는지 안받았는지를 확인해야하죠
역시 &(AND)연산자를 사용해서 안눌렸을때 => XXX1 XXXX & 0001 0000 == 0x10,
눌렸을때 XXX0 XXXX & 0001 0000 == 0x00 를 통해서 알수있죠
코드설명은 여기까지하고 마지막으로 결과영상으로 글을 마치겠습니다.
'atmega128' 카테고리의 다른 글
Atmega128 uart 통신을 해보자2 (0) | 2021.09.13 |
---|---|
Atmega128 UART 통신을 해보자 (0) | 2021.09.12 |