Página 1 de 1

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

MensagemEnviado: 17 Nov 2009 12:14
por _blackmore_
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!

MensagemEnviado: 17 Nov 2009 13:52
por Jozias del Rios
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! ;-)

MensagemEnviado: 18 Nov 2009 01:43
por _blackmore_
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!

MensagemEnviado: 18 Nov 2009 07:34
por tcpipchip
Outra coisa, evite printf dentro de interrupts...

MensagemEnviado: 18 Nov 2009 20:42
por _blackmore_
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!

MensagemEnviado: 18 Nov 2009 22:04
por Djalma Toledo Rodrigues
Sugestão:

Diminua a Velocidade de Comunicação durante a Simulação
Quando retirar o LCD restabeleça.
.