본문으로 바로가기

ATmega128 입출력 제어

category MCU/AVR 2019. 4. 22. 23:54
반응형

오늘 포스팅할 내용은 ATmega128 입출력 제어입니다. ATmega128 데이터시트를 보면 I/O Ports에서  Register Description for I/O Ports에서 입출력 관련 레지스터에 대해 자세히 나와있습니다.




PORT Configuration 

- ATmega128의 포트 입출력 방향은 DDRx 레지스터로 설정가능합니다. 종류는 DDRA, DDRB, DDRC, DDRD, DDRE, DDRF, DDRG로 총 7가지 입니다. 각 포트의 출력은 PORTx 레지스터로 DDR레지스터와 동일하게 PORTA, PORTB, PORTC, PORTD, PORTE, PORTF, PORTG 총 7가지가 있습니다.



PORTx/DDRx Register

- PORTx, DDRx 레지스터는 MCU 각 핀에 대응되는 설정값입니다. DDRA의 값을 '0'으로 하게 되면 A 핀이 입력이 설정되고 '1'로 하게 되면 출력이 설정됩니다. 데이터 방향이 출력일 때 PORTA의 값이 '1'이 되게 되면 A 핀에서 High를 출력하게 되고 '0'이 되게 되면 Low를 출력하게 됩니다.


PORT 출력 예제


1. PORTA의 모든 핀을 출력으로 설정하게 되면?

- DDRA = 0xFF("1 1 1 1 1 1 1 1")가 된다.


2. PORTA0만 출력으로 설정하게 되면?

- DDRA = 0x01("0 0 0 0 0 0 0 1")가 된다.


3. DDRA = 0xFF 일 때 PORTA4와 PORTA0만 High로 설정하게 되면?

- PORTA = 0x11("0 0 0 1 0 0 0 1")가 된다.


4. DDRA = 0xF0 일 때 PORTA = 0xFF를 설정하게 되면?

- 상위 4bit는 "High"이된며, 하위 4bit는 풀업이 됩니다.


5. DDRA 모든 포트 출력, PORTA 5번 핀만 "High" 구현.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <avr/io.h>
 
 int main(void)
 {
    DDRA = 0xFF// 모든 포트 출력으로 설정.
 
     /* Replace with your application code */
     while (1)
     {
        PORTA = 0x20// 5번만 High
     }
     return 0;
 }




PINx Register

- 입력으로 설정되어 있는 포트의 상태(High or Low)를 읽는 레지스터입니다.  


PORT 입력 예제


1. PORTF의 모든 핀을 입력으로 설정하게 되면?

- DDRF = 0x00("0 0 0 0 0 0 0 0")가 된다.


2. PORTF의 0번 핀과 4번 핀만 입력으로 설정하게 되면?

- DDRF = 0xEE("1 1 1 0 1 1 1 0")가 된다.


3. PORTF0에 스위치(입력)를 이용해 스위치가 ON일 때 PORTA Low, 스위치가 OFF일 때 PORTA High 구현.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <avr/io.h>
 
 int main(void)
 {
    DDRA = 0xFF// 모든 포트 출력으로 설정.
    DDRF = 0x00// 모든 포트 입력으로 설정.
 
     /* Replace with your application code */
     while (1)
     {
        if(PINF == 0x01)
            PORTA = 0x00;
        else
            PORTA = 0xFF;
     }
     return 0;
 }



반응형