Programming/8051

8051타이머 모드설정

청솔1 2009. 11. 30. 10:52

 

8051타이머 모드설정

 

8051은 두 개의 타이머/카운터를 내장하고 있다.

이것에 사용되는 클록으로는 내부클록을 이용하는 법과 외부펄스(T0: 14번핀, T1: 15번핀)을 입력시켜 계수하는 방식의 두 가지가 있다.

내부클록을 계수하는 것을 타이머, 외부펄스를 계수하는 것을 카운터라고 한다.

타이머/카운터 0,1의 기본동작은 8비트 타이머/카운터로 설정하였을 경우,
TH레지스터가 0xFF에서 0x00이 되는 시기에 TF(Timer overflow)가 1로 되어 오버플로가 발생한다.
16비트 타이머 또는 카운터로 설정하였을 경우에는 0xffff에서 0x0000으로 되는 시기를 말한다.
8051의 타이머/카운터는 다음의 4가지로 사용하는 동작 모드가 있다.
모드 0: 13비트 타이머/카운터
모드 1: 16비트 타이머/카운터
모드 2: Auto-Reload 8비트 타이머/카운터
모드 3: 2개의 8비트 타이머/카운터(타이머 0), 시리얼포트로 출력되는 타이머/카운터(타이머1)


그럼, 이하에서는 각 모드에 대해 자세히 살펴 보도록 하자.
모드 0 :
타이머/카운트 0,1을 모드 0으로 설정해서 사용하는 경우에는 13비트 타이머/카운터로 동작하게 된다.

모드 0에서는 TL의 상위 3비트를 못쓰게 되어 결국 13비트가 되는 것이다.
예제) 타이머 0을 모드 0으로 사용하여 0.005초 즉, 5mS 마다 인터럽트가 발생하게 하여,

P1 포트에 연결된 LED0~LED7을 1초에 한번씩 깜빡거리는 프로그램을 작성해 보자.
먼저, TH0와 TL0의 설정값을 계산하면,
★ T = 1/f이고, 머신사이클주파수는 11059200/12 이므로,
내부클록 1개당 주기 = 1/머신사이클 = 0.000001085069444초이다.
★ 인터럽트 주기를 0.005초로 설정하려면
이것에 해당하는 내부클록수 = 0.005/0.000001085069444 = 4608개가 된다.
즉, 4608개의 내부클록이 발생해야 0.005초가 된다.
따라서, 4608번의 내부클록이 입력되면 오버플로가 발생하도록 13비트 타이머의 값 0x1fff에서 4608만큼 빼주면 된다.

따라서, 공식은
TH0, TL0 설정 갯수 = 0x1fff - (n개 내부 클록 발생수 - 1)
여기서, "n개 내부클록발생수" = 4608이므로,
★ TH0, TL0 설정 갯수 = 0x1fff - (0x1200 - 1).
참고) 최대동작주기는 (내부클록1개당주기)*8192 = 8.88mS 이다.


모드 1 :
타이머/카운트 0,1을 모드 1으로 설정해서 사용하는 경우에는 16비트 타이머/카운터로 동작하게 된다.

예제) 타이머 1을 모드 1로 사용하여 0.05초 즉, 50mS 마다 인터럽트가 발생하게 하여,

P1 포트에 연결된 LED0~LED7을 1초에 한번씩 깜빡거리는 프로그램을 작성해 보자.
먼저, TH1와 TL1의 설정값을 계산하면,

★ T = 1/f이고, 머신사이클주파수는 11059200/12 이므로, 내부클록 1개당 주기 = 1/머신사이클 = 0.000001085069444초이다.
★ 인터럽트 주기를 0.05초로 설정하려면
이것에 해당하는 내부클록수 = 0.05/0.000001085069444 = 46080개가 된다.
즉, 46080개의 내부클록이 발생해야 0.05초가 된다.
따라서, 46080번의 내부클록이 입력되면 오버플로가 발생하도록 16비트 타이머의 값 0xffff에서 46080만큼 빼주면 된다.

따라서, 공식은
TH1, TL1 설정 갯수 = 0xffff - (n개 내부 클록 발생수 - 1)
여기서, "n개 내부클록발생수" = 46080이므로,
★ TH1, TL1 설정 갯수 = 0xffff - (0xb400 - 1) = 0x4c00.
따라서, TH1 = 0x4C, TL1 = 0x00 이다.
참고) 최대동작주기는 (내부클록1개당주기)*65536 = 71.11mS 이다.

모드 2:
타이머/카운트 0,1을 모드 2로 사용하면 오토리로드(Auto reload)가 된다.
TL을 8비트 카운터로 사용한다.(TH는 오버플로되어도 변하지 않고, 오버플로시에 TH의 값이 TL로 자동 재장전이 된다.).

타이머/카운트 0,1은 오토리로드 동작은 같지만, 차이점으로는 타이머/카운터 1은 시리얼 포트와 연결되어 있다.

시리얼 통신을 하기 위해서는 보레이트의 발생이 필요하다.

이경우 시리얼 통신 보레이트의 발생은 타이머/카운터 모드 2를 주로 이용하여 통신한다.
예제) 타이머 0을 모드 2로 사용하여 0.2mS마다 인터럽트를 발생시켜,
P1 포트에 연결된 LED0~LED7을 1초에 한번씩 깜빡거리는 프로그램을 작성해 보자.
먼저, 자동 재장전값 TH0의 설정값을 계산하면,
★ T = 1/f이고, 머신사이클주파수는 11059200/12 이므로,
내부클록 1개당 주기 = 1/머신사이클 = 0.000001085069444초이다.
★ 인터럽트 주기를 0.0002초로 설정하려면
이것에 해당하는 내부클록수 = 0.0002/0.000001085069444 = 184개가 된다.
즉, 184개의 내부클록이 발생해야 0.0002초가 된다.
따라서, 184번의 내부클록이 입력되면 오버플로가 발생하도록 8비트 자동재장전값(TH0)의 값은 0xff에서 184만큼 빼주면 된다.

따라서, 공식은
TH0 설정 갯수 = 0xff - (n개 내부 클록 발생수 - 1)
여기서, "n개 내부클록발생수" = 184이므로,
★ TH0 설정 갯수 = 0xff - (0xb8 - 1) = 0x48.
따라서, TH0 = 0x48 이다.
이값은 오토리로드 되므로, 앞의 두 모드와는 달리 인터럽트 함수내에서 소프트웨어적으로 다시 로드해 줄 필요가 없이 하드웨어로 자동 리로드가 된다.

모드 3:
모드 3에서는 타이머/카운터 0과 타이머/카운터 1의 동작이 서로 다르다.
타이머 0의 경우 TH0, TL0이 서로 다른 두 개의 카운터로 동작한다.

이때 TH0 타이머/카운터 제어는 타이머/카운터 1에서 사용하던 TF1, TR1을 사용하고,

하위 TL0의 타이머/카운터 제어는 타이머/카운터 0에서 사용하는 TF0, TR0을 사용한다.
타이머 1의 경우 TH0의 비트제어로 TF1, TR1이 사용되기 때문에 타이머/카운터 1에서는 이를 사용할 수 없게 된다.

따라서, 타이머/카운터 1에서는 동작을 제어할 비트들이 없어서 직접적으로 타이머/카운터 1을 제어할 수 없다.
한가지 유의할 점은 타이머/카운터 1이 시리얼 포트와 연결되어 있고 보레이트 설정에서 인터럽트가 필요하지 않다고 해서,

타이머/카운터 0을 모드 3으로 설정한 상태에서 타이머/카운더 1을 보레이터와 같은 용도로 사용하면 큰 잘못이다.

왜냐하면, 시리얼 통신을 위한 보레이트 발생장치는 오토리로드가 되어야 통신 에러가 발생하지 않기 때문이다.

따라서, 타이머/카운터 0을 모드 3으로 한 상태에서 타이머/카운터 1을 보레이트 발생장치로 사용하는 오류를 범하지 말아야 한다.

문제) 타이머/카운터 0을 모드 3으로 하여 TH0은 0.2mS마다 인터럽트를 발생하여 1초주기로 LED4~LED7까지 돌아가면서 하나씩 켜지게 하고, TL0은 0.1mS마다 인터럽트를 발생하여 1초 주기로 LED0~LED3까지 돌아가면서 하나씩 켜지도록 프로그램을 짜 보시오.
힌트) TH0 = 0x48; // 0.2mS 주기에 맞추어 TH0값을 설정한다.

        TL0 = 0xa4; // 0.1mS 주기에 맞추어 TL0값을 설정한다.

참고) 8비트 타이머의 최대동작주기는 (내부클록1개당주기)*256 = 0.277mS 이다.

 

출처: 민이여행

 

<< 전자기기 개발 --- 건강기기, 통신기기,각종 전자회로 개발, PCB ARTWORK >>

 

 

 

'Programming > 8051' 카테고리의 다른 글

8051 타이머 모드1  (0) 2009.11.30
8051의 타이머 0  (0) 2009.11.30
8051( 중급 12부 - serial 통신 2 )   (0) 2009.11.29
8051( 중급 11부 - serial 통신 )  (0) 2009.11.29
8051( 중급 10부 - A/D )   (0) 2009.11.29