Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade
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:
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)
}
}
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
}
}