Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade

Como Criar Funções de Atraso em Microcontroladores Microchip

Funções de atraso são essenciais em sistemas embarcados para sincronizar operações, gerar pulsos de temporização e controlar a sequência de eventos. Em microcontroladores da Microchip, como os da família PIC, a criação de funções de atraso pode ser feita de várias maneiras, incluindo o uso de loops de software e temporizadores de hardware. Este artigo explicará como criar funções de atraso usando ambas as abordagens, com exemplos práticos e códigos adaptados ao ambiente Microchip.

Exemplos:

Atraso Usando Loops de Software

Uma maneira simples de criar um atraso é usar loops de software. Embora este método não seja muito preciso, ele pode ser útil para atrasos curtos e não críticos.

#include <xc.h>

void delay_ms(unsigned int milliseconds) {
    while(milliseconds > 0) {
        __delay_ms(1);  // Função de atraso de 1 ms fornecida pelo compilador XC8
        milliseconds--;
    }
}

void main() {
    TRISB = 0x00;  // Configura o PORTB como saída
    while(1) {
        LATB = 0xFF;  // Liga todos os pinos do PORTB
        delay_ms(1000);  // Atraso de 1000 ms (1 segundo)
        LATB = 0x00;  // Desliga todos os pinos do PORTB
        delay_ms(1000);  // Atraso de 1000 ms (1 segundo)
    }
}

Atraso Usando Temporizadores de Hardware

Para atrasos mais precisos e eficientes, é recomendável usar temporizadores de hardware. Aqui está um exemplo de como configurar e usar o Timer0 em um PIC16F877A para criar um atraso.

#include <xc.h>

void init_timer0() {
    OPTION_REG = 0b00000111;  // Prescaler de 1:256
    TMR0 = 0;  // Zera o registrador do Timer0
    INTCONbits.TMR0IE = 1;  // Habilita a interrupção do Timer0
    INTCONbits.TMR0IF = 0;  // Limpa a flag de interrupção do Timer0
    INTCONbits.GIE = 1;  // Habilita interrupções globais
}

void __interrupt() timer0_isr() {
    if (INTCONbits.TMR0IF) {
        // Código a ser executado na interrupção do Timer0
        LATB ^= 0xFF;  // Alterna o estado dos pinos do PORTB
        TMR0 = 0;  // Zera o registrador do Timer0
        INTCONbits.TMR0IF = 0;  // Limpa a flag de interrupção do Timer0
    }
}

void main() {
    TRISB = 0x00;  // Configura o PORTB como saída
    init_timer0();  // Inicializa o Timer0
    while(1) {
        // Loop principal vazio, a lógica de atraso é tratada na ISR
    }
}

To share Download PDF

Gostou do artigo? Deixe sua avaliação!
Sua opinião é muito importante para nós. Clique em um dos botões abaixo para nos dizer o que achou deste conteúdo.