860 likes | 1.25k Views
8051 타이머 / 카운터. 순천향대학교 정보기술공학부 이상정. 개 요. 3 개의 타이머 80C31 : 2 개의 16 비트 증가형 카운터 / 타이머 (timer 0, timer 1) 를 내장 80C32 : 16 비트 카운터 / 타이머 (timer 2) 를 추가로 내장 기능 내부 시스템 클럭을 클럭 소스로 사용하는 타이머 기능 외부 단자로부터의 클럭 입력을 사용하는 사건 카운터 (event counter) 의 기능
E N D
8051타이머/카운터 순천향대학교 정보기술공학부 이상정
개 요 • 3개의 타이머 • 80C31 : 2개의 16비트 증가형 카운터/타이머(timer 0, timer 1)를 내장 • 80C32 : 16비트 카운터/타이머(timer 2)를 추가로 내장 • 기능 • 내부 시스템 클럭을 클럭 소스로 사용하는 타이머 기능 • 외부 단자로부터의 클럭 입력을 사용하는 사건 카운터(event counter)의 기능 • 타이머0과 타이머1은 4가지의 동작 모드, 타이머2는 3가지의 동작 모드 순천향대학교 정보기술공학부 이 상 정 2
개 요 • 타이머 기능 • 타이머 레지스터의 값이 내부 클럭에 의해서 1머신 사이클에 한 번씩 증가 • 결과적으로 타이머의 클럭 소스는 발진기 주파수를 12분주(타이머2가 보레이트 발생기 모드는 예외) • 카운터 기능 • 단자 T0∼T2에서 입력되는 외부 클럭 입력신호의 하강 에지에서 1씩 증가 • 카운터는 최소한 2개의 머신 사이클에 한번씩 인식(최대 입력 클럭 주파수는 발진기 주파수의 1/24) 순천향대학교 정보기술공학부 이 상 정 3
머신 사이클 • 80C32에서 1개의 머신 사이클(machine cycle) • 12 클럭 주기 • S1∼S6의 6개 스테이트(state)로 구성 • 각 스테이트는 2개의 클럭 주기로 구성 • 각 스테이트를 구성하는 2개 클럭의 앞쪽에 있는 1주기를 위상1(phase 1), 뒤쪽 1주기를 위상2(phase 2) • 결과적으로 12MHz의 클럭을 사용한다면 1 머신 사이클은 1[μs] 순천향대학교 정보기술공학부 이 상 정 4
명령 인출 및 실행 동작 타이밍 • 80C32는 기본적으로 각 머신 사이클동안 무조건 2회씩의 프로그램 명령 페치 동작을 수행 • 만약 명령이 1바이트로 구성되어 2번째의 페치가 필요없다면 CPU는 더미 리드(dummy read)를 수행 • 1사이클에 실행되는 명령 • 스테이트1에서 명령이 시작되어 읽혀진 명령이 명령 레지스터에 저장 • 2번째의 페치는 스테이트4에 시작되는데 1바이트 명령에서는 이것이 더미 리드이며, 스테이트6에서 이 명령의 실행이 모두 완료 순천향대학교 정보기술공학부 이 상 정 5
명령 인출 및 실행 동작 타이밍 • 1바이트 명령이면서 2개의 머신 사이클에 실행되는 명령 • 전체적으로 4회의 명령 코드 페치가 수행되며 이중에서 뒤의 3차례에 걸쳐서 읽은 코드는 모두 더미 리드 • MOVX 명령 • 첫번째 ALE 신호에서 명령 코드를 읽은 후에 두번째 ALE 신호에서는 이 명령이 액세스할 데이터 메모리의 번지를 출력 • 2번째 머신 사이클에서 전반부에는 이 명령을 실행하는 데이터 메모리를 액세스 순천향대학교 정보기술공학부 이 상 정 6
명령 인출 및 실행 동작 타이밍 순천향대학교 정보기술공학부 이 상 정 7
제어 레지스터 순천향대학교 정보기술공학부 이 상 정 8
TMOD 레지스터 • Timer/Counter Mode Control Register • 타이머 0, 타이머 1 제어 • 3가지 기능 • 타이머 혹은 카운터로서의 사용 여부 결정 • 4가지 동작 모드 결정 • 타이머/카운터의 ON/OFF 제어 위치(내부, 외부) 결정 순천향대학교 정보기술공학부 이 상 정 9
TMOD 레지스터 순천향대학교 정보기술공학부 이 상 정 10
TMOD 레지스터 • M1과 M0 비트는 타이머/카운터의 동작 모드를 설정 • C/ T’비트는 타이머와 카운터의 기능을 선택 • C/ T’ = 0이면 타이머 • C/ T’ = 1 이면 카운터 • GATE 비트는 외부 인터럽트 단자에 의하여 타이머/카운터의 동작을 인에이블시킬 수 있도록 제어 순천향대학교 정보기술공학부 이 상 정 11
TCON 레지스터 순천향대학교 정보기술공학부 이 상 정 12
TCON 레지스터 • TR0와 TR1 비트는 각각 타이머/카운터 0과 1의 동작을 ON/OFF하는 제어 비트 • TMOD 레지스터에서 GATE=0로 설정되어 있으면 TR 단독으로 ON/OFF • GATE=1이면 각각 INT0’및 INT1’신호와 함께 ON/OFF • TF0와 TF1 비트는 각각 타이머/카운터 0과 1이 오버플로우되면 1로 세트 • CPU가 해당 타이머의 인터럽트를 받아 인터럽트 서비스 루틴을 실행하기 시작하면 다시 0으로 클리어 • 타이머 오버플로우는 카운터의 최대값(8비트에서는 FFH, 16비트에서는 FFFFH)에서 1개의 펄스가 입력되어 카운터가 0으로 바뀌는 것을 말한다. 순천향대학교 정보기술공학부 이 상 정 13
모드 0 동작 • 13비트 타이머/카운터로 동작 • 최대로 계수할 수 있는 값213 = 8192 = 8K • 외부 클럭 주파수가 12MHz 인 경우 계수하는데 걸리는 최대(tmax) 및 최소(tmin) 시간 • tmax = 12 / (12 * 106) * 8192 = 8192 usec • tmin = 12 / (12 * 106) * 1 = 1 usec=> 즉 계수되는 펄스 당 1 usec 의 시간이 소요 1 머신 사이클 (12개 클럭)마다 타이머 클럭이 공급되므로 12를 곱해준다. 순천향대학교 정보기술공학부 이 상 정 14
모드 0 동작 순천향대학교 정보기술공학부 이 상 정 15
모드 0 동작 • 모드 0에서는 타이머/카운터 13 비트 중에서 TL의 5비트는 32분주(32배)된 신호를 만들어내는 프리스케일러(prescaler) 역할 • TH의 8 비트만이 타이머/카운터로 동작 • TL은 TH의 값을 32배해주는 역할 • 즉, TL의 값이 증가되어 32가 될 때 TH가 1 증가 • TH의 8비트 카운터에서 오버플로우가 발생(FFH→ 00H)하면 TCON 레지스터의 TF 비트가 세트되고 해당 인터럽트가 발생 순천향대학교 정보기술공학부 이 상 정 16
모드 0 동작 예 • 타이머 0에 5000 usec 간격으로 인터럽트 발생하고자 할때 TH를 다음과 같이 세트 • MOV TH0, #(8192-5000)/32 • 12MHz 클럭 주파수 사용 가정하면 1개 계수 당 1 usec 소요 • 5000을 세기 위해 8192-5000=3192부터 8192까지 계수 • TL에 의해 32배 되므로 TH의 값은 (계수할 총 펄스 수/32)로 주어진다. 순천향대학교 정보기술공학부 이 상 정 17
모드 0 동작 예 • 타이머 0에 5000 usec 간격으로 인터럽트 발생 코드 예MOV TMOD, #00H ; M1 M0 = 00, C/T’ = 0 GATE = 0MOV TH0, #(8192-5000)/32MOV IE, #10000010 ; EA=1, ET0=1SETB PT0 ; IP.1 = 1 레벨 1 우선순위MOV 0B7H, #0 ; IPH.1 = 0 SETB TR0 ; TCON.4 계수 시작 순천향대학교 정보기술공학부 이 상 정 18
모드 0 동작 예 • 타이머 0에 20 usec 간격으로 인터럽트 발생 예 • MOV TH0, #0FFH MOV TL0, #(32-20) • 20번 카운트되어야 하므로 32보다 작다. • TL만 20번 카운트 한 후 인터럽트 발생 필요 • TH는 0FFH로 초기화 하여 TL이 20번 카운트하여 32에 도달되면 1 증가하여 바로 TH가 0이 되어 인터럽트 발생 순천향대학교 정보기술공학부 이 상 정 19
1. 타이머 프로그램 예 1 • 타이머 0을 이용하여 50KHz 속도로 우선순위 3의 인터럽트를 발생시키고 발생된 횟수를 병렬포트 p0에 표시하고 메모리 30H에 저장하는 프로그램 • T = 1/f = 1/(50 * 103) = 0.00002 sec = 20usec • 12MHz 클럭 주파수 사용 가정하면 1개 계수 당 1 usec 소요되므로 20번 카운트해야 함 순천향대학교 정보기술공학부 이 상 정 20
1. 타이머 프로그램 예 1 CSEG AT 8000H ; initialize counter value, parallel port MOV 30H,#0 MOV P0,30H ; Initialize Timer, Interrupt SFRs MOV TMOD, #00H ; M1M0=00, C/T’=0 GATE=0 MOV TH0, #0FFH ; count initial value TH0 MOV TL0, #(32-20) ; count initial value TH0 MOV IE, #10000010B ; EA=1, ET0=1 SETB PT0 ; MOV IP,#00000010B level 3 priority MOV 0B7H, #2 ; IPH.1 = 1 SETB TR0 ; MOV TCON,#00010000B TCON.4, start count 순천향대학교 정보기술공학부 이 상 정 21
1. 타이머 프로그램 예 1 LOOP: SJMP LOOP ; infinite loop ; interrupt service routine TF0_ISR: MOV TH0, #0FFH ; count initial value TH0 MOV TL0, #(32-20) ; count initial value TH0 INC 30H MOV P0, 30H RETI CSEG AT 000BH ; TF0 interrupt vectoring JMP TF0_ISR END 순천향대학교 정보기술공학부 이 상 정 22
레지스터 윈도우 내의 state, sec • 시뮬레이션 시 시간의 변화를 표시 • 명령 실행 시 시간 변화 표시 • 12MHz 프로세서에서는 1 머신 사이클(12개의 클럭)이 1usec • 1 사이클 명령 실행 하면 1 usec 씩 증가 • 대부분 명령은 2 사이클 명령 • p.140 명령 표 참조 • 무한루프의 명령 SJMP LOOP은 2 사이클 명령 • 따라서 10번 수행해야 20 usec • 인터럽트 서비스 루틴 진입하자 마자 카운트는 시작 • 따라서 서비스 루틴 수행 중에도 카운트 됨 순천향대학교 정보기술공학부 이 상 정 25
2. 타이머 프로그램 예 1 – C 프로그램 #include <REG52.H> sfr IPH = 0xB7; /* define IPH register */ unsigned char count _at_ 0x30; void timerint(void) interrupt 1 // 8*n+3 { /* initialize counter */ TH0 = 0xff; TL0 = 32-20; /* increment memory, P0 */ ++count; P0 = count; } 순천향대학교 정보기술공학부 이 상 정 41
2. 타이머 프로그램 예 1 – C 프로그램 main() { /* initialize memory, parallel port */ P0 = count = 0; /* Timer 0 mode 0 */ TMOD = 0; /* initialize counter */ TH0 = 0xff; TL0 = 32-20; /* interrupt */ IE = 0x82; // EA=1, ET0=1 IP = IPH = 2; // set highest interrupt priority 3 /* TCON.4, start count */ TR0 = 1; while (1) ; } 순천향대학교 정보기술공학부 이 상 정 42
모드 1 동작 • 모드 0 동작과 거의 동일 • 다만 16비트 타이머/카운터로 동작 • 최대로 계수할 수 있는 값216 = 65536 = 64K 순천향대학교 정보기술공학부 이 상 정 49
모드 1 동작 순천향대학교 정보기술공학부 이 상 정 50