Página 1 de 1

Rotina de delay

MensagemEnviado: 20 Jan 2010 08:33
por lafourcade
Estou com uma dúvida: Eu configurei o meu oscilador para trabalhar em 24MHz no meu internal bus clock (via device initialization) e 48MHz no PLL output clock freq usando um cristal de 12MHz Dentro do meu while ficou assim:

void main(void)
{
unsigned int contador;

while(1)
{
for (contador=0; contador < 48000; contador++) {}
LED1 =! LED1;
}
}

Eu coloco o osciloscópio e ele me mostra o led piscando em 125Hz ou seja o delay que eu criei com este for gera um tempo de 8ms. Como eu calculo para esse delay ficar em 1ms?

Obrigado

MensagemEnviado: 20 Jan 2010 09:51
por Djalma Toledo Rodrigues
125 Hz = 8 ms

Se pretende 1 ms:

for (contador=0; contador < 48000 / 8; contador++) {}

algo assim

DJ

MensagemEnviado: 20 Jan 2010 10:01
por mastk
Dificil dizer concerteza, o melhor eh fazer eh disasemblar e contar os ciclos que a rotina leva ou fazer a sua contadinha.

MensagemEnviado: 20 Jan 2010 13:01
por lafourcade
Blz, eu não preciso de precisão. Pode dar alguma coisa fora, eu só queria saber, na teoria, que formula usar. Obrigado a todos. Eu só não entendi o porque da divisão por 8, Djalma.

MensagemEnviado: 20 Jan 2010 14:09
por pbernardi
Ué, se vc conta de 1 até x, e dá 8 ms de tempo, contando de 1 até x/8 você vai ter 1 ms de tempo. Simples assim.

MensagemEnviado: 20 Jan 2010 14:53
por Djalma Toledo Rodrigues
Claro que não se vai fazer o µC fazer essa divisão o tempo todo

Em vez de 48 000 ----> 6 000

for (contador=0; contador < 6000; contador++) {}

DJ

MensagemEnviado: 21 Jan 2010 12:23
por lafourcade
Minha dúvida era com relaçao a frequencia, qual usar... mas ficou bem esclarecido. Blz, muito obrigado a todos.

Re: Rotina de delay

MensagemEnviado: 22 Abr 2010 23:29
por gobatto
lafourcade,

calculo funciona assim:

Tcnt = Prescaler/Ffonte.

Tcnt->periodo do incremento do TPMCNT.
Prescaler-> fator de divisao do clock.
Ffonte-> frequencia da fonte de clock (BUSCLK ou Clock externo).

onde a frequencia de interrupcao eh:

Ftof = Ffonte/(prescaler*(TPMMOD+1))

eu uso nos uC da freescale a seguinte rotina para delay é bem precisa:

/**********************************************************************
** Funcao de atraso em ms ***
** ***
** Chamada da Funcao: Delayms(char) ***
** ***
** Retorna nada. ***
** ***
** Configurcao do Timer: ***
** TPMSC: BUSCLK / 16. ***
** TPMMOD: 249. ***
** ***
** Inicialmente armazena a configuracao de TPMSC e TPMMOD. ***
** Apos retorna a configuracao anterior do TPMSC e TPMMOD. ***
** ***
**********************************************************************/


#include <hidef.h>
#include "derivative.h"



/****************************************************
**** ****
**** Delay em milisegundos. ****
**** Usando estouro de contagem do TIMER. ****
**** ****
****************************************************/

void Delayms (unsigned char Tempo)
{
static unsigned char Counter;
static unsigned char HoldTpmsc, HoldTpmmod;

HoldTpmsc = TPMSC; // Armazena conf. atual do TPMSC.
HoldTpmmod = TPMMOD; // Armazena conf. atual do TPMMOD.

TPMSC = 0b00001100; // Timer, interrupcao transbordo com BUSCLK/16.
TPMMOD = 249; // (4MHz/16/249) = 1KHz = 1ms.
TPMCNT = 0; // Zera contagem do TPM.
Counter=0; // Zera contador;
while (Counter<Tempo) // Fica aqui ate atingir o tempo.
{
while(!TPMSC_TOF); // Aguarda estouro da contagem.
TPMSC_TOF = 0; // Apaga Flag de estouro.
Counter++; // Incrementa counter.
}
TPMSC_TOF = 0; // Apaga flag de estouro.
TPMSC = HoldTpmsc; // TPM BUS CLOCK + TPM BUSCLK/4.
TPMMOD = HoldTpmmod; // Retorna contagem do TPM a 65535.

}//=========== FIM Delayms() =====================



lafourcade escreveu:Estou com uma dúvida: Eu configurei o meu oscilador para trabalhar em 24MHz no meu internal bus clock (via device initialization) e 48MHz no PLL output clock freq usando um cristal de 12MHz Dentro do meu while ficou assim:

void main(void)
{
unsigned int contador;

while(1)
{
for (contador=0; contador < 48000; contador++) {}
LED1 =! LED1;
}
}

Eu coloco o osciloscópio e ele me mostra o led piscando em 125Hz ou seja o delay que eu criei com este for gera um tempo de 8ms. Como eu calculo para esse delay ficar em 1ms?

Obrigado