Rotina de delay

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

Rotina de delay

Mensagempor lafourcade » 20 Jan 2010 08:33

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
lafourcade
Byte
 
Mensagens: 123
Registrado em: 20 Out 2006 06:40

Mensagempor Djalma Toledo Rodrigues » 20 Jan 2010 09:51

125 Hz = 8 ms

Se pretende 1 ms:

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

algo assim

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor mastk » 20 Jan 2010 10:01

Dificil dizer concerteza, o melhor eh fazer eh disasemblar e contar os ciclos que a rotina leva ou fazer a sua contadinha.
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor lafourcade » 20 Jan 2010 13:01

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.
lafourcade
Byte
 
Mensagens: 123
Registrado em: 20 Out 2006 06:40

Mensagempor pbernardi » 20 Jan 2010 14:09

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.
But to us there is but one God, plus or minus one - Corinthians 8:6±2. (xkcd.com)
pbernardi
Word
 
Mensagens: 707
Registrado em: 12 Out 2006 19:01
Localização: Curitiba-PR

Mensagempor Djalma Toledo Rodrigues » 20 Jan 2010 14:53

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
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor lafourcade » 21 Jan 2010 12:23

Minha dúvida era com relaçao a frequencia, qual usar... mas ficou bem esclarecido. Blz, muito obrigado a todos.
lafourcade
Byte
 
Mensagens: 123
Registrado em: 20 Out 2006 06:40

Re: Rotina de delay

Mensagempor gobatto » 22 Abr 2010 23:29

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
gobatto
Bit
 
Mensagens: 13
Registrado em: 22 Mai 2009 16:43
Localização: Bento Goncalves - Brasil


Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x