Xtal de 3,579545 MHZ, a dúvida continua...

Componentes, Dispositivos, Equipamentos, etc...

Moderadores: 51, guest2003, Renie

Mensagempor andre_luis » 20 Out 2006 12:49

Vou dar um palpite - sem fundamento - a respeito do porquê do Xtal de 3,579545 MHZ :

Preguiça de calcular; tlavez um tenha usado esse cristal, o outro copiou o circuito e por aí vai na onda do copy/paste...Estou viajando ?

+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor msamsoniuk » 21 Out 2006 18:05

acho que depende da aplicacao, mas diversos fatores podem influenciar a escolha.

eu normalmente monto meus HC908 com um cristal de 10 MHz para poder gravar neles. isso permite o HC908 conversar com o PC a 9600 bps com um erro de apenas 1,7%. como eu uso muito a porta serial para transferir dados do HC908 para o PC, o cristal de 10 MHz me permite gerar os baud-rates multiplos de 9600 ateh o limite de 38400 bps mantendo o erro de apenas 1,7%. porem, se eu precisar de 57600 bps, preciso setar uma configuracao que comeca a gerar 9,5% de erros e a comunicacao comeca a falhar. mas trocando o cristal de 10MHz por um cristal de 3,579 MHz eu consigo chegar a 57600 e usando um cristal de 7,159 MHz eh possivel chegar a 115200 bps, com um erro de 2,8% em ambas as situacoes. por outro lado, um cristal de 14,318 MHz nao seria possivel no meu caso, pq o HC908 soh aciona diretamente cristais de ateh 11MHz (isso testei experimentalmente). claro, se for usar um oscilador TTL eh possivel chegar ateh os 32MHz (mas o core HC08 soh opera ateh 8 MHz, entao o clock externo tem q ser dividido internamente por 4). a situacao ideal certamente seria um cristal multiplo de 3,6864 MHz, mas nao apenas eh dificil de encontrar, como tambem iria deixar a gravacao com 7200 bps e o PC nao possui suporte a essa velocidade.

se eu fosse hoje montar um 68306, por exemplo, iria utilizar com toda tranquilidade um cristal de 14,318 MHz (4x 3,57 MHz, facil de encontrar e bastante barato): iria obedecer os limites do PLL do core (16MHz) e ao mesmo tempo iria suprir o clock necessario para a UART gerar todos os baud-rates possiveis com erros abaixo de 3% e poderia ateh implementar algum sub-sistema para gerar imagens, visto que seria facil gerar toda a temporizacao de TV a partir do cristal escolhido. por outro lado, se fosse usar um 68302, iria utilizar um cristal de 16,384 MHz, mais caro e dificil de encontar, mas que permitiria ao mesmo tempo gerar com precisao toda a temporizacao TDM sem erros (este seria o principal objetivo) e todos baud-rates para a UART com erros abaixo de 1,5%.

por sinal o kraft me perguntou sobre os DTMF, entao eu fiz um pequeno programa em awk que permite determinar os melhores valores. o calculo em si eh simples, vejamos por exemplo, para gerar 1633 Hz a partir de 3.57 MHz, teriamos que dividir o clock de 3.57 MHz um determinado numero de vezes:

3579545 Hz / 1633 Hz = 2192.005

como eu sou fisico, eu costumo jogar fora aquele 0.005, entao ficamos com 2192. mas esse nao eh um valor util, pq na maioria dos microcontroladores os timers possuem um prescaler com um divisor de base 2 e entao um contador, normalmente de 8 bits. assim, precisariamos procurar o menor prescaler de modo que o contador fosse menor que 255 e ao mesmo tempo o valor do prescaler nao truncasse nosso numero, pois o prescaler eh um numero de base 2. por exemplo, um valor de 64 no prescaler iria resultar em:

2192 / 64 = 34.25

jogamos fora o 0.25 e temos prescaler 64 e contador 34, soh que:

3579545 Hz / (34*64) = 1645 Hz

ou seja, teriamos uma frequencia de 1645Hz e, portanto, um erro de 0.73%. calcular o erro tambem nao eh dificil:

1645*100%/1633 = 100.73%, entao estamos errando por 0.73% a mais.

usando o programinha, eu simplesmente testo os possiveis prescalers em sequencia:

Código: Selecionar todos
root@darkstar:~# awk -f clock.awk
digite o valor em Hz: 1633
o divisor ideal eh 2192 com erro de -0.000251% em relacao ao valor 1633.000000
 16 137: 1633.004106 Hz com um erro de -0.000251% em relacao a 1633.000000 Hz
 32  68: 1645.011489 Hz com um erro de -0.735547% em relacao a 1633.000000 Hz
 64  34: 1645.011489 Hz com um erro de -0.735547% em relacao a 1633.000000 Hz
128  17: 1645.011489 Hz com um erro de -0.735547% em relacao a 1633.000000 Hz



entao se usar 16 e 137 temos uma situacao ideal, produzindo 1633 Hz com um erro minimo!

eh claro que isso eh o valor bruto dos divisores e vc precisa ajustar o duty-cycle. para obter 1633Hz com duty-cycle de 50%, usariamos um prescaler 8 e um contador 137, obtendo entao o dobro do numero de interrupcoes, onde o tratamento destas interrupcoes apenas invertem o estado logico de um determinado pino. a cada duas interrupcoes temos um ciclo completo e, no tempo, obtemos os 1633 Hz corretamente.

o programinha em awk eh bastante simples:

Código: Selecionar todos
#!/bin/awk -f

BEGIN {

        printf "digite o valor em Hz: ";
        getline valor;
        divisor=int(3.579545e6/valor);
        erro=100.0-(100.0*3.579545e6/divisor)/valor

        printf "o divisor ideal eh %d com erro de %f%% em relacao ao valor %f\n",divisor,erro,valor;

        for(i=1;i<=256;i+=i) {

                j=int(divisor/i);
                if(i<256 && j<256) {

                        real=3.579545e6/(i*j);
                        erro=100.0-(100.0*(3.579545e6/(i*j))/valor);

                        printf "%3d %3d: %f Hz com um erro de %f%% em relacao a %f Hz\n",i,j,real,erro,valor;
                }
        }
}



apenas para complementar, segue os resultados para as frequencias do DTMF:

Código: Selecionar todos
 16 185: 1209.305743 Hz com um erro de -0.025289% em relacao a 1209.000000 Hz
 16 167: 1339.650075 Hz com um erro de -0.273209% em relacao a 1336.000000 Hz
 16 151: 1481.599752 Hz com um erro de -0.311425% em relacao a 1477.000000 Hz
 16 137: 1633.004106 Hz com um erro de -0.000251% em relacao a 1633.000000 Hz
 32 160: 699.129883 Hz com um erro de -0.305579% em relacao a 697.000000 Hz
 32 145: 771.453664 Hz com um erro de -0.188788% em relacao a 770.000000 Hz
 32 131: 853.899094 Hz com um erro de -0.222898% em relacao a 852.000000 Hz
 16 237: 943.972838 Hz com um erro de -0.315923% em relacao a 941.000000 Hz



assim, eh facil perceber que um microcontrolador consegue gerar, a partir de um cristal de 3.57 MHz, frequencias como o DTMF, perfeitamente dentro das margens de erro previstas (1.5% para o caso do DTMF), nao esquecendo que para isso eh necessario usar 2 timers e juntar duas frequencias para obter um simbolo DTMF valido ;)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor MaxOliver » 22 Out 2006 09:25

__JEREK__ escreveu:recentemente comprei essa placa para aprendizado de PIC (multipic) e ela vem com esse cristal, tambem não entendi porque.

a placa é essa:

Imagem

eu gostaria de saber se para programas que trabalhem com temporização, temporizador existe algum cristal específico ou que chegue próximo ao tempo real ou se o cristal não influencia, depende do programa. obrigado!!!


Normalmente em kits de desenvolvimento o uso desse tipo de cristal é por causa das portas RS232 do microprocessador que ficam sem erro de transmissao.
MaxOliver
Bit
 
Mensagens: 28
Registrado em: 19 Out 2006 19:52

Anterior

Voltar para Componentes\Equipamentos Eletrônicos

Quem está online

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

x