반응형
 

[8051강좌] SFR 이해하기

 

이전에 타이머도 사용해 봤겠다. 인터럽트라는 것도 한번 사용해 보았다. 사실 그냥 쓰기에는 SFR이 뭔지 몰라도 된다. 별 지장은 없다. 다만 SFR 이란 녀석이 있고, 그걸 사용해서 타이머니 뭐니 하는 것들을 설정해 주게 되니 조금은 이해해두면 마음이 편하게 될게다 ^^

그러면 SFR이라것이 무엇이냐?

 

SFR 은 Special Funtion Register 의 약자이다. 다른 것들과는 차별되는, 조금 특별한 그 무엇인데... 설명하기가 쉽지 않은 녀석이긴하다.

 

첫째, Special 과 Function 이란 말은 Register 를 수식하는 말이다. 레지스터는 램과 비슷한데 있는 장소는 램이 아니라 CPU 내부에 존재한다. 다시말해 레지스터는 CPU 안에 있는 기억장소라고 생각하자.

 

둘째, 레지스터는 단순한 기억장소가 아니다. 레지스터는 밥통의 스위치와 같은 역할을 한다.
8051을 강좌하면서 밭통이론을 자주 써 먹고 있다. ^^ 밥통에 밥이 되기 위해서 전기가 필요하고, 밥통이 밥을 하기 위해서는 사람이 스위치를 눌러줘야 한다. 무슨 말이냐고? 필자의 집에는 전기밥통이 있다. 스위치가 몇개 달려 있다. 하나는 [취사] 라고 써 있고, 또 다른 하나는 [보온]이라고 써 있다. 그리고 그 옆에 [예약]인가 하는 것이 있다. 필자는 밥을 하기 위해서 쌀을 씻고 물을 알맞게 맞춘 다음 밥통에 넣고, 전원 플러그를 벽에 꼽고, 그 다음 [취사]라고 되어 있는 스위치를 누른다. 그러면 밥통은 이제 자신의 뱃속에 있는 쌀을 밥이 되도록 열을 가하기 시작한다.

 

만약 밥이 들어 있다면 나는 당연히 [보온]스위치를 누를 것이다. 밥을 넣어놓고 [취사] 스위치를 누르는 사람은 뭔가 정신적 장애가 많은 사람이거나 밥통 제어조차 안되는 사람이니, 세상 살아가기 힘들게다. ^^

왜 밥통 이야기를 하고 있을까? 밥통은 취사, 보온, 그리고 예약 이라는 세가지 모드를 가지고 있는 일종의 사이비 8051 이라고 생각하기 바란다. 밥통이 해야 할 일을 알려주기 위해서 사람들은 밥통의 스위치를 조작해서 밥을 짓게 하거나[취사], 밥은 따뜻하게 보존하게 하거나[보온], 아니면 일정 시간 후에 밥을 짓도록[예약] 할수 있다.

8051 에도 이와 같은 스위치가 있다. 대신 밥통과는 비교가 안될만큼 많은 스위치가 있다. 이 각각의 스위치들의 조합으로 우리는 어떤 일을 할 것인지를 8051 에게 지시하게 된다.

 

그러면 8051에는 스위치가 몇개나 있을까?

우선 여기서 AT89S52 의 데이타시트를 한번 보자

 



Table 5-1 은 8051 의 SFR 들, 그러니까 쉽게 말해서 스위치들을 보여주고 있다.
스위치는 기본적으로 [흐른다|끊어진다] 의 두가지 모드밖에 없다. On 되거나 Off 되거나 둘중 하나지 중간에서 애매하게 됬다 말았다 하는건 없다. (이게 디지탈의 장점이다... 디지탈 국회를 한다고? 그럼 분명하게 해라 오늘은 이랬다 내일은 저랬다하면서 홈페이지 돈주고 만들었다고 다 디지탈사고 한다고 생각하는건 오산이다)

 

그러면 전체 스위치가 몇개일까? 한번 정확하게 세어봐야 하는데 귀찮아서 해본적은 없다. ^^ 다만 8051 에서는 스위치를 위해서 몇개의 공간을 배정해 두었느냐면 16*8*8 개 즉, 1024 개의 스위치를 둘수 있는 공간을 배정해 두었다. 왜 1024개 인가? 그림을 잘보면 된다. 우선 가로로 8개의 상자가 나열된다. 세로로는 16개의 상자가 나열된다. 그리고 각각의 상자안에는 8개의 스위치가 들어간다.

그래서 SFR 의 크기는 1024비트가 되고, 이를 바이트로 바꾸면 0x80 부터 시작해서 0x81, 0x82, ... 0xFF 까지 총 128 개의 8비트짜리 방이 나온다. 그림의 바깥쪽에 있는 16진수는 시작번지와 끝번지를 기록하고 있다. 스위치를 사용하려면 그 스위치가 어디 붙어 있는지 알아야하지 않겠나? ^^

노파심에 한가지 더 이야기를 한다면 8051에서 주소는 8비트를 하나의 바이트로 환산해서 말한다.

다시 SFR 이라는 스위치 이야기로 돌아가자. 총 1024개의 스위치를 설치할 수 있는 CPU 내부의 공간이 있다고 했다. 하지만 1024개의 스위치를 다 쓸 필요는 없다. 1024개의 스위치를 다 쓰게 된다는 말은 아주 막강한 프로세서의 탄생을 의미하는 것이다.

 

1024 개의 스위치를 켜고 끄는 방법에 따라 총 몇개의 스위치 조합이 가능할까? .... 드디어 고등학교 수학시간이다(중학교 산순가? ^^;).
...
..
.
..
...


1024 개가 힘들다면 4개만 가지고 한번 해보자 ^^

 

1번ON  2번ON  3번ON  4번ON  - 1가지
1번ON  2번ON  3번ON  4번OFF - 2가지
1번ON  2번ON  3번OFF 4번ON  - 3가지
1번ON  2번OFF 3번ON  4번ON  - 4가지
1번OFF 2번ON  3번ON  4번ON  - 5가지
1번ON  2번ON  3번OFF 4번OFF - 6가지
1번ON  2번OFF 3번ON  4번OFF - 7가지
1번OFF 2번ON  3번ON  4번OFF - 8가지
1번ON  2번OFF 3번OFF 4번ON  - 9가지
1번OFF 2번ON  3번OFF 4번ON  - 10가지
1번OFF 2번OFF 3번ON  4번ON  - 11가지
1번ON  2번OFF 3번OFF 4번OFF - 12가지
1번OFF 2번OFF 3번ON  4번OFF - 13가지
1번OFF 2번ON  3번OFF 4번OFF - 14가지
1번OFF 2번OFF 3번OFF 4번ON  - 15가지
1번OFF 2번OFF 3번OFF 4번OFF - 16가지

 

4개 스위치로 16가지 조합이 가능하다. 즉 2^4 만큼의 조작이 가능하다. 만약 1024개라면? 2의 1024승 만큼의 스위치 조작이 가능하다. 계산기로 계산해 보았다. 1.797693134862315907729305190789e+308 상당히 큰 숫자다... 10의 308승이라면 뭐라고 불러야 할까? ^^

이런 엄청난 조합을 다 쓰는 프로세서는 지구상에 존재하지 않는다. ^^ 8051 은 이중 아주 일부만 사용해도 된다. 그리고 스위치 공간이 큰 만큼 잘 조합해서 쓸수 있도록 공간의 미학을 살리는 것도 있다. ^^

무슨 말이냐면 가로 8개 세로 16개로 구성된 128개 각각의 방은 8개의 비트를 담고 있다. 즉, 각각의 방마다 8개의 스위치가 있다. 이 8개를 다 써도 되고, 일부만 써도 된다. SFR 은 방이 넉넉한 만큼 비슷한 것들끼리 묶어서 관리하고 있다. 이 각각의 방들은 나름대로 불리는 이름이 있다. 그 이름들이 위의 그림에 보이는 이름이다.

B, ACC, PSW, ..., P0, P1.. 이런 것들이 모두 8개의 스위치를 가지고 있는 레지스터들이다. 그리고 각 스위치들은 또 각각의 기능을 가지고 있다.

그러면 비어 있는 방은 무엇인가? ... 안쓰는 방이다 ^^ 당연하다. 1024 개의 스위치는 너무 많다. 남은 빈 방들은 나중을 위해 예비된 방이다. 혹시 나중에 또 다른 기능을 추가하게 된다면 그때 비어 있는 방을 쓰면 된다. 마치 원본 8051 에는 없던 T2CON, T2MOD 같은 것들이 AT89S52 에서는 사용되는 것과 같다.

그러면 전체 사용되는 스위치의 숫자는 32*8 개 즉, 256개 정도인데, 이중 일부는 8개 스위치를 전부 쓰지 않고 일부만 사용한다. (이것도 절대 작은양이 아니다 ^^ 2^256 승을 계산해 보라)

그러면 이제 이 스위치를 사용하는 방법을 한번 알아보자...

우리는 지난 시간 타이머라는 것을 사용해 보았다. 거기보면 TMOD 라는 레지스터를 설정해 주었다.

 

TMOD :
+-------------------------------------------------+
[[GATE] [C/T] [M1] [M0]]| [[GATE] [C/T] [M1] [M0]]
          TIMER_1       |          TIMER_0
+-------------------------------------------------+

 

이걸 보면 TMOD 는 TIMER0 와 TIMER1 을 사용하기 위한 스위치8개로 구성되어 있음을 알수 있다.
또 다른 그림, 우리 카페 초기화면에 올라와 있는 그 그림을 보자. ^^

 


 







M1, M0 두개의 스위치는 모드를 결정하는 역할을 한다. 여기서 M1=1, M0=0 으로 설정해서 모드1로 결정했다.
GATE 를 우리는 0으로 주었다. GATE 가 0이면 NOT 게이트를 통과하면서 1이 되고, OR 게이트를 통과하면서 1이 된다. 이제 TCON 레지스터에 있는 TR0 의 값에 따라(0 또는 1) 결과가 주어지게 된다.
C/T 값을 0으로 해서 타이머로 동작하게 한다. 이 값이 1이 되면 T0 핀을 통해 들어오는 값을 카우트하는 카운터가 된다.
TH0 와 TL0 는 8개의 스위치로 8비트 크기의 수치를 부여받게 된다. 두개를 합해서 16비트의 정수형변수처럼 사용된다.
이런 식으로 필요한 스위치를 조작해 주는 것이 바로 레지스터를 변경하는 것이다. 레지스터를 어떻게 한다는 말을 들으면 어렵게 생각할 필요가 없다. 그냥 밥통을 스위치를 조작해서 취사, 보온, 예약 기능을 쓰듯이 그렇게 8051 도 레지스트를 조작해서 내가 원하는 어떤 기능을 시키겠다는 뜻일 뿐이다.

한번 타이머를 사용하면서 조작했던 레지스터를 죽 돌아보면서 어디에 무엇을 어떻게 조작했는지 살펴보는 것도 좋겠다.
타이머 설정만 한다고 해서 되는게 아니라 인터럽트도 가능하게 스위치를 조작해줘야하고, 나중에는 각 인터럽트간 우선순위도 결정해 주기 위해 스위치를 조작(레지스터 변경)해 주게 된다. ^^

이쯤에서 레지스터 각각의 기능을 설명하지는 못했지만 전반적으로 레지스터란게 무엇인지, 대체 뭐하는 놈들이기에 이렇게 귀찮게 구는지를 살펴보았다 ^^ 이해하는데 도움이 되었기를 바라면 ... 오늘은 이만.... 한번 타이머사용시에 사용했던 레지스터들을 다시 한번 죽 점검해 보기 바란다 ^^ 어디어 붙어 있는 놈을 어떻게 사용했는지를 말이다. ^^

참고로 TMOD = 0x00 이런 식으로 알려줘도 컴파일러가 알아서 0x89 번지로 이 8개의 값을 넣어주는 것은 헤더파일에서 정의되어 있기 때문이다.
AT89X52.H 라는 헤더파일을 항상 INCLUDE 시켜 주었었다. 그 파일을 열어서 보면,

__sfr __at 0x80 P0          ;
__sfr __at 0x81 SP          ;
__sfr __at 0x82 DPL         ;
__sfr __at 0x83 DPH         ;
__sfr __at 0x87 PCON        ;
__sfr __at 0x88 TCON        ;
__sfr __at 0x89 TMOD        ;
.....
.....

이런식으로 각 레지스터의 주소값과 이름이 매칭되어 있다. 그래서 우리는 컴파일할때(소스를 짤때), 굳이 SFR 의 주소번지를 기억하려고 할 필요없이 그냥 P0 = 0x0F; TMOD = 0x02; 이렇게 쓸수 있는 것이다. ^^    

AT89X52.H 에서 조금만 아래로 내려가면

.....
__sbit __at 0x80 P0_0       ;
__sbit __at 0x81 P0_1       ;
__sbit __at 0x82 P0_2       ;
__sbit __at 0x83 P0_3       ;
.....

부분을 만날수 있다. 위에서는 8비트 단위의 레지스터를 이름붙인거라면 여기서는 잘 쓰는 개별 비트단위로(각각 스위치 단위로) 이름을 주고 사용하기 편하게 해둔 것이다.

가끔 sfr 이나 sbit 같은 이상한 단어를 만나도 어색해하지 말고 이번 기회에 친해지기를 바란다 ^^

          ------------------------------------------
           Timy의 전자카페
           기분좋은 하루되세요. ^^
           블로그 : http://www.electoy.net
           스터디카페 : http://cafe.daum.net/timy8051
          ------------------------------------------


반응형

+ Recent posts