ATmega128에는 디지털 데이터를 출력하기 위해 사용되는 레지스터로는PORTA~PORTG의 범용 레지스터가 있다 이중 포트 G는 5개의핀만 존재하며, 이중에서도 상위 3비트는 사용할 수 없다.
PORTA~PORTF비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
비트 이름 | PORTx7 | PORTx6 | PORTx5 | PORTx4 | PORTx3 | PORTx2 | PORTx1 | PORTx0 |
읽기/쓰기 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
초기값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PORTG
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
비트 이름 | - | - | - | PORTG4 | PORTG3 | PORTG2 | PORTG1 | PORTG0 |
읽기/쓰기 | R | R | R | R/W | R/W | R/W | R/W | R/W |
초기값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ATmega128에서 데이터 출력 혹은 입력을 위해선 PORTx 레지스터를 사용한다. 하지만 역할에서와 같이 읽기/쓰기 둘가 가능하기 때문에 해당 포트를 자신이 원하는 목적에 맞게끔 설정 해줘야한다.
따라서 이때는 DDRx (x= A~G)라는 래지스터를 사용하여 역할을 정한다.
각 DDRx를 1로 설정할 경우 출력, 0으로 출력할 경우 입력으로 설정된다.
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
비트 이름 | DDx7 | DDx6 | DDx5 | DDx4 | DDx3 | DDx2 | DDx1 | DDx0 |
읽기/쓰기 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
초기값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PORTG
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
비트 이름 | - | - | - | PORTG4 | PORTG3 | PORTG2 | PORTG1 | PORTG0 |
읽기/쓰기 | R | R | R | R/W | R/W | R/W | R/W | R/W |
초기값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
즉 포트를 사용하고자 할떄 먼저 DDRx를 사용하여 원하는 포트 (A,B,..,G)를 입출력 제어(0x00~0xff : G포트는 0x1f까지) 설정후
PORTx를 통하여 실제 입출력 신호를 정해주어야 한다.
//ATMEGA 128 LED ON OFF
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB=0xff; //포트 B 출력용 으로 선언
while(1){
PORTB=0xff; //전체 LED ON
_delay_ms(100); //100ms
PORTB=0x00; //전체 LED OFF
_delay_ms(100);//100ms
}
}
-LED SHIFT 제어 (순서대로 점등 반복)-
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB=0xff;
unsigned char i=0x01;
while(1){
PORTB=i;
i=(i<<1)|(1>>7);
_delay_ms(100);
}
}