Autor Tema: Problema con Transmision y Recepcion en serie, rs232  (Leído 1765 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Problema con Transmision y Recepcion en serie, rs232
« en: 18 de Mayo de 2006, 13:22:26 »
Hola saludos debo realizar una comunicación entre dos PICs, cual es la mas óptima? use Usart, este es mi codigo para el transmisor:

#include<16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)
#use rs232 (baud=240,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#use fast_io(b)
#byte port_b=0x06

void main()
{
   int dato=0;             // Reserva de espacio de memoria
   set_tris_b(0xff);       // Se usarán RB4 a 7 para el ingreso de los datos
   port_b=0;               // Se inicializa puerto B

   while(true)             // Ciclo infinito
   {
      //while(dato!=0)       // Si se ha presionado ningún pulsador
   //   {
           // dato variará segun pulsador presionado, pulsadores en RB4 a RB7
        dato=port_b;         // Se copia el valor del puerto B a la variable dato
        switch(dato)
        {
            case 0x10: putc('A');   // por cada pulsador se envia un codigo diferente
            break;
            case 0x20: putc('B');
            break;
            case 0x40: putc('C');
            break;
            case 0x80: putc('D');
            break;
            default:
            break;
        }
   //   }
   }

}

hay partes del código que estan en comentario ya que haciendo la simulación en Proteus si estan presentes esas líneas no envia nada, descartando eso envia pero creo muchas veces porque hace habilitar en el receptor muchas veces la accion y no para, y existe error, solucionandolo con el reset por hardware.

este mi codigo en el receptor:

#include<16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)
#use rs232 (baud=240,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#use fast_io(b)
#byte port_b=0x06

void main()
{
   int dato=0,i;
   set_tris_b(0x0f);
   port_b=0;

   while(true)
   {
      if(kbhit())       // si hay algo pendiente de descargar en la USART...
      {
         dato=getc();   // lo descargo sobre la variable -dato-

         switch(dato)   // según dato recibido se hace lo que corresponda
         {
            case 'A': //for (i=0;i<=3;i++)
                       {
                        output_high(PIN_B4);//port_b=0x10;
                        delay_ms(500);
                        output_low(PIN_B4);//port_b=0;
                        delay_ms(500);
                       }
                       break;
            case 'B': //for(i=0;i<=3;i++)
                       {
                        output_high(PIN_B5);//port_b=0x20;
                        delay_ms(500);
                        output_low(PIN_B5);//port_b=0;
                        delay_ms(500);
                       }
                       break;
            case 'C': //for(i=0;i<=3;i++)
                       {
                        output_high(PIN_B6);//port_b=0x40;
                        delay_ms(500);
                        output_low(PIN_B6);//port_b=0;
                        delay_ms(500);
                       }
                       break;
            case 'D': //for(i=0;i<=3;i++)
                       {
                        output_high(PIN_B7);//port_b=0x80;
                        delay_ms(500);
                        output_low(PIN_B7);//port_b=0;
                        delay_ms(500);
                       }
                       break;
            default: port_b=0;
                       break;
         }

         dato=0; // restablesco dato
      }
   }
}

en este caso quisiera que un led segun el codigo recibido parpadee cuatro veces, eso lo hice con el ciclo for, y como mencione creo ocurre error o recibe muchas veces la señal del transmisor y parpadea exactamente doce veces a la primera presion del pulsador, y si presiono otro pulsador vuelve a parpadear el mismo led mas veces, creo nunca deja de parpadear, lo que no deberia pasar, deberia parpadear otro led, y no deberia parpadear 12 veces sino tan solo 4, y quitando el for, parpadea 4 veces, pero solo deberia parpadear una, bueno todo un problemota, como puedop solucionarlo, ayuda porfavor!!!!, despues pienso impleentarlo con un tx y rx en rf (a 4800 b/s en receptor), por eso use la velocidad de 240 bauds, esta bien, o que velocidad podria usar despues??; ayuda porfavor, necesito terminar con exito este trabajo lo mas rápido que pueda!!

estare muy agredecido a los que me respondieran y siempre mi ayuda en lo que pueda, muchas gracias
chao.
.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema con Transmision y Recepcion en serie, rs232
« Respuesta #1 en: 18 de Mayo de 2006, 16:22:44 »
int dato=0;
...
 while(true)               // Ciclo infinito
 {
    while(dato!=0)       // Si se ha presionado ningún pulsador
    {
         dato=port_b;   // Se copia el valor del puerto B a la variable dato
           
Inicializas dato a cero ... entras en el bucle infinito .... y ahí se queda porque el while(dato!=0) con dato=0 impide que entre y puedas hacer el dato=port_b;

Descomenta y prueba a empezar con ...

int dato=1;

... creo ...  :shock:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Problema con Transmision y Recepcion en serie, rs232
« Respuesta #2 en: 18 de Mayo de 2006, 17:52:42 »
muchas gracias!!! por la respuesta :-/, estabas en lo correcto, cambie por esta sentencia:
void main()
{
   int dato;                 // Reserva de espacio de memoria
   ...
   while(true)              // Ciclo infinito
   {
      dato=port_b;       // copiar el valor del puerto B en la variable Dato
      if(dato!=0)          // Si se ha presionado algún pulsador ingresa al ciclo
                               //(pulsadores en Rb4 a Rb7 normalmente en cero)
      {
        switch(dato)
        {
            case 0x10: putc('A');   // por cada pulsador se envia un codigo diferente
            break;
            ....
        }
      }
   }
}
Ahora si esta parte funciona correctamente, lo que sigue fallando es el receptor, mantiene el mismo error que mencione en el post anterior. alguna sugerencia??

Como podria utilizar interrupciones para este programa (intrrupcion en tx y en rx), talvez pueda solucionar el problema usando interrupciones??, pero como configurar y hacer las rutinas, no se como hacerlo, alguien sabe del tema??

muchas gracias, chao.
.