Página 1 de 1
Comunicação serial

Enviado:
14 Mai 2011 00:18
por lafourcade
Amigos
Eu estou usando um AT89C2051 e eu preciso configurar o baud rate da minha comunicação uart com 250 000 bps. Eu estou usando um cristal de 16MHz. Alguem poderia me ajudar?
Obrigado
Re: Comunicação serial

Enviado:
14 Mai 2011 14:16
por andre_luis
lafourcade
Estou te enviando uma macro que usei num outro core 51 da Atmel. Usei uma abordagem parametrizavel de modo a facilitar a portabilidade para outras configurações de hardware ( cristal ). Foi feito para o AT89C55WD mas creio que a regra seja semelhante mas testa aí :
T2CON = 0x34; /* timer 2 usado como baud rate generator */
TH2 = BYTE_H_TMR2;
TL2 = BYTE_L_TMR2;
RCAP2H = BYTE_H_TMR2;
RCAP2L = BYTE_L_TMR2;
#define BAUDRATE 9600
#define FREQUENCIA_CRISTAL 24000000
#define FREQ_TIMER_0 100
#define FREQ_TIMER_1 48
#define CICLOS_DE_MAQUINA 12
#define DIVIDENDO_BAUDRATE FREQUENCIA_CRISTAL
#define DIVSOR_BAUDRATE (unsigned long)((unsigned long)32*(unsigned long)BAUDRATE)
#define QUOCIENTE_BAUDRATE (unsigned int)((unsigned long)DIVIDENDO_BAUDRATE/(unsigned long)DIVSOR_BAUDRATE)
#define CARGABAUD (unsigned int)((unsigned long)65536-(unsigned long)QUOCIENTE_BAUDRATE)
#define BYTE_H_TMR2 CARGABAUD_H
#define BYTE_L_TMR2 CARGABAUD_L
#define CARGABAUD_L (char)( CARGABAUD%256 )
#define CARGABAUD_H (char)( CARGABAUD>>8 )
Catei isso acima em diversos arquivos. Certamente está fora da sequencia de compilação.
Se estiver sobrando alguma coisa descarta.
Se estiver faltando reclama.
+++

Enviado:
16 Mai 2011 19:02
por lafourcade
Cara, muito obrigado. To em viagem e vou testar na volta na quarta. Mas entendi. Obrigado.

Enviado:
16 Mai 2011 19:57
por andre_luis
Então...Esqueci de dizer que compilei no KEIL; mas creio que não vai fazer diferença, se voce conseguir relacionar os registradores do 8051 com a nomeclatura usada acima ( nada demais; afinal, são apenas 3 ).

Enviado:
21 Jun 2011 19:17
por lafourcade
Outro problema gente: Eu consegui configurar o baud rate em 9600bps usando a seguinte formula:
// ..........................1.............11059000
// 9600 Bps.....=...---.....x.....------------
// .........................32............12x(256-3)
testei no proteus e funcionou. Neste caso eu estou usando um cristal de 11.059MHz
Eu pretendo no meu projeto usar um cristal de 16MHz
A formula ficaria assim:
//............................................16 000 000
// .....Taxa..=.. 256...-........------------------------
// .....................................32 x 12 x Baud Rate
Acontece que eu nunca conseguiria chegar a 250 Kbps usando essa formula. O modo que eu estou usando é o modo 2.
Quem sabe usando outro modo?
Eu tentei tb a opção do andre_teprom usando o timer 2 mas tb não deu.
Alguem sabe me dizer como eu chego a 250 kbps
Obrigado

Enviado:
21 Jun 2011 20:11
por andre_luis

Enviado:
21 Jun 2011 21:58
por lafourcade
Obrigado andre_teprom
E o que seria o Serial Clock Divisor?
Eu coloquei:
Cristal Frequency 16MHz
Serial Clock Divisor: 2
Timer 1 (Mode 2, SMOD=1)
e usando 0xFE de TH1 eu consigo chegar a 250 000
Só não consigo montar isso.
Eu configuro assim:
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TCON = 0x40;
TH1 = 0xFD;
O que está errado?

Enviado:
21 Jun 2011 22:42
por andre_luis
Na simulação que fiz, encontrei valores diferentes do seu :
Dados de entrada :
Cristal Frequency 16MHz
Serial Clock Divisor: 12
Timer 1 / Mode 2 / SMOD = 0
Baud desejado = 250.000
Dados retornados :
TH1 = 59h
Baud efetivo = 249.500
+++

Enviado:
21 Jun 2011 23:09
por lafourcade
O que seria o:
Serial Clock Divisor: 12 ?
Como eu configuro?
e o:
Timer 1 / Mode 2 / SMOD = 0
e esse Mode 2?
eu seto através de
SM0 = 1;
e SM1 = 0;
?

Enviado:
22 Jun 2011 08:29
por andre_luis
Olha,
Faz tempo que não trabalho com esse uC, e teria de dar uma pesquizada.
Se encontrar algo coloco aqui.
Segue mais algumas configurações que usei na parametrização do 1o exemplo que postei acima ( pode ser que ajude ) :
- Código: Selecionar todos
/*-------------------------------------------------------------------*/
TMOD = 0x11; /* Timer0:modo 1 - Timer1:modo 1 */
TCON = 0x55; /* timer 0 e 1 ativos */
T2CON = 0x34; /* timer 2 usado como baud rate generator */
SCON = 0x58; /* habilita recepcao */
/*-------------------------------------------------------------------*/
Caso voce use esse mesmo Modo e Timer, pode usar as fórmulas anteriores, que funcionaram perfeitamente.
Sugiro voce começar com o mesmo Baud que usei, e depois tentar o que voce precisa.
+++

Enviado:
28 Jun 2011 10:05
por lafourcade
ei andre! Acho que ta faltando alguma coisa.
Onde é que tu usa isso:
#define FREQ_TIMER_0 100
#define FREQ_TIMER_1 48
#define CICLOS_DE_MAQUINA 12
????

Enviado:
28 Jun 2011 18:34
por andre_luis
Aqui vai :
- Código: Selecionar todos
#define DIVIDENDO_TIMER (unsigned long)((unsigned long)FREQUENCIA_CRISTAL/(unsigned long)CICLOS_DE_MAQUINA)
#define DIVISOR_TIMER_0 (unsigned long)FREQ_TIMER_1
#define CARGA_TIMER_0 (unsigned int)((unsigned long)65536-(DIVIDENDO_TIMER/DIVISOR_TIMER_0))-1
#define CARGA_TIMER_0_L (char)(CARGA_TIMER_0%256)
#define CARGA_TIMER_0_H (char)(CARGA_TIMER_0>>8)
#define DIVISOR_TIMER_1 (unsigned long)FREQ_TIMER_1
#define CARGA_TIMER_1 (unsigned int)((unsigned long)65536-(DIVIDENDO_TIMER/DIVISOR_TIMER_1))-1
#define CARGA_TIMER_1_L (char)(CARGA_TIMER_0%256)
#define CARGA_TIMER_1_H (char)(CARGA_TIMER_0>>8)
/*----------------------------------------------------------------*/
#define BYTE_H_TMR0 CARGA_TIMER_0_H
#define BYTE_L_TMR0 CARGA_TIMER_0_L
#define BYTE_H_TMR1 CARGA_TIMER_1_H
#define BYTE_L_TMR1 CARGA_TIMER_1_L
#define BYTE_H_TMR2 CARGABAUD_H
#define BYTE_L_TMR2 CARGABAUD_L
//---------------------------------------------
#define _RECARGATIMER0 TH0 = BYTE_H_TMR0 ; \
TL0 = BYTE_L_TMR0 ;
#define _RECARGATIMER1 TH1 = BYTE_H_TMR1; \
TL1 = BYTE_L_TMR1;
/*----------------------------------------------------------------*/
+++
Re: Comunicação serial

Enviado:
14 Jun 2013 00:44
por renan-papaco
geralmente quando uso comunicação serial entre um MCU e outro... eu configuro o baud rate pra 300 bps... usando um cristal pra 11.59MHz. se vc n precisar dos 16MHz no seu mcu...pode por o cristal de 11.59 mhz e configurar o baud rate em 300 bps q vai tranquilo.