주기적 타이머
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
주기적 타이머는 마이크로컨트롤러 내에서 일정한 간격으로 신호를 생성하는 모듈로, 일회성 또는 주기적인 동작이 가능하다. AVR, 8051, IBM PC 호환 기종 등 다양한 시스템에서 사용되며, 각 시스템 및 모델에 따라 타이머의 구조와 기능이 다르다. AVR 마이크로컨트롤러는 프리스케일러를 사용하여 다양한 주기의 타이머 신호를 생성하며, 8051 타이머는 CPU 클럭 또는 외부 클럭 신호를 사용하여 동작한다. 초기 IBM PC 호환 기종에서는 인텔 8253 PIT를 사용했으며, 최신 시스템에서는 LAPIC 타이머가 더 높은 해상도의 타이머 기능을 제공한다.
더 읽어볼만한 페이지
- 마이크로컨트롤러 - 마이크로프로세서
마이크로프로세서는 CPU 기능을 단일 IC에 통합한 것으로, 무어의 법칙에 따라 성능이 향상되어 왔으며 다양한 아키텍처와 기술 발전을 거쳐 현재 광범위한 분야에서 사용된다. - 마이크로컨트롤러 - ARM 아키텍처
ARM 아키텍처는 저전력 설계로 모바일 기기에서 널리 쓰이는 RISC 기반 프로세서 아키텍처로서, IP 코어 라이선스 모델과 ARM Flexible Access를 통해 다양한 분야로 확장되고 있다. - 컴퓨터 시스템 - 마이크로프로세서
마이크로프로세서는 CPU 기능을 단일 IC에 통합한 것으로, 무어의 법칙에 따라 성능이 향상되어 왔으며 다양한 아키텍처와 기술 발전을 거쳐 현재 광범위한 분야에서 사용된다. - 컴퓨터 시스템 - 아두이노
아두이노는 Atmel AVR 마이크로컨트롤러 기반의 오픈 소스 하드웨어 플랫폼으로, C 언어와 유사한 스케치를 통해 프로그래밍이 가능하며, 다양한 플러그인 쉴드를 이용해 기능을 확장할 수 있어 교육, 시제품 제작, IoT 개발 등에 활용된다. - 임베디드 시스템 - 로봇공학
로봇공학은 기계적 구조, 전기적 부품, 소프트웨어로 이뤄진 로봇의 설계, 제작, 운용 및 응용에 관한 학문 분야로, 산업, 의료, 우주 탐사 등 다양한 분야에서 활용되며 인간-로봇 상호작용 및 로봇의 자율성 향상 연구가 진행 중이다. - 임베디드 시스템 - 허니웰
허니웰은 1885년 설립된 기업으로, 항공우주, 빌딩 자동화, 안전 및 생산성 솔루션, 성능 소재 및 기술 분야에서 사업을 영위하며, 군사 기술 개발 및 펜탁스 카메라 수입업체로 활동했고, 환경 문제 관련 비판을 받기도 한다.
주기적 타이머 | |
---|---|
기본 정보 | |
유형 | 전자 회로 |
기능 | 시간 간격 측정 이벤트 계수 주파수 생성 |
응용 분야 | 실시간 시스템 임베디드 시스템 산업 자동화 로보틱스 |
작동 원리 | |
핵심 구성 요소 | 클럭 소스 카운터 비교기 출력 회로 |
클럭 소스 | 수정 진동자 또는 RC 발진기 |
카운터 | 이진 카운터 또는 십진 카운터 |
비교기 | 카운터 값을 프로그래밍된 값과 비교 |
출력 회로 | 인터럽트 또는 트리거 신호 생성 |
프로그래밍 | |
프로그래밍 가능 요소 | 카운터 모드 프리 스케일러 비교 값 |
카운터 모드 | 단일 펄스 모드 주기적 모드 게이트 모드 |
프리 스케일러 | 클럭 주파수 분할 |
비교 값 | 카운터가 비교할 값 설정 |
장점 및 단점 | |
장점 | 유연성 정확성 신뢰성 |
단점 | 복잡성 비용 |
예시 | |
예시 | 인텔 8253 인텔 8254 Zilog Z80 병렬 입출력 프로그래머블 인터벌 타이머 |
활용 | |
소프트웨어 타이밍 루프 | 소프트웨어 타이밍 루프 |
2. 주기적 타이머의 일반적인 특징
주기적 타이머는 일회성 또는 주기적으로 동작할 수 있다. 일회성 타이머는 한 번만 신호를 보내고 중지된다. 주기적 타이머는 특정 값에 도달할 때마다 신호를 발생시키고, 초기화되어 다시 카운트를 시작하여 주기적인 간격으로 신호를 생성한다.[1] 주로 정해진 간격으로 반복적인 작업을 처리하는 데 사용된다.[1] 카운터는 일반적으로 신호 출력 전까지 카운트할 간격을 설정하여 프로그래밍된다.[1]
AVR의 대표적 모델인 ATmega 시리즈는 8비트와 16비트 타이머를 사용한다.[5]
3. AVR 마이크로컨트롤러 타이머
AVR8의 여러 모델에서 타이머 번호는 일반적으로 다음과 같이 배치된다.타이머 카운터 타이머 0, 2 8비트 카운터 타이머 1, 3 16비트 카운터
카운터 비트 수가 많을수록 더 긴 주기의 시간을 만들 수 있으므로, 시스템 사양에 따라 적절히 선택하여 사용한다.
3. 1. AVR 타이머의 프리스케일러
AVR8 시리즈에서 사용하는 프리스케일러는 시스템 클럭을 최대 1024분주까지 줄여 다양한 주기의 타이머 신호를 생성할 수 있다.[5] CS 레지스터 값을 조절하여 분주 비를 설정하고, T0, T1 외부 핀을 통해 입력되는 클럭을 선택적으로 사용할 수 있다.
3. 2. AVR 타이머 0의 구조 및 인터럽트
ATmega328P등의 AVR8 시리즈의 타이머0는 8비트 카운터를 사용한다. 프리스케일러로부터 입력되어 선택된 클럭을 사용하여 일정한 주기를 얻을 수 있다.
동작 모드를 다양하게 설정할 수 있고, 만약 인터럽트를 사용한다면 타이머가 설정한 최댓값에 도달하면 TOV0가 설정되고, 인터럽트 가능 레지스터 설정에 따라 인터럽트 신호가 작동한다.[1]
AVR8의 인터럽트를 활용한 타이머0 프로그래밍 예 (avr-gcc 컴파일러를 사용할 경우) :
#include
#include
int main(void)
{
TIMSK |= (1 << TOIE0); // 인터럽트 가능하게 설정
TCCR0 |= (1 << CS01) | (1 << CS00); // 프리스케일러 64분주로 설정
sei(); // CPU가 인터럽트 받아 들여 처리 시작하게 설정
while (1)
{
// 시스템 전체를 제어
}
}
// 타이머0 오버플로워 인터럽트 핸들러
ISR (TIMER0_OVF_vect)
{
// 주기적인 일이 필요할 때, 해당 기능을 프로그래밍
}
3. 3. AVR 타이머 프로그래밍 예제 (avr-gcc)
cpp
#include
#include
int main(void)
{
TIMSK |= (1 << TOIE0); // 인터럽트를 가능하게 설정
TCCR0 |= (1 << CS01) | (1 << CS00); // 프리스케일러를 64분주로 설정
sei(); // CPU가 인터럽트를 받아들여 처리 시작하게 설정
while (1)
{
// 시스템 전체를 제어
}
}
// 타이머0 오버플로우 인터럽트 핸들러
ISR (TIMER0_OVF_vect)
{
// 주기적인 일이 필요할 때, 해당 기능을 프로그래밍
}
4. 8051 마이크로컨트롤러 타이머
초기 8051 모델은 타이머를 2개 내장하고 있었다.[9] 이후 다양한 제조사에서 8051 호환 칩을 출시하면서 타이머의 기능과 개수가 다양해졌다.
4. 1. 8051 타이머의 동작 방식
8051 타이머는 다음 두 가지 동작 방식 중 하나를 선택할 수 있다.[9]- CPU의 동작 클럭을 이용하여 일정한 주기의 신호를 얻기: 타이머의 클럭은 보통 CPU의 메인 클럭 신호로부터 만들어진다. 이 클럭을 기반으로 우선 프리스케일러를 통해 주파수를 낮춘다. 8051은 간단히 1/12을 사용한다. 즉, 12분주 회로를 사용하여 클럭의 속도를 낮추어 타이머 모듈의 디지털 카운터 회로에 클럭을 공급한다.
- 외부의 어떤 클럭 신호가 몇 개의 펄스로 동작했는지를 카운터: 외부의 클럭 신호를 타이머의 카운터 회로에 클럭으로 넣어 카운터 횟수를 파악할 수 있다. 즉, 어떤 클럭의 신호가 몇 번 펄스가 발생했는지를 카운터하여 그 값을 프로그램으로 읽을 수 있다.
모드 설정에서 일정한 주기를 얻을 것인지 외부의 클럭 신호의 카운터를 할 것인지는 레지스터 설정을 통해 이루어진다.
4. 2. 8051 타이머 동작 모드
8051 타이머는 다양한 동작 모드를 제공한다. 8051은 여러 회사에서 출시되면서 다양한 모델이 나왔고, 타이머의 기능과 개수도 다양해졌다.타이머의 동작은 다음 두 가지를 선택할 수 있다.[9]
- CPU 클럭 기반 주기적 신호 생성:
- 타이머 클럭은 보통 CPU의 메인 클럭 신호에서 만들어진다.
- 프리스케일러를 통해 주파수를 낮춘다. (8051은 1/12 사용)
- 12분주 회로를 통해 클럭 속도를 낮춰 타이머 모듈의 디지털 카운터 회로에 클럭을 공급한다.
- 외부 클럭 신호 펄스 카운트:
- 외부 클럭 신호를 타이머 카운터 회로에 클럭으로 넣어 카운터 횟수를 파악한다.
- 발생한 펄스 수를 프로그램으로 읽을 수 있다.
모드 설정은 레지스터 설정을 통해 이루어진다.
- 모드 0: TH0[7:0]와 TL[4:0] 연결로 13비트 카운터로 0~8191까지 카운터 한다.
- 모드 1: TH0[7:0]와 TL[7:0] 연결로 16비트 카운터로 0~65535까지 카운터 한다.
- 모드 2: TL0[7:0] 8비트 카운터가 완료되면 TH[7:0] 레지스터 값이 TL0에 재 설정되어 카운터가 계속된다.
- 모드 3: TH0[7:0]와 TH[7:0]가 분리되어 8비트 카운터로 동작한다.
타이머 0을 사용한 프로그래밍 (Keil 통합 개발 환경) 예시는 다음과 같다.[10]
```cpp
#include
#include
/*------------------------------------------------
Timer 0 인터럽트 핸들러
- 65536 클럭 주기
- -----------------------------------------------*/
static unsigned long overflow_count = 0; // 디버깅 용으로 사용
void timer0_ISR (void) interrupt 1
{
overflow_count++; // 카운터 값 증가
}
void main (void)
{
// 타이머 0 설정 :
// 16비트 카운터 타이머 모드 설정
// 65535 카운터 후, 오버플로워가 발생하여 인터럽트 신호가 발생한다.
TMOD = (TMOD & 0xF0) | 0x01; // T/C0 모드 설정
ET0 = 1; // 타이머 0 인터럽트 가능 설정
TR0 = 1; // 타이머 0 동작 시작
EA = 1; // 8051 코어의 인터럽트 수용하여 동작 설정 - Global Interrupt Enable
while (1)
{
// 메인 루프
}
}
```
인터럽트 핸들러 표현은 표준 C/C++가 아니므로 개발 환경에 따라 다르다.
- IAR E.W. 통합 개발 환경:
```cpp
#pragma vector=0x0b
__interrupt void timer0_interrupt_handler(void)
{
// ...
}
```
- SDCC 컴파일러:
```cpp
#include
void Timer0_ISR(void) __interrupt (1)
{
// ...
}
4. 3. 8051 타이머 프로그래밍 예제 (Keil, IAR, SDCC)
cpp#include
#include
/*------------------------------------------------
Timer 0 인터럽트 핸들러
- 65536 클럭 주기
- -----------------------------------------------*/
static unsigned long overflow_count = 0; // 디버깅 용으로 사용
void timer0_ISR (void) interrupt 1
{
overflow_count++; // 카운터 값 증가
}
void main (void)
{
// 타이머 0 설정 :
// 16비트 카운터 타이머 모드 설정
// 65535 카운터 후, 오버플로워가 발생하여 인터럽트 신호가 발생한다.
TMOD = (TMOD & 0xF0) | 0x01; // T/C0 모드 설정
ET0 = 1; // 타이머 0 인터럽트 가능 설정
TR0 = 1; // 타이머 0 동작 시작
EA = 1; // 8051 코어의 인터럽트 수용하여 동작 설정 - Global Interrupt Enable
while (1)
{
// 메인 루프
}
}
```[10]
인터럽트 핸들러의 표현은 표준 C/C++가 아니므로 개발 환경에 따라 다르다.
- IAR E.W. 통합 개발 환경에서 인터럽트 핸들러 표현
```cpp
#pragma vector=0x0b
__interrupt void timer0_interrupt_handler(void)
{
// ...
}
```
- SDCC 컴파일러에서 인터럽트 핸들러 표현
```cpp
#include
void Timer0_ISR(void) __interrupt (1)
{
// ...
}
5. IBM PC 호환 기종에서의 타이머
인텔 8253 PIT는 IBM PC 호환 기종에서 사용된 최초의 타이밍 장치였다. 이 장치는 1.193182 MHz의 클럭 신호를 사용했으며(NTSC에서 사용되는 컬러 버스트 주파수의 1/3, 시스템 클럭 크리스털 발진기의 1/12,[1] 따라서 4.77 MHz CPU 클럭의 1/4), 세 개의 타이머를 포함하고 있다. 타이머 0은 마이크로소프트 윈도우(단일 프로세서)와 리눅스에서 시스템 타이머로 사용되며, 타이머 1은 역사적으로 동적 랜덤 액세스 메모리 리프레시에 사용되었고, 타이머 2는 PC 스피커에 사용되었다.[2]
최신 인텔 시스템의 LAPIC은 더 높은 해상도(1µs) 타이머를 제공한다.[3] 이는 2.6.18부터 시작하는 리눅스 커널에서 PIT 타이머 대신 사용된다.[4]
참조
[1]
웹사이트
Bran's Kernel Development Tutorial: The Programmable Interval Timer
http://www.osdever.n[...]
Osdever.net
[2]
웹사이트
Programmable Interval Timer - OSDev Wiki
http://wiki.osdev.or[...]
Wiki.osdev.org
2012-06-26
[3]
간행물
μ-second precision timer support for the Linux kernel
http://telematics.tm[...]
[4]
웹사이트
Determining and changing the rate of timer interrupts a guest operating system requests (1005802)
http://kb.vmware.com[...]
[5]
웹인용
ATmega Timer0,1,2,3
http://www.atmel.com[...]
2015-06-18
[6]
웹인용
8051 Timer
http://web.mit.edu/6[...]
2015-06-18
[7]
웹인용
Software Timing Loops
http://betterembsw.b[...]
2015-06-18
[8]
웹인용
Introduction to Embedded Programming Timer
http://www.scriptori[...]
2015-06-18
[9]
웹인용
Architecture and programming of 8051 MCU's, 2.6 Counters and Timers
http://www.mikroe.co[...]
2015-08-12
[10]
웹인용
8051 타이머 0, 모드 1 예
http://www.keil.com/[...]
2015-06-19
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com