a funcao delay
4 participantes
Página 1 de 1
a funcao delay
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.
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
Resposta a Delay
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
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
DELAY NO MPLAB
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
Delay10KTCYx(216);
Se me lembro bem ja usei assim Delay_ms = (100);
Alguem pode ajudar ?
Abraco
julio- Convidado
DELAY NO MPLAB
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
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
Re: a funcao delay
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?
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 : 33
Re: a funcao delay
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
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
Tmbm sobr o delay
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.
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
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|