Ir ao conteúdo

Problema com taxa de transmissao pic+rs232


Ir à solução Resolvido por Jessica Amorim,

Posts recomendados

Postado

Ola galera!

Estou finalizando um projeto e precisava ter uma seleção de taxa de transmissão para o meu cliente. A comunicação é feita por RS 232 tenho um botão para ele selecionar o equipamento e outro botão para selecionar a taxa de transmissão, porém não esta funcionando a mudança da taxa de transmissão, quando eu incremento a variável para mudança da taxa de transmissão ele trava. Ja tentei usar uma variável mas o mikroC só aceita constante para:

 

UART1_Init(constante);

Delay_ms(100);

 

Alguém sabe como fazer ele aceitar que mude durante o código, ou como fazer a configuração de velocidade "na unha" sem precisar de bibliotecas, ou uma taxa de transmissão automática, ou tem uma ideia melhor?

 

Estou utilizando o mikroC, o PIC18F4550.

 

obrigada.

  • Membro VIP
Postado

Sim, o ideal é fazer na unha mesmo mas exige um pouco de dedicação e curiosidade pra dar uma olhadela no datasheet do teu mc e 'sujar um pouco as mãos'. O que não é nada difícil: basta programar alguns registros. Mas se você preza pela 'higiene', você tem a opção de alguns switch case bem 'limpinhos'

void setbaud(unsigned char br)
{
switch (br){
case 1: UART1_Init(1200);break;//chutei.. não conheço a função
case 2: UART1_Init(2400);break;
case 3: UART1_Init(3600);break;
case 4: UART1_Init(4800);break;
...
case x: UART1_Init(yyyy);break;
}
}

Provavelmente teu sistema não deve ter muitas velocidades.

Ah, ouvi dizer que alguns mc tem um lance de autobaudrate. Avalie se vale a pena saber + sobre

  • Curtir 1
Postado
 

Sim, o ideal é fazer na unha mesmo mas exige um pouco de dedicação e curiosidade pra dar uma olhadela no datasheet do teu mc e 'sujar um pouco as mãos'. O que não é nada difícil: basta programar alguns registros. Mas se você preza pela 'higiene', você tem a opção de alguns switch case bem 'limpinhos'

true  

 Ola Isadora,

o switch case também trava. E não é preguiça de "googla", eu achei o registrador que se chama SBPRG para mudança e calculo de baud, mas não funciono corretamente em C, acho que terei que colocar um bloco em asm no meu código pra esta parte.

 

Provavelmente teu sistema não deve ter muitas velocidades.

Ah, ouvi dizer que alguns mc tem um lance de autobaudrate. Avalie se vale a pena saber + sobre

true  

Vi algo sobre isso também, e seria ate melhor, mas não achei literatura em português para isso então estou lendo alguns artigos e fóruns em inglês pra ver se acho.

 

obrigada.

 

  • Membro VIP
Postado

Sem o cod completo e esquemas vou ficar no campo das especulações...

Defina melhor "trava" onde-como-quando. Talvez seja porque você está manipulado o registro enquanto há transmissão ou algo assim. Experimente parar de transmitir e/ou receber, desabilitar a interface, alterar o b.r. e reabilitar tx rx. Definir um timeout também pode destravar. Algo como

unsigned char recebebyte()
{
unsigned char dado=0,tmp=0;
while(!RCIF && tmp--);
if (tmp) dado=RCREG;
return dado;
}

Perceba o sujar as mãos nos registros

 

Nada a ver asm. Basta um SBPRG=xx;

 

você não está só... Sobre autobaud veja e/ou participe disso que acaba de sair do forno

O cara é bom profissional e pessoalmente. Aposto que ele vai compartilhar a solução com você e claro, você deve compartilhar conosco

  • Curtir 1
  • Solução
Postado

Funcionou @Isadora Ferraz.

Fiz assim:

 

int baud_rat;                                              
unsigned int B_R[5]={1665,415,207,51,25};
 

void main() {     

CMCON=0x07;    
ADCON1=0x0F;    

TRISA=0;         
TRISB=0B00000111; 
TRISC=0b01000000;  
TRISD=0;           
TRISE=0;           

PORTA=0;         
PORTB=0;            
PORTC=0;           
PORTD=0;            
PORTE=0;             

               

baud_rat = EEPROM_Read(0x01);            

             

TXSTA.F2=0;
TXSTA.F4=0;
RCSTA.F7=1;
RCSTA.F4=1;
BAUDCON.F3=1;
SPBRG=B_R[baud_rat];
 

while(1){
if(PORTB.F0==0){            
baud_rat++;
if(baud_rat>=5)baud_rat=0;
SPBRG=B_R[baud_rat];
}

}

 

Postei apenas a parte de configuração da serial, mas foi isso que funcionou pra mim.

Muito obrigada!

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

 

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

 
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!