This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| pt:examples:timer:periodic_interrupt [2015/12/15 15:56] – artica | pt:examples:timer:periodic_interrupt [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Interrupção periódica ====== | ||
| + | |||
| + | // | ||
| + | [HW] [[pt: | ||
| + | [AVR] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | |||
| + | ===== Teoria ===== | ||
| + | |||
| + | O objetivo deste capítulo é demonstrar o uso das interrupções no exemplo dos contadores. As interrupções são partes do programa que reagem aos eventos que têm lugar nos microcontroladores. São usadas normalmente para uma resposta rápida a um evento, mas podem também ser usadas para completar vários processos paralelos, acções precisas no tempo e de poupança energética. Por exemplo, é possível fazer um LED piscar com interrupções, | ||
| + | |||
| + | ===== Prática ===== | ||
| + | |||
| + | O programa seguinte mostra como o contador é configurado para fazer uma interrupção. Existem 2 LEDs do módulo de I/O digital no programa. O estado do LED vermelho é alterado periodicamente com uma espera por software; o estado do LED verde é alterado quando ocorrem interrupções. Existe um exercício separado para um LED piscar com espera por software que não é explicado aqui. O objetivo principal é explicar o uso da biblioteca dos contadores e interrupções. | ||
| + | |||
| + | O que se segue mostra o uso de interrupções do controlador xmega. No início do programa, o contador/ | ||
| + | |||
| + | period = (32000000 Hz / 1024 / 1) - 1 = 31249 | ||
| + | |||
| + | Depois de permitir que a interrupção atinja o valor máximo do contador 1, uma interrupção deve ser permitida a nível global, o que significa ao longo de todo o microcontrolador. As interrupções globais podem ser ativadas por função sei e proíbidas com cli. Um ficheiro header avr/ | ||
| + | |||
| + | <code c> | ||
| + | // HomeLab III example of blinking LED with counter interrupt | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Interruption | ||
| + | ISR(TCE1_OVF_vect) | ||
| + | { | ||
| + | // Changing the state of the green LED | ||
| + | pin_toggle(led_green); | ||
| + | } | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | // Setting the pins of the LEDs as outputs | ||
| + | pin_setup_output(led_green); | ||
| + | |||
| + | // Setting the period of timer E1 | ||
| + | // F_CPU/ | ||
| + | // 32000000 / 1024 / 1 - 1 = 31249 | ||
| + | TC_SetPeriod(& | ||
| + | |||
| + | // Setting the clock of timer E1 (F_CPU/ | ||
| + | TC1_ConfigClockSource(& | ||
| + | // Setting timer E1 to the normal operating mode | ||
| + | TC1_ConfigWGM(& | ||
| + | |||
| + | // Enabling high-priority overflow interruptions | ||
| + | TC1_SetOverflowIntLevel(& | ||
| + | |||
| + | // Enabling high-priority interruptions | ||
| + | PMIC.CTRL |= PMIC_HILVLEN_bm; | ||
| + | // Enabling global interruption | ||
| + | sei(); | ||
| + | |||
| + | // Endless loop | ||
| + | while (1) { } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Os exemplos de interrupção são bastante diferentes entre as séries de controladores ATmega (neste exemplo usamos o ATmega2561), | ||
| + | |||
| + | No início do programa, o contador/ | ||
| + | |||
| + | f = 14745600 Hz / 1024 / 14400 = 1 | ||
| + | |||
| + | <code c> | ||
| + | // The HomeLab II example of blinking LED with counter interrupt | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Interruption | ||
| + | ISR(TIMER1_CAPT_vect) | ||
| + | { | ||
| + | // Changing the state of the green LED | ||
| + | pin_toggle(led_green); | ||
| + | } | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | // Setting the pins of the LEDs as outputs | ||
| + | pin_setup_output(led_green); | ||
| + | |||
| + | // Seting the timer up in the CTC mode | ||
| + | timer1_init_ctc( | ||
| + | TIMER1_PRESCALE_1024, | ||
| + | TIMER1_CTC_TOP_ICR); | ||
| + | |||
| + | // The maximal value of the timer is 14400, which | ||
| + | // makes the length of the period 1 s | ||
| + | // Formula: 14,7456Mhz / 1024 = 14400 | ||
| + | timer1_set_input_capture_value(14400); | ||
| + | |||
| + | // Allowing interruption of achieving the value | ||
| + | timer1_input_capture_interrupt_enable(true); | ||
| + | |||
| + | // Allowing global interruption | ||
| + | sei(); | ||
| + | |||
| + | // Endless loop | ||
| + | while (1){ } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | No início do programa confirma-se que, independentemente do que o microcontrolador está a executar no programa principal, as interrupções ocorrem e o LED verde pisca. | ||