a funcao delay

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

a funcao delay

Mensagem  wellington em Qua Dez 09, 2009 11:40 am

ola amigos!
Espero que voces possam me ajudar novamente,estou tentando usar a funcao (delay_ms) mas nao consigo pois meu programa so compila quando uso o delay da biblioteca,eassim nao consigo controlar o tempo de acionamento.pois preciso fazer dois leds piscarem
em tempos diferentes.
se alguem puder me ajudar desde ja eu agradeco.

wellington

Mensagens: 6
Data de inscrição: 01/12/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Resposta a Delay

Mensagem  Bruno S. Avelar em Seg Dez 14, 2009 2:31 pm

Olá Wellington,

Tudo bom? Você perguntou sobre o uso da função delay_ms no C18. Eu conheço esta função na blibioteca stdio. Não sei se ela foi implementada no C18. Vou colocar de modo geral o funcionamento da biblioteca delays.h e alguns exemplos. Isso vai ajudar na sua
dúvida. Vamos fazer esta biblioteca compilar aí!

As funções da biblioteca delays.h são usadas para ocupar o tempo do processador fazendo NOP (no operation).
Para calcular o tempo devemos saber que no PIC18F4550:
1- Cada ciclo de instrução equivale 4 períodos do clock da CPU.
2 - Em nossos projetos utilizamos a CPU trabalhando a 48MHz. Caso você deseje abaixar o clock da CPU esses
delays precisarão ser recalculados.
3 - Assim cada periodo da CPU vale: Tcpu=1/48E6 = 20.833ns
logo cada ciclo de instrução (TCY: Time of Instruction Cycle) equivale a TCY=83.333ns.
As funções desta biblioteca dão delays de múltiplos de TCY. Para utilizar a biblioteca no compilador C18 precisamos
incluir o delays.h com a linha de código: #include <delays.h>
As funções da biblioteca são:

Delay1TCY() -> Faz delay de 1 TCY (no caso 83.3333ns)
Delay10TCYx (char x) -> Faz delay de dez vezes TCY vezes o parametro recebido (x).
O parametro pode ser de 0 a 255 onde 0 é 256.
Delay100TCYx (char x) -> Faz delay de cem vezes TCY vezes o parametro recebido (x).
O parametro pode ser de 0 a 255 onde 0 é 256.
Delay1KTCYx(char x) -> Faz delay de mil vezes TCY vezes o parametro recebido (x).
O parametro pode ser de 0 a 255 onde 0 é 256.
Delay10KTCYx(char x) -> Faz delay de dez mil vezes TCY vezes o parametro recebido (x).
O parametro pode ser de 0 a 255 onde 0 é 256.

Observações:
- Não é indicado colocar estas funções dentro de um laço de repetição como um for se você precisar de precisão na medida. Coloque uma instrução após a outra até ter o delay que precisa.

Exemplos:

Delay10KTCYx(240); //delay de 200ms
Delay10KTCYx(60); //delay de 50ms


Espero ter ajudado.

Bruno S. Avelar

Bruno S. Avelar
Admin

Mensagens: 74
Data de inscrição: 26/07/2009
Idade: 29
Localização: Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

DELAY NO MPLAB

Mensagem  julio em Seg Abr 19, 2010 8:50 pm

Estou na pratica do curso e fui usar um delay so consegui desse jeito porem nao consegui enteder isso
Delay10KTCYx(216);
Se me lembro bem ja usei assim Delay_ms = (100);
Alguem pode ajudar ?

Abraco

julio
Convidado


Voltar ao Topo Ir em baixo

DELAY NO MPLAB

Mensagem  Bruno S. Avelar em Qui Abr 22, 2010 10:03 pm

Olá Júlio,

Como você deve ter notado eu movi seu tópico para outra pasta. Você acidentalmente postou uma dúvida sobre linguagem C no tópico sobre o curso e não em linguagem C. Acredito que você não deve ter visto mas sua dúvida já existia no forum e já havia sido respondida. Peço para você procurar no forum com atenção antes de postar dúvida e postá-la no lugar correto.

Sobre sua dúvida:

O delay_ms(int) que você conhece é de linguagem de alto nivel como C ou C++. Ele barra o andamento do seu programa durante o número de milissegundos que você especificar na função. Essa idéia é um pouco diferente em sistemas microcontrolados uma vez que eles não possuem relógios para contar tempo em milesegundos e o clock deles é configurável. (Os periféricos Timer não funcionam contando milissegundos também).

Pela sua citação de "Delay10KTCYx(216)" acredito que você esteja usando o compilador C18. Você já deve ter notado que existe uma biblioteca chamada <delays.h> Esta biblioteca possui várias funções que combinadas e fazendo uma pequena conta podemos dar delays de milessegundos com uma precisão muito grande. A grande desvantagem do uso desta biblioteca em relação ao uso de Timers é que ao usar as funções da biblioteca fazemos a CPU entrar em "espera ocupada" que significa que ela gasta o tempo pedido realizando trabalho não útil. Mas para muitas aplicações esta é uma perda aceitável então vamos a explicação do funcionamento:

Para saber mais sobre a biblioteca vá em: C:\MCC18\doc\hlpC18Lib e procure por delays.

Conceitos necessários:

1- TCY - Time of Instruction CYcle: é o tempo que a CPU gasta para executar uma instrução.
2- Todos os PICs fazem um ciclo de instrução a cada 4 ciclos de clock (1 TCY = 4 * Tclk (onde Tclk = Periodos de clock)
ou 1 TCY = 4 * (1/Fclk) (onde Fclk é a frequencia do clock))
3- A frequência do KIT PIC MINAS V3.0 é de 48MHz. Escolhemos ela para comunicação USB full sepeed.

4- Então: TCY = 4*(1/48MHz) = 83,33333 ns

Pronto, agora que sabemos o que é TCY já podemos entender o uso das funções delays. Para contar o tempo baseando-se no ciclo de instrução (TCY) da CPU precisamos mandar a CPU executar o número de instruções equivalentes ao tempo desejado.

A fórumula que dá o numero N de ciclos que temos que esperar é dada por:

N = Tempo desejado / TCY

Agora é só usar uma combinação de funções (chamar uma após a outra) que dê o N pedido:


Delay1TCY(void) - Delay de 1 TCY
Delay10TCYx (char) - Delay multiplos de 10 TCY. Você vai passar um número de 0 a 255 onde 0 significa 256.
Delay100TCYx(char) - Delay multiplos de 100 TCY. Você vai passar um número de 0 a 255 onde 0 significa 256.
Delay1KTCYx(char) - Delay multiplos de 1000 TCY. Você vai passar um número de 0 a 255 onde 0 significa 256.
Delay10KTCYx(char) - Delay multiplos de 10000 TCY. Você vai passar um número de 0 a 255 onde 0 significa 256.

Por exemplo:

Vamos supor que você deseja esperar 2 segundos:

N = 2 /(83.333 * 10^-9) = 24000096

Então ficaria:

Delay10KTCYx(240);
Delay10TCYx (9);
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();

Espero ter ajudado,
Qualquer dúvida sinta-se à vontade para perguntar,

Bruno S. Avelar

Bruno S. Avelar
Admin

Mensagens: 74
Data de inscrição: 26/07/2009
Idade: 29
Localização: Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

Re: a funcao delay

Mensagem  anwar em Seg Set 13, 2010 1:34 pm

Boa tarde!

Utilizando a biblioteca <delays.h> conseguimos um delay de acordo com o clock do cristal interno,
mas no kit v3.0, temos um cristal externo, como faço para utilizar o clock dele ao invés do interno
para um delay?

anwar

Mensagens: 1
Data de inscrição: 13/09/2010
Idade: 24

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: a funcao delay

Mensagem  Bruno S. Avelar em Seg Set 13, 2010 6:52 pm

Boa tarde anwar,

Muito boa sua dúvida.

O Kit Pic Minas V3.0 possui um cristal externo de 20 MHz como você pode observar. Dentro do PIC existem multiplicadores de clock possibilita ele a trabalhar em até 48 MHz. Nós geralmente usamos o KIT com clock de 48MHz para permitir comunicação USB 2.0 Full Speed necessária para funcionar o boot loader pela USB (o boot loader é disponibilizado pela Microchip).

A verdade, a funções da biblioteca <delays.h> operam de acordo com o clock de funcionamento do PIC e não do cristal interno. Note, quando nós optamos por usar um cristal externo, o cristal interno é retirado do circuito na arquitetura (tem um multiplexador que seleciona um ou outro).

Logo, para biblioteca <delays.h> é transparente o clock que você usa. Ela dará atrasos multiplos de TCY que se relaciona com o clock. Claro que para diferentes clocks de operação você terá tempos de atraso diferentes para uma mesma função delay escolhida. Entao se você escreve um projeto com um clock X e muda para Y você terá que recalcular os delays usados.

Resumindo, na prática: caso você não mude as configurações de clock do PIC, em nosso KIT, o clock será sempre de 48MHz e nao do cristal interno.

Espero ter ajudado,

Bruno S. Avelar

Bruno S. Avelar
Admin

Mensagens: 74
Data de inscrição: 26/07/2009
Idade: 29
Localização: Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

Tmbm sobr o delay

Mensagem  Davi Fontes em Sex Nov 29, 2013 3:22 pm

Boa tarde, sou Davi, estou iniciando agora em programação e ainda sou pouco experiente.

Estou fazendo um circuito em que existe um botão liga/desliga, mas quero q ele apenas dê o contato com o circuito após ter sido pressionado por 3 segundos e após disso q o led permaneça acesso.
Estou usando o MPLABX e estou tentando pelo Delay1KTCYx(3) e/ou Delay10KTCYx(100), coloquei esse delay três vezes para obter 3 segundos. Mas não estou conseguindo deixar exatamente esse tempo ora quando aperto fica rápido ora demora para acender o led, e não permanece acesso.

Davi Fontes

Mensagens: 1
Data de inscrição: 29/11/2013

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum