Ir ao conteúdo
  • Cadastre-se
Jessica Amorim

RESOLVIDO Problema com taxa de transmissao pic+rs232

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
33 minutos atrás, Isadora Ferraz disse:

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'

 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.

39 minutos atrás, Isadora Ferraz disse:

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

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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

obrigada @Isadora Ferraz, infelizmente não posso postar o código ou o circuito por que é da empresa o projeto. Mas você me deu boas ideias, vou testar a sua solução, o SBPRG e o auto baud e com certeza dou um retorno com a solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×