소스로 보는 ATmega8535 – 2부. I/O Port
© tapitolife
1. I/O 포트의 구성
ATmega8535는 4개의 입/출력 포트가 지원됩니다. 각 포트는 8비트로 구성되어 있으므로 한 번에 4바이트의 데이터를 동시에 처리할 수 있죠.
그림 1. Pinout of ATmega8535
표 1. 각 핀에 대응하는 2진 값
핀 이름 |
Px7 |
Px6 |
Px5 |
Px4 |
Px3 |
Px2 |
Px1 |
Px0 |
2진 값 |
2^7 |
2^6 |
2^5 |
2^4 |
2^3 |
2^2 |
2^1 |
2^0 |
포트와 관련된 레지스터로는 DDRx, PORTx, PINx가 있습니다.
1) DDRx
포트의 방향을 설정합니다. 1이면 출력 전용, 0이면 입력 전용이며 각 핀별로 따로 설정할 수 있습니다.
코드 1. DDRx 사용 방법
01 : |
DDRA = 0b11110000; |
이 경우 그림과 같이 상위 4비트는 출력 전용, 하위 4비트는 입력 전용으로 설정됩니다.
그림 2. DDRx의 I/O 방향 설정
2) PORTx
PORTx는 ATmega8535에서 나가는 데이터를 저장하는 레지스터입니다. 이 레지스터를 읽거나 씀으로써 실제로 입/출력이 가능합니다. DDRx를 위와 같이 설정한 경우의 활용 예를 볼까요?
코드 2. PORTx 사용 방법
01 : |
PORTA = 0b11010000; |
이렇게 하면 상위 4비트를 통해 ATmega8535로부터 이진수 1101이 출력됩니다.
반대로 PORTA의 값을 읽어올 수도 있습니다.
3) PINx
PINx는 ATmega8535로 들어오는 데이터를 저장하는 레지스터입니다. 프로그램은 이 위치에서 값을 읽을 수만 있고 새로 쓰지는 못합니다. 입력 전용으로 설정된 핀에 데이터가 입력되면 1, 아니면 0을 나타냅니다. 출력 전용 핀에 대해서는 PINx의 값이 의미가 없습니다.
2. I/O 포트 테스트해보기
아래 예제는 PORTC에 연결된 누름 스위치를 누를 때마다 PORTA에 연결된 LED의 점멸 상태가 바뀌는 회로입니다.
코드 3. main.c
#define F_CPU 16000000 #include <avr/io.h> #include <util/delay.h> int portcnt(int *); int main() { int portA = 0b00000001; int pinC; DDRA = 0b11111111; DDRC = 0b00000000; PORTA = portA; while(1) { pinC = PINC & 0b00000001; if(pinC != 0) { PORTA = portcnt(&portA); _delay_ms(50); } } return 0; } int portcnt(int * value) { if(*value == 0b00001000) *value = 0b00000001; else *value = *value << 1; return *value; }
코드 4. I/O 포트 실습 회로
완성된 회로는 이렇습니다. → |
|
← 시스템 클럭은 16MHz입니다. |
'Embeded Programming > AVR' 카테고리의 다른 글
tapito의 AVR 정복기 - 4부. RAM을 이용한 스택 구현 (0) | 2012.01.14 |
---|---|
tapito의 AVR 정복기 - 3부. RAM (4) | 2012.01.09 |
CodeVision과 AVR Studio간의 인터럽트 비교 (0) | 2011.12.18 |
소스로 보는 ATmega8535 – 1부. AVR에 HEX 파일 굽기. (2) | 2011.12.11 |
ATmega 굽기 성공! (6) | 2011.12.11 |