Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade
Interrupções são mecanismos essenciais em sistemas embarcados, permitindo que um microcontrolador responda rapidamente a eventos externos ou internos sem a necessidade de um loop de consulta constante. Este artigo irá explorar a importância das interrupções no ambiente de microcontroladores, como configurá-las e utilizá-las de maneira eficaz.
Interrupções são especialmente importantes para aplicações que exigem resposta em tempo real, como sistemas de controle industrial, automação residencial, e dispositivos IoT. Elas permitem que o microcontrolador execute outras tarefas enquanto aguarda um evento específico, melhorando a eficiência e a performance do sistema.
Exemplos:
Configuração de Interrupção Externa em um PIC Microcontrolador:
Vamos configurar uma interrupção externa no pino RB0/INT do microcontrolador PIC16F877A. A interrupção será acionada por uma mudança de estado no pino (bordo de subida).
#include <xc.h>
// Configurações do microcontrolador
#pragma config FOSC = XT // Oscilador XT
#pragma config WDTE = OFF // Watchdog Timer desativado
#pragma config PWRTE = OFF // Power-up Timer desativado
#pragma config BOREN = ON // Brown-out Reset ativado
#pragma config LVP = OFF // Low Voltage Programming desativado
#pragma config CPD = OFF // Data EEPROM Memory Code Protection desativado
#pragma config WRT = OFF // Flash Program Memory Write Protection desativado
#pragma config CP = OFF // Flash Program Memory Code Protection desativado
void __interrupt() ISR(void) {
if (INTF) { // Verifica se a interrupção foi causada pelo pino RB0/INT
// Código da rotina de interrupção
PORTBbits.RB1 = ~PORTBbits.RB1; // Inverte o estado do pino RB1
INTF = 0; // Limpa a flag de interrupção
}
}
void main(void) {
TRISBbits.TRISB0 = 1; // Configura o pino RB0 como entrada
TRISBbits.TRISB1 = 0; // Configura o pino RB1 como saída
PORTBbits.RB1 = 0; // Inicializa o pino RB1 em 0
INTEDG = 1; // Interrupção no bordo de subida
INTE = 1; // Habilita a interrupção externa
GIE = 1; // Habilita interrupções globais
while (1) {
// Loop principal
}
}
Configuração de Interrupção de Timer em um Microcontrolador AVR:
Vamos configurar uma interrupção de timer no microcontrolador ATmega328P, usado comumente no Arduino. A interrupção será acionada a cada segundo.
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER1_COMPA_vect) {
PORTB ^= (1 << PORTB5); // Inverte o estado do pino 13 (LED)
}
void setup() {
DDRB |= (1 << DDB5); // Configura o pino 13 como saída
// Configura o Timer1
TCCR1B |= (1 << WGM12); // Modo CTC (Clear Timer on Compare Match)
OCR1A = 15624; // Valor de comparação para 1 segundo (16MHz / 1024 / 1Hz - 1)
TIMSK1 |= (1 << OCIE1A); // Habilita a interrupção de comparação
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler de 1024
sei(); // Habilita interrupções globais
}
void loop() {
// Loop principal
}