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