아트메가/이론

아트메가128의 DDRx,PORTx,PINx,포트특징 알아보기

원원 2017. 5. 24. 20:59

*포트 특징

아트메가128를 보면 각 핀에 이름이 붙여있습 니다. 먼저 51번핀을 본다면 PA0(AD0)이라고 적혀있는데 PA0는 포트A의 첫번째포트를 의미합니다. 또한 AD0은 그 포트의 특수 

기능을 의미합니다.

포트

대체 기능

포트A

외부 메모리 데이터 버스(Data Bus)

외부 메모리 하위 어드레스 바이트 버스(Address Low Byte)

포트B

타이머/카운터 0(OC0)

타이머/카운터 1(OC1A,OC1B,OC2/OC1C)

SPI(MISO,MOSI,SCK,SS)

포트C

외부 메모리 상위 어드레스 바이트 버스(Address High Byte)

포트D

타이머/카운터 1(T1,ICP1)

타이머/카운터 2(T2)

외부 인터럽트(INT0,INT1,INT2,INT3)

USART1(XCK1, TXD1, RXD1)
TWI 직렬통신(SDA,SCL)

포트E

타이머/카운터3(T3,ICP3,OC3A,OC3B,OC3C)

외부 인터럽트(INT4, INT5, INT6, INT7)

USART0(XCK0, TXD0, RXD0)

아날로그 비교기(AIN0[p],AIN1[n]

SPI(PD0,PDI)-ISP

포트F

ADC 입력 채널(ADC0~ADC7)

JTAG(TDI, TDO, TMS,TCK)

포트G

타이머/카운터 0(TOSC1, TOSC2)-RTC

외부메모리 인터페이스(ALE,/RD,/WR)

예를들어 블루투스통신(UART)을 하고싶다면 포트D나 포트E에있는 USARTn핀을 사용하면 됩니다.

디지털 입출력 핀의 DC전류는 최대 40mA입니다.



이제 이러한 포트들을 다루는 방법을 알아보겠습니다.

DDRx에서 x는 A,B,C,..입니다. ex)DDRA , DDRB


*기본 개념

DDRx레지스터란 입출력의 방향을 설정하는 레지스터입니다. 아두이노로 이야기를 한다면 pinMode에서 OUTPUT인지 INPUT인지 정하는 친구입니다.

PORTx레지스터란 데이터 입출력에 해당하는 레지스터입니다. 아두이노로 이야기를 한다면 digitalWrite에서 HIGH인지 LOW인지 정하는 친구입니다.

PINx레지스터란 포트 입력 핀에 해당하는 레지스터입니다. 아두이노로 이야기를 한다면 digitalRead라고 보면 됩니다.

DDRx,PORTx는 read/wrtie기능이 가능하지만, PINx는 read만 가능합니다.


DDRx의 비트를1로 set하면 이 핀은 출력 핀으로 설정되고, 비트를 0을하면 입력 핀으로 설정됩니다.

여기서 DDRx의 값이 1인지 0인지에따라서 PORTx가 하는 역할이 달라지게됩니다.

먼저 이 표를 보겠습니다.


먼저 표 부터 설명하겠습니다.

PUD는 SFIOR의 PUD입니다. PUD(pull-up Disable)비트를 1로 셋트하면 그 기능이 금지됩니다.

Pull-up이란 포트의 상태를 1로 만들어주는 것입니다.

Comment에서 Tri-state(Hi-Z)가 나오는데요. 포트는 3상태 버퍼(Tri-state buffer)를 사용하는데 그 중 하이 임피던스 상태를 의미합니다.

포트는 그냥 HIGH,LOW상태만 있으면 될거같은데 아닙니다.

AVR 아키텍처 사진인데요. 보시면 Data Bus에 여러가지 레지스터들이 Data Bus를 공유하는 것을 볼 수 있습니다. 이때 여러가지가 연결되어있으므로 충돌을 방지하기위해 3상태버퍼를 사용하는 것입니다. 하이 임피던스상태는 저항이 크다는 말이고 출력하지 말아야 할 것들은 전기적으로 절연상태가 됩니다.


다시 위의 표를 본다면

DDRx가 0일때 PORTx가 1인경우와 0인경우가 있습니다.(PUD는 어짜피 enable해주는 핀이니 상관안하겠습니다)

DDRx=0 , PORTx = 0인경우 HI-Z

DDRx=0,PORTx = 1인경우 pull-up상태로 PINx의 초기값을 1로 해주는 것입니다. 왜냐하면 PINx는 입력 레지스터라고 아까 이야기 했습니다. 입력레지스터 입력은 자기가 아니라 다른것들이 해줘야 하니까 PINx는 어떤 상태인지 모릅니다.

데이터 시트를보면 PINA의 초기값은 N/A로 나와있습니다.


DDRx=1, PORTx = 1인경우 HIGH

DDRx=1, PORTx = 0인경우 LOW


이제 LED키는것을 한번 보겠습니다.

http://wowon.tistory.com/6

위의 글은 예전에 작성했던 글인데 DDRx = 1, PORTx=1로 했으므로 한쪽의 상태가 HIGH가 됩니다. 그러므로 한쪽은 GND에 연결해주면 LED(발광다이오드)가 켜지게 되는것을 볼 수 있습니다.


이번에는 PINx를 다뤄볼건데요.

먼저 PINx의 초기값이 뭔지 모르니까 pull-up상태로 만들어주겠습니다.

DDRA=0x00; //입력으로사용

PORTA=0xff; //풀업상태

그럼현재 PINA의 상태는 0xff가 됩니다.

그럼 이때 만약 버튼을 사용하여 LED를 1개만 키고싶다면

PINA 첫번째핀에 GND를 연결해주면 PINA의 상태는 0xfe가 될것입니다.

그럼 코드에서 if(PINA==0xfe) 이렇게 해도 되지만 올바르지 않은 표현입니다.

왜냐하면 한 핀의 상태만 검사하면 되기 때문입니다.

올바른 표현은 if(PINA&1 ==0) 이런식으로 해주면 한 핀의 상태만 검사하게 됩니다.