This is an old revision of the document!


Table of Contents

Periodic interrupt

Necessary knowledge: [HW] Controller module, [HW] User Interface Module, [AVR] Interrupts, [AVR] Counters/Timers, [LIB] Pins, [LIB] Delay, [LIB] Timers, [PRT] Software delay

Theory

The goal of these practical exercises is to demonstrate the usage of the interruptions on the example of the counters. The interrupts are program parts which are reacting on the events that occur in the microcontrollers. They are used usually for quick reacting to an event, but they can be used for completing several parallel processes, precisely timed action and saving power. For example, it is possible to make a LED blinking, which’s blinking frequency does not depend on what is happening in the program at the moment.

Practice

The following program shows how the counter is set up to make a break. There are used 2 LED-s of the digital module in the program, the state of the red one’s is changed periodically with software delay. The green one’s state is changed when breaks occur. There is a separate exercise about blinking LED with software delay and this is not explained here. The main goal is to explain the usage of the library of the counters and breaks.

In the beginning of the program, the 16-bit counter/timer 1 is been set up with the function timer1_init_ctc. With this function the counter CTC clear timer on compare match is been set to the mode where the maximum value of the timer is not 216 – 1 but elective. In the present case the maximal value is set the value of the ICR1 index. The divider of the counter is 1024 and the value of ICR1 is 14400, so when the clock frequency is 14,7456 MHz, the period will be exactly one second. It is easy to calculate:

f = 14745600 Hz / 1024 / 14400 = 1

After allowing the break of achieving the maximum value of the counter 1, allowing to make break must be done at the global level also, that means in the microcontroller. For allowing global breaks, there is the function sei and for forbidding function cli. For defining the program part of these functions and breaks, there must be also a header file avr/interrupt.h included. The program part of the break is defined with macro function ISR, which’s parameter is the name of the break vector. The name of the vector of counter 1’s value achievement’s break up is TIMER1_CAPT_vect.

//
// Kodulabori loenduri katkestusega vilkuva LED näide.
// Võrdluseks katkestusega vilkuvale LED-ile
// töötab paralleelselt ka tarkvaralise viitega vilkuv LED.
//
#include <homelab/pin.h>
#include <homelab/delay.h>
#include <homelab/timer.h>
#include <avr/interrupt.h>
 
//
// LED-ide viikude määramine
//
pin led_red   = PIN(C, 5);
pin led_green = PIN(C, 3);
 
//
// Katkestus
//
ISR(TIMER1_CAPT_vect)
{
	// Rohelise LED oleku muutmine
	pin_toggle(led_green);
}
 
//
// Põhiprogramm
//
int main(void)
{
	// LED-ide viikude väljundiks seadmine
	pin_setup_output(led_red);
	pin_setup_output(led_green);
 
	// Taimeri seadistamine CTC režiimi	
	timer1_init_ctc(
		TIMER1_PRESCALE_1024,
		TIMER1_CTC_TOP_ICR);
 
	// Taimeri maksimaalne väärtus 14400 mis
	// teeb perioodi pikkuseks 1s
	// Valem: 14,7456Mhz / 1024 = 14400
	timer1_set_input_capture_value(14400);
 
	// Väärtuse saavutamise katkestuse lubamine
	timer1_input_capture_interrupt_enable(true);
 
	// Globaalne katkestuste lubamine
	sei();
 
	// Lõputu tsükkel
	while (true)
	{
		// Tarkvaraline paus 1000 millisekundit
		sw_delay_ms(1000);
 
		// Punase LED oleku muutmine
		pin_toggle(led_red);
	}
}

Programmi käivitades on näha, et hoolimata sellest, mida mikrokontroller põhiprogrammis teeb, toimuvad katkestused ja roheline LED vilgub.

Kui programmil lasta töötada mõni minut, tuleb välja oluline aspekt, mida tarkvaralise viite harjutuses nii lihtsalt näha polnud. Kuigi punast LEDi vilgutavas tsüklis olev viide on 1000 ms, siis tegelik aeg, mis kulub iga tsükli täitmiseks, on natukese suurem. Põhjus on selles, et ka LED-i oleku muutmine, viite funktsiooni väljakutsumine ja tsükli täitmine võtavad protsessoril mõned taktid täitmise aega. Tulemusena jääb punase LED-i vilkumine rohelise LED-i vilkumisest pidevalt maha. Just sel põhjusel ei ole soovitatav ka kellaaja loendureid ja muid täpselt ajastatud tegevusi teha viitega, vaid loenduri katkestustega.

en/examples/timer/periodic_interrupt.1267721852.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0