Comunicação Serial - coisa doida não funciona

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Comunicação Serial - coisa doida não funciona

Mensagempor _blackmore_ » 17 Nov 2009 12:14

Amigos foristas, boa tarde.

Através de simulação no Proteus, estou empacado em um problema.
Tenho que fazer com que 2 microcontroladores se comuniquem através de serial (232) ...

Transmissor - faço a leitura de 4 valores e envio pela serial onde através da simulação é possível ver os sinais pelo Virtual Terminal ... ou seja aparentemente a parte 1 está funcionando:
Receptor - configuro a int_rda para receber os 4 dados e recebo os dois primeiros, pronto converto para int e direciono adequadamente para sua finalidade e funciona através de simulação e verificação com Oscilloscope .. porém os 2 últimos não chegam ... nem consigo mostrar eles em um LCD !!! Os dois primeiros sinais são de 16 bits e os dois ultimos são de 1 bit, jah tentei enviar outros valores de 16 bits e nda .. somente recebo os 2 primeiros ... o que será que está acontecendo?

Código: Selecionar todos
#include <18F252.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT
#use rs232 ( baud=9600, rcv=PIN_C7, xmit=PIN_C6 )
#include <regs_18Fxx2.h>
#include <mod_lcd.c>
#include <rs232.c>
#include <input.c>
#include <stdlib.h>


   // Declaração de variáveis

   int cont;
   long int valor3, valor3a=0, valor4, valor4a=0;
   long int valor1a=0, valor2a=0;
   long int valor1=511, valor2=511;

   // Interrupção Serial

   #int_rda
   void Isr_Serial()
   {

         cont++;
         if (cont==1) {
            get_string (valor1,16);            // Recebe dado da usart
            lcd_pos_xy (1,1);                  
            printf (lcd_escreve,"%s", valor1);
            valor1a = atol (valor1);
                  }

         if (cont==2) {
            get_string (valor2,16);            // Recebe dado da usart
            lcd_pos_xy (9,1);                  
            printf (lcd_escreve,"%s", valor2);
            valor2a = atol (valor2);
                  }

         if (cont==3) {
            get_string (valor3,16);            // Recebe dado da usart
            lcd_pos_xy (1,2);                  
            printf (lcd_escreve,"%s", valor3);
                  }

         if (cont==4) {
            get_string (valor4,16);            // Recebe dado da usart
            lcd_pos_xy (9,2);                  
            printf (lcd_escreve,"%s", valor4);
                  }

         if (cont>=4) { cont = 0;}

   }


Agradeço qualquer ajuda referente ao assunto ...

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor Jozias del Rios » 17 Nov 2009 13:52

Bixo, provavelmente o terceiro e o quarto byte estão chegando enquanto o segundo está no double-buffer esperando para ser lido na próxima interrupt.
Acontece que vc está levando muito tempo para tratar cada byte, através das chamadas "lcd_pos_xy" e "printf"... se essas duas levarem mais de 1ms para serem executadas, vc vai perder bytes!

detalhe que 1ms é o tempo aproximado entre 1 byte e o próximo numa comunicacao serial a 9600bps como a sua.

Vc deve implementar isso primeiro lendo todo o seu "frame", depois interpretando-o.

Pode checar contra erros de "buffer overrun" na sua uart... os bytes estão se acumulando e vc não os está lendo! ;-)
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor _blackmore_ » 18 Nov 2009 01:43

bom ... não sei qual é a magia da simulação ... mas agora funcionou ... e magia maior ... com 6 bytes agora !!
apenas diminui para 5 o número máximo de caracter do comando ...

Código: Selecionar todos
get_string (valor1,5);


então aparentemente resolvido ...

Jozias del Rios

vou lembrar de tuas observações qdo eu montar o circuito na placa ... abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor tcpipchip » 18 Nov 2009 07:34

Outra coisa, evite printf dentro de interrupts...
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor _blackmore_ » 18 Nov 2009 20:42

Outra coisa, evite printf dentro de interrupts...

sim ... já me disseram isso ... mas eu não consegui fzer a simulação funcionar sem que o print seja na interrup .. na verdade o LCD está ali apenas para que eu saiba se tudo está conforme eu necessito .. na hora H mesmo não vou utilizá-lo e logicamente irei retirá-lo do firm ..

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor Djalma Toledo Rodrigues » 18 Nov 2009 22:04

Sugestão:

Diminua a Velocidade de Comunicação durante a Simulação
Quando retirar o LCD restabeleça.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22


Voltar para PIC

Quem está online

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

x