isso varia conforme o hardware da UART utilizada, mas geralmente o clock de referencia tem que ser 16x maior que a taxa que vc quer utilizar. por exemplo, para 9600 bps vc precisa de um clock de 153600Hz. para um clock de 8MHz e prescaler 8, vc teria que programar um divisor 6, porem isso na verdade dah 10416 bps e assim vc tem um desvio de +8% em relacao aos desejados 9600 bps. se usar um clock de 10MHz com prescaler 8 e dividor 8, vc obtem um clock de 156250Hz e uma taxa de 9765bps, o que eh 1% acima do desejado.
agora, para 115200 bps o prescaler divide demais o clock. para 10MHz o divisor teria que ser da ordem de 5.4 e sem prescaler, o que seria portanto 5 ou 6. mas com 5 vc teria +8% de desvio e 6 vc teria quase -10%, o q na pratica eh bastante. se usasse um clock de 8MHz, o divisor seria 4.3, de modo que usando 4 vc teria 8% de erro, tambem muito alto.
bom, vc pode calcular para outros cristais de velocidades diferentes, basicamente a ideia eh:
divisor = clock / (16*rate)
por exemplo, para um clock de 16MHz gerar 115200 bps temos:
dividor = 16000000 / (16*115200) = 8.68056
como os dividores programaveis soh aceitam valores inteiros, temos o valor 8 ou 9 no divisor, o que produz:
rate = 16000000 / (8*16) = 125000 bps
rate = 16000000 / (9*16) = 111111 bps
dae vc calcula o desvio em relacao ao esperado:
desvio = 125000*100/115200-100% = 8.5%
desvio = 111111*100/115200-100% = -3.5%
me parece que uma variacao de uns 3% jah fica bem aceitavel, ao menos eh que o eu li por ae.
nao sei exatamente como funciona, acho que ateh varia conforme o circuito da UART. imagino que durante a recepcao do start bit vc alinha uma borda de clock com a borda do start bit e entao vc usa esse alinhamento durante a recepcao da palavra inteira, que geralmente contem uns 10 bits. se o clock deslizar 16 unidades em 160, vc perde sincronismo justamente no ultimo bit.
obviamente os sistemas possuem um certo ruido e jitter nos clocks, o que faz estes 10% irem para frente e para tras, assim vc acaba chegando nos 3% de tolerancia. se vc tiver um erro menor de 3%, provavelmente nunca vai ter erros de sincronismo. se estiver entre 3 e 10%, os erros vai aparecer esporadicamente conforme o jitter no clock e nas linhas de transmissao. se for acima de 10%, provavelmente ele nunca vai conseguir sincronizar o ultimo e vc vai ter um volume grande de erros.
dandrade escreveu:Estava lendo post em diversos foruns, que afirma ocorrer erros de comunicação RS232 quando o cristal do microcontrolador não é adequado.
Vou usar o ATmega8L opera ate 8Mhz. E o prescaler do temporizador divide por 8-64-256
Mas, qual a frequencia base dos circuitos RS232 ?
Portanto, qual o metodo para selecionar a frequencia do cristal para ter uma base para calendario e comunicação estaveis?
Nesta pagina existe lista das frequencias comerciais dos cristais
http://www.clacristais.hpg.ig.com.br/