atmega128 타이머 인터럽트 예제

Where:1MHz = 클럭 주파수 1024 = 타이머 0112 = 최대 카운트(0x70)2 = 한 LED 온/오프 사이클에 대해 2개의 기간동안 선택된 프리스케일러 클럭 소스는 서비스 루틴(ISR)을 중단하는 방식에 따라 다릅니다. 위의 코드는 Atmel Studio 6에서 사용되는 GNU 컴파일러를 사용하여 ISR을 설정하기 위한 것입니다. 코드가 아직 준비되지 않았습니다. 인터럽트 기능을 활성화하는 방법을 배우기 전까지는 그렇지 않습니다. 이를 위해 다음 레지스터를 알고 있어야 합니다. 타이머 오버플로 인터럽트 TOIE1이 활성화된 경우, 지금 표에서 ISR 함수 벡터 9를 사용해야 하며, 강조 표시된 비트에 집중할 것입니다. 다른 비트는 필요에 따라 논의될 것입니다. CS02:00의 세 가지 시계 선택 비트를 선택하여 적절한 프리스케일러를 선택하여 타이머를 설정합니다. 가능한 조합은 다음과 같습니다. 이전 예제에서 수행한 것처럼 코드를 컴파일하고 HEX 코드를 업로드하여 500msec 지연에서 LED가 깜박이는 것을 확인합니다. 이제 다음 공식에 따라 32 kHz 및 8 비트 카운터의 클럭 주파수와 함께 가능한 최대 지연은 8 ms. 이것은 매우 낮습니다 (MCU는 아닙니다).

따라서 6 ms의 지연을 위해, 우리는 191의 타이머 수가 필요합니다. 이것은 쉽게 8 비트 카운터 (MAX = 255)로 달성 할 수있다. 이제 인터럽트에 참석하려면 중단 서비스 루틴(ISR)이 필요합니다. 글쎄, 나는 모든 6 ms에서 깜박이는 LED가 항상 우리의 눈으로 볼 수 있다는 것을 알고 있지만, 프리 스케일러를 포함하지 않는 간단한 예를 찾을 수 없습니다. 이것을 데모로 간주하십시오. 위의 코드에서 ISR은 타이머 0이 SIG_TIMER0_COMPA를 사용하여 A 비교 인터럽트를 생성할 때 호출하도록 지정됩니다. 8비트 타이머는 WinAVR에서 내장된 인터럽트 기능을 사용하려면 0에서 255까지 2^8=256단계를 계수할 수 있습니다. void 타이머0_init() { TCCR0B |= (1<CS02); TCNT0 =0; 팀스크0 |= (1 << TOIE0); 세이(); tot_오버플로 =0; } void 설정() { timer0_init(); DDRD |= (1<= 245) { if(TCNT0==25) { PORTD ^= (1<<2); TCNT0=0; tot_오버플로 =0; } } } ATtiny2313의 타이머/카운터0(TC0)이 타이머로 설정됩니다. 설정된 기간이 경과하면 인터럽트가 발생합니다. 5.

“sei()” 명령으로 전역 인터럽트를 활성화합니다. 이 단계는 간단합니다, 단순히 sei (를 호출); 을 사용 하 고 전역 인터럽트를 설정 합니다. 인터럽트를 발생하려면 TIMSK 레지스터에서 인터럽트를 사용하도록 설정해야 합니다. 타이머0과 timer1 인터럽트를 모두 사용하려면 main에서 다음 코드를 사용하십시오: 타이머 1로 100ms 지연시 PD4에 연결된 LED를 깜박이는 것과 동일한 예를 반복해 보겠습니다. 우리는 AVR 인터럽트의 기초를 다루었습니다, 당신은 먼저 그것을 통해 갈 수 있습니다. 이 예제에서는 타이머 기간 및 빈도가 이 자습서의 이전 부분에서 수행된 것과 동일한 방식으로 계산됩니다. ATtiny2313 클럭이 1MHz의 기본 주파수에 있다고 가정하면 타이머는 LED를 주파수로 전환합니다. 프리 스케일러를 선택해 보겠습니다(256).

따라서 계산에 따라 타이머가 오버플로되는 데 4.096 ms가 소요됩니다. 이제 타이머가 오버플로되는 즉시 인터럽트가 발생되고 ISR(인터럽트 서비스 루틴)이 실행됩니다. 이제 타이머0과 타이머1을 모두 켜는 간단한 예제가 있습니다. 다음을 수행합니다: 정기적으로 카운터 값을 증가하려면 타이머가 클럭 소스에 액세스할 수 있어야 합니다. 클럭 소스는 일관된 반복 신호를 생성합니다. 타이머가 이 신호를 감지할 때마다 카운터가 하나씩 증가합니다. 그러면 개별적으로 활성화된 모든 인터럽트를 사용할 수 있습니다.