A medição de tempo é feita por contagem de ciclos de instrução (TCI), cujo valor, em segundos depende da frequência do oscilador de clock. O tempo correspondente ao ciclo de instrução (TCI), é dado pela equação:
xc.h
A bliblioteca xc.h disponibiliza alguma funções que permitem gerar atrasos.
É necessário "chamar" a biblioteca xc.h
#include <xc.h>
Para o correto funcionamento, uma vez que as funções são baseadas em ciclos de instrução do microcontrolador é necessário indicar a frequência em Hz de trabalho do microcontrolador
#define _XTAL_FREQ 48000000
Obs.: Nas funções e macros descritas a seguir o argumento a ser passado ("cycles" ou "x") não pode ser um valor elevado, pois o compilador "entende" que desta forma o programa poderia estar "travado" ou em loop infinito, então para obter tempos maiores, é necessário chamar várias vezes as funções ou realizar inteirações (laços de repetição como "for", "while").
Fonte: Guia do Usuário do compilador XC8 - Microchip
_delay
Gera um atraso de um número de ciclos que é especificado como argumento "cycles"
Sintaxe: void _delay(unsigned long cycles);
Uso: _delay(10); // gera um atraso de 10 ciclos de instrução aproximadamente 833ns (10 x 83,3ns)
_delay3
Gera um atraso de 3 vezes o número de ciclos que é especificado como argumento "cycles"
Sintaxe: void _delay3(unsigned char cycles);
Uso: _delay3(10); // atraso de 30 ciclos de instrução
__delayus
É uma macro baseada na função _delay e gera um atraso em us que é especificado no argumento "x"
Sintase: void __delay_us(x);
Uso: __delay_us(1); // gera uma atraso de 1us
__delayms
É uma macro baseada na função _delay e gera um atraso em ms que é especificado no argumento "x"
Sintase: void __delay_ms(x);
Uso: __delay_ms(1); // gera uma atraso de 1ms