sexta-feira, 11 de novembro de 2016

Funções de tempo


 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:





Para uma frequência de 48MHz temos




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   


2 comentários:

  1. Professor, queria adiantar a materia dessa semana, mas minha pic grava o programa, mas quando faço a movimentação dos jumper, o programa não roda, e os leds, não piscam... somente o led3 fica ligado...os les 1 e 2 não. Preciso de auxilio.

    ResponderExcluir
    Respostas
    1. Quando você carregou o arquivo hex no programa (load program) você clicou no botão "NÃO"? Se você clicar no botão "SIM" você perde o programa bootloader da flash.
      Para saber se isso aconteceu (perda do bootloader): Coloque os jumpers na posição 1-2 e chame o bootloader (pressione o botão "boot" e d~e um clique no botão "reset").
      1) Se não entrar em modo de comunicação você perdeu o bottoloader e será necessário regravar a flash do PIC. Só eu o prof Antônio temos o gravador, só na próxima semana.

      2) Se entrar em modo de comunicação (piscar os leds 1 e 2 da placa de forma alternada) significa que o bottloader está presente e não foi perdido.
      Carregue um programa simples tipo (teste do lcd, que está no blog) e veja se funciona.
      Outra possibilidade: as opções de bootloader não foram feitas de forma correta e assim o programa não foi transferido de forma correta. Quando carregar o arquivo HEX para o programa de comunicação, após clicar no botão "não" verifique se aparece o endereço 000800, se não aparecer este endereço as opções de bootloader não foram feitas de forma correta, repita o processo com atenção e recompile o projeto.

      Excluir