Comunicação serial

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Comunicação serial

Mensagempor lafourcade » 14 Mai 2011 00:18

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

Re: Comunicação serial

Mensagempor andre_luis » 14 Mai 2011 14:16

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.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lafourcade » 16 Mai 2011 19:02

Cara, muito obrigado. To em viagem e vou testar na volta na quarta. Mas entendi. Obrigado.
lafourcade
Byte
 
Mensagens: 123
Registrado em: 20 Out 2006 06:40

Mensagempor andre_luis » 16 Mai 2011 19:57

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 ).
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lafourcade » 21 Jun 2011 19:17

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
Editado pela última vez por lafourcade em 21 Jun 2011 19:30, em um total de 1 vez.
lafourcade
Byte
 
Mensagens: 123
Registrado em: 20 Out 2006 06:40

Mensagempor andre_luis » 21 Jun 2011 20:11

Tenta usar esse simulador :

http://www.keil.com/c51/baudrate.asp

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lafourcade » 21 Jun 2011 21:58

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

Mensagempor andre_luis » 21 Jun 2011 22:42

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



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lafourcade » 21 Jun 2011 23:09

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

Mensagempor andre_luis » 22 Jun 2011 08:29

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.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lafourcade » 28 Jun 2011 10:05

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

????
lafourcade
Byte
 
Mensagens: 123
Registrado em: 20 Out 2006 06:40

Mensagempor andre_luis » 28 Jun 2011 18:34

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;
/*----------------------------------------------------------------*/


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Comunicação serial

Mensagempor renan-papaco » 14 Jun 2013 00:44

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56


Voltar para 8051

Quem está online

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

x