유리한과 함께하는 AVR로 임베디드 개념쌔우기 - Chapter 3.Hello World! (Ver. 0.1)프로그래밍 세계 입문에 Hello World! 가 있다면
임베디드 세계에는 LED 깜빡이기가 있다.
일단 뭔진 몰라도 ATMega128의 pinout을 보자.

atmega128칩의 다리에 대한 내용이지.
PA0부터 PG4까지가 입출력 포트이고
나머지는 전원 넣어주고 접지시켜주고 리셋시켜주는 용도로 사용하는 핀들이야.
일단 실습에서 입출력관련해서 사용할 레지스터는 PORTx , DDRx, PINx 세가지.
그럼 형이 발로 그린 회로도를 보도록 하자.
P0~P7이 보이고 저항타고 LED 타고 GND(접지.극성으로 치면 -)로 빠지지?
저항은 330을 달도록 하자.저항 색은 등등갈흑이 되겠네. 칩저항이라면 331.혹은 3300.
ATMega128(이하 128)은 포트가 총 7개가 있는데 PG는 좀 특별해. 쓰지 말도록 하자..
(기억이 잘 안나..뭐가 특별했었는지..ㅡㅡ;; 하여간 핀이 8개가 아니니 실습하기 애매하다.)
8비트 프로세서 답게 포트 하나당 핀이 여덟게. 즉 8비트 인거지.
(32비트인at91sam7s(arm7)의 경우 포트가 하나뿐이지만.. PA0~PA31까지..핀수가 조낸 많다.)
회로도의 P0~P7을 커넥터 처리하던지 그냥 점프 날리던지 해서
128의 Px0~7까지 엮어주자.
난 PD0~7에 엮었다고 치고 계속할께.
(일단 PD는 PORTD의 줄임말이야.)
일단 기본 소스부터 보여줄께.
#include<avr/io.h> //필수적으로 include시킨다 입출력 관련 헤더파일이다.
int main(void)
{
DDRD=0xff;
PORTD=0xff;
while(1); // 임베디드는 특성상 프로그램이 종료되면 어디로 튈지 모른다..그래서 종료시키지 않는다.
return 0; // 그래도 표준지킨다고 main이 int형이 아니면 워닝을 쏟아낸다.
}
/*
아.. 생각해보니 툴 쓰는법도 안알려줬구나..
그건 내일 시간내서 하기로 하자.ㅎㅎ;;
*/
기껏해야 8줄짜리 코드..
나머지는 다 알테고..
DDRD는 뭐고 PORTD는 뭐냐?
자. 일단 헤더파일을 디벼보자.
/* Input Pins, Port D */
#define PIND _SFR_IO8(0x10)
/* Data Direction Register, Port D */
#define DDRD _SFR_IO8(0x11)
/* Data Register, Port D */
#define PORTD _SFR_IO8(0x12)
이것만 간추렸다.
그럼또 _SFR_I08이 뭐냐? 가 문제가 되겠지?
또 뒤져보다보면
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + 0x20)
이 발견된다
그렇다면 DDRD는 결국 0x11+0x20. _MMIO_BYTE(0x31)이라는 얘기?
가도가도 끝이 안보인다.
하지만 이제 마지막..
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
이라고 되어있다.
저멀리 돌아돌아왔지만 결국
*(volatile uint8_t *)(0x31) 이네?
(uint8_t는 unsigned char 타입이라는뜻.언사인드 인트 8bit type.)
*(volatile uint8_t *)(0x31)=0xff라는 뜻인데..
별이 두개씩나 나왔으니 눈앞이 어지럽지?
그냥 풀어 말하면 0x31이라는 주소에 0xff라는 값을 넣으라는거다.
이해가 안된다고?
unsigned char* DDRD=0x31;
*DDRD=0xff;
쯤으로 이해하면 이해되나?(근데 저렇게 쓰면 에러날게다.)
그럼 0x31에는 뭐가 들어있는걸까?
자, 128의 메모리 구조를 보자.
보다시피 0xff까지는 레지스터영역이다.
그럼 레지스터라는 얘기겠고..
0x31에 해당하는 레지스터를 찾아봤더니
DDRD가 맞구나! (괄호안에 들어있는게 절대주소. 괄호밖에 있는게 offset주소.)
그럼 데이터시트를 다시 뒤져서 I/O 쪽을 뒤져봤더니,, 레지스터에 대한 설명이 있다!

PORTD 는 데이터 레지스터. R/W 가능하고 초기값은 0이고..
DDRD는 데이터 입출력 방향을 결정한다네. (1이면 출력 0이면 입력)
PIND는 입력 전용이고 Read만 가능한 놈이라고 써있다.
고로 DDRD=0xff; 는 PORTD를 모조리 출력핀으로 쓰겠다는 말씀 되겠다.
PORTD는 더 설명할 필요 없지?
0xff를 줬으니 모든 led에 불이 들어온다!
(0xff는 1111 1111 이다. avr을 하다보면 2진수,16진수랑 친해지게 될거다.
진수 개념 없으면 때려쳐!! )
그럼 0xaa를 주면 1010 1010 이니 한놈걸러 한놈씩 들어와 있겠지?
한개의 비트가 한개의 핀을 책임진다!
1을 주면 5v신호가 나가고 0을 주면 0v에 수렴하는 전압이 나간다.
이 개념만 잡는다면 avr은 이미 발 아래에 와있는거다!
이래저래 복잡하게 설명한것 같지만..
세줄 요약 해줄께.
DDRx 는 x포트의 입출력을 결정한다.
PORTx에 데이터를 넣으면 외부로 출력이 나간다.
프로세서는 입출력만 할줄 알면 60%는 끝난거다.
일단 내일 출근해야되니까 이정도만 해서 올리고 자야겠다.
내일 수정겸 툴 사용법까지 올릴께.
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.