레지스터란?
-CPU가 요청을 처리하는 데 사용하는데 고속의 데이터 임시저장공간이다.
레지스터는 공간이 작고 가격이 비싸지만 CPU에 직접 연결돼있어서 속도가 다른 저장장치보다 빠르다 또한 CPU는 자체적으로 데이터를 저장할 수 없으므로 레지스터를 이용하여 연산처리나 번지 지정을 도와주며 컴퓨터 장치들을 제어한다
오늘 우리가 사용할것은 포트 레지스터(Port Registers)이다 이걸 뭘 할 수 있을까? 바로 낮은 레벨에서 포트를 묶어서 빠르게 조작할 수 있다 예컨대 led2개를 동시에 키고 끈다거나 할 수 있게 된다
이번 설명글에서는 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 |
---|