공학/임베디드

Arduino-포트레지스터(port Registers)

뤠이튼 2021. 4. 13. 23:04

레지스터란?

-CPU가 요청을 처리하는 데 사용하는데 고속의 데이터 임시저장공간이다.

레지스터는 공간이 작고 가격이 비싸지만 CPU에 직접 연결돼있어서 속도가 다른 저장장치보다 빠르다 또한 CPU는 자체적으로 데이터를 저장할 수 없으므로 레지스터를 이용하여 연산처리나 번지 지정을 도와주며 컴퓨터 장치들을 제어한다

 

 

오늘 우리가 사용할것은 포트 레지스터(Port Registers)이다 이걸 뭘 할 수 있을까? 바로 낮은 레벨에서 포트를 묶어서 빠르게 조작할 수 있다 예컨대 led2개를 동시에 키고 끈다거나 할 수 있게 된다 

 

 

 

아두이노 우노에 들어가는 ATmega 328 핀맵

이번 설명글에서는 UNO에들어가는 ATmega 328(Atmega168도 동일)을 통해 설명하도록하겠습니다 핀 맵을 보면 PB0이나 PD0나 PC0이 보일 겁니다.

 

아두이노 우노 칩에는 크게 3개의 포트가 있습니다

 

B(Digital pin 8~13)

C(Analog pin 0~7)

D(Digital pin 0~7)

 

각 포트는 아두이노 포트 레지스터 3개의명령어와 정의된 변수(PORTB,PORTC,PORTD) 3개의해 레지스터는 제어됩니다

 

핀을 설정하고 제어하는 명령어들

포트레지스터 명령

DDRx(Data Direction Register D)

(x는 D, B, C 원하는 걸 골라 쓰면 됩니다)

 

핀에 대한 입출력을 설정하는 레지스터입니다 평소에 쓰던 pidMode() 같은 기능을 나타내지만 이 명령어를 사용하면

8개의 핀씩 한 번에 설정할 수 있습니다 여기서는 편의를 위해 DDRD(portc: digitalpin 8~13 설정) 사용하여 0번을 제외하고 OUTPUT으로 만들어보겠습니다. 해당 핀에 1을 넣으면 OUTPUT으로 세팅되고 0을 넣으면 INPUT으로 세팅됩니다

 

 

이걸 이제 이진수로 바꾸면 B11111110 16진수로는 0 XFE입니다

 

DDRD |=B11111110
또는
DDRD=0XFE;

 

를 통해 설정할 수 있습니다 |=는 비트 OR연산으로 현재 가지고 있는 값에서 일부분을 수정할 때 매우 편리합니다

 

 

PORTx(Port x Data Register)

digitalWrite() 함수랑 같은 기능을 합니다 단 여러 핀을 동시에 제어할 수 있습니다 한번 7 5 3 1번을 동시에 키는 코드를 보여드리겠습니다 여기서 1은 HIGH 0은 LOW입니다 

 

 

이제 이걸로 이진수로 바꾸면 B10101010입니다 이걸 16진수로 바꾸면 0 XAA입니다 이걸 코드로 바꾸면

 

PORTD|=B10101010; 	또는	PORTD=B10101010;
PORTD|=0XAA;		또는	PORTD=0XAA;

 

를 통해 설정할 수 있습니다 |=는 비트 OR연산으로 현재 가지고 있는 값에서 일부분을 수정할 때 매우 편리합니다.

 

 

PINx(Port x Input Pins Register)

digitalRead()와 같은 기능을 하며 입력 핀들의 값을 읽어드릴 수 있습니다 digitalRead()와 달리 한 번에 포트 핀 값을 동시에 읽어드릴 수 있습니다 임시로 7번을 INPUT으로 만들고 읽어보겠습니다

 

만약 7에 인풋이 들어오면 1로 바뀔 것이고  이걸 이진수로 바꾸면 B10000000 일 것입니다 직 7번 핀이 HIGH 같은 구문을 짜게 된다면

if(PIND&B10000000){
	CODE
}

이런 식으로 작성할 수 있게 됩니다

 

 

이렇게 레지스터를 건드려 코딩하게 되면 장점과 단점이 생기는데

 

장점

-굉장히 빨라진다 

-한 번에 여러 핀에 접근할 수 있다

-코드 용량을 줄일 수 있다

 

단점

-다른 보드에 이식하기  힘듭니다 레지스터가 각 CPU마다 예약된 명령어가 다르기도 합니다

-시인성이 떨어집니다 다른 이가 코드를 이해하기 어렵게만 듭니다

-원인모를 에러가 터지기도 한다. 로우 레벨로 접근하는 것이기에 컴파일러가 찾아 줄 수 없는 에러가 생기기도 합니다

 

따라서 레지스터를 직접적으로 접근할 때는 사용 후 충분한 주석과 필요할 때만 사용하시는 게 좋습니다

 

'공학 > 임베디드' 카테고리의 다른 글

임베디드 - NTCR  (0) 2022.11.28