Autor Tema: Problema de comunicacion RS232  (Leído 2117 veces)

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Problema de comunicacion RS232
« en: 09 de Julio de 2005, 14:43:00 »
No se como pegar un fichero Proteus para ver si podeis ayudarme con un codigo. EL codigo si puedo pegarlo pero con el Proteus se ve mas facil el fallo. Si alguno puede decirme como lo pego todo y me hareis un gran favor.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Problema de comunicacion RS232
« Respuesta #1 en: 09 de Julio de 2005, 15:03:00 »
VAmos a ver el problema es en una comunicacion serie RS232 por IR, funciona bien pero si se interrumpe la comunicacion, la cual se produce cada 15 seg, al cabo de mas o menos 1 min salta alarma por medio de una interrupcion y vuelve a esperar el siguiente dato. Aunque el emisor lo manda el receptor despues de la interrupcion no se entera de nada.
En el proteus se ve bien.
De todas formas os pego el codigo de emisor y recpetor. mientras a ver si me decis como pegar el proteus.
Gracias
Emisor
//***************************************************************************
//******
//******
//****** NOTE: usa compilador: PCW v2.619
//******
//******
//******
//****************************************************************************

#include <12C508A.H>


#use delay(clock=1000000,RESTART_WDT)
#fuses XT,NOWDT


// define el puerto serie como 9660. 8 bits sin paridad y
// salida por pin RB4 y entrada de datos por pin RB6
// ojo señal invertida en la salida rs232 para que no se quede el led IR encendido led

#use RS232(BAUD=300, BITS=8, PARITY=N, XMIT=PIN_B1, RCV=PIN_B2, RESTART_WDT)

//#use fast_io(B)



// el emisor usa la entrada RA0 como deteccion de puesta en marcha y paro
// la salida RB4 es la salida de datos al diodo IR

//*********************
// PROGRAMA PRINCIPAL *
//*********************

void delay_seconds(int n)
      {
     for (;n!=0; n--)
     delay_ms( 1000 );
      }




void main()
      {
      set_tris_b(0x01111111);  //
      While(1)
         {

         // el retardo se usa para no estar enviando permanentemente en mensaje y conservar la bateria del emisor

        delay_seconds(15);

         // si esta activa Ra0 envia por el puerto E de Encender
         // si Ra0 esta a cero envia por el puerto A de Apagar

        if(input(PIN_B0))
            putc("E");
        else
            putc("A");
         }
      }


REceptor (que es donde esta el fallo)
//***************************************************************************
//******
//******
//****** NOTA: usa compilador: PCW v2.619 o posterior
//******
//******
//******
//****************************************************************************

#include <16F84A.H>
#use delay(clock=1000000)
#fuses XT,NOWDT,PUT

// define el puerto serie como 300 Baudios 8 bits sin paridad y
// salida por pin RB0 y entrada de datos por pin RB6

#use RS232(BAUD=300, BITS=8, PARITY=N, XMIT=PIN_B1, RCV=PIN_B6)

// la entrada RB6 como entrada de datos del receptor
// la salida  RA1 sera la que active el rele

#use fast_io(B)





byte int_count1;         // Numero de interrupciones antes de que el contador este a cero
int tiempo_seguridad;
int flag_interrp=1;

// Rutina que se activa por la interrupcion
// esta funcion se llama cada vez que el timer rebosa
// se decrementa en 1 int_cont1 y si llega a cero
// se pone a cero la salida del rele
// Se usa para que no se quede activado
// si al cabo del tiempo no le han llegado datos
// automaticamente se apaga y espera
// una nueva orden de encendido



#int_rtcc
   clock_isr()
      {
      if(--int_count1==0)
         {
          int_count1 = tiempo_seguridad;
          output_low(PIN_A1);   // si pasado el tiempo no le han llegado datos desconecta la salida y
          //output_low(PIN_B0);   // apaga el led de encendido hasta que le vuelven a llegar datos
          flag_interrp=0;
          set_rtcc(0);
          }
      }

// ***************************
//    Programa principal
//****************************

void main(){
   set_rtcc(0);
   setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   set_tris_b(0x10);         // PIN_B = Entradas
   set_tris_a(0xff);         // PIN_A = Salidas
   tiempo_seguridad=2000;    // aproximadamente un minuto sin recibir dato y apaga el sistema
   output_high(PIN_B0);      // enciende el led de encendido

   While(1)
        {
        if(flag_interrp==0)
            {
           output_low(PIN_B0);
           delay_ms(100);
           output_high(PIN_B0);
           delay_ms(100);
            }
        if(kbhit())
           switch(getch())
            {
            case "E":
            flag_interrp=1;
            set_rtcc(0);
            int_count1=tiempo_seguridad;
            output_high(PIN_A1);
            output_low(PIN_B0);           // si le llegan datos parpadea el led de encendido durante 1/2 seg
            delay_ms(500);
            output_high(PIN_B0);
            break;
            case "A":
            flag_interrp=1;
            set_rtcc(0);
            int_count1=tiempo_seguridad;
            output_high(PIN_A1);
            output_low(PIN_B0);
            delay_ms(500);
            output_high(PIN_B0);      // si le llegan datos parpadea el led de encendido
            break;
            }
          }
      }



Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Problema de comunicacion RS232
« Respuesta #2 en: 10 de Julio de 2005, 00:09:00 »

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Problema de comunicacion RS232
« Respuesta #3 en: 10 de Julio de 2005, 03:43:00 »
Ya esta en el almacen, se me olvidaba decir que en proteus funciona bien, pero que si lo hago en real funciona menos el tema de volver despues de la interrupcion. No logro entender el porque. Quizas algo del watch dog aunque estan desactivados en ambos pics.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Problema de comunicacion RS232
« Respuesta #4 en: 11 de Julio de 2005, 02:41:00 »
Y esta solucionado, el problema era de hard y no de soft.
Faltaba corriente al diodo IR.
Lo que no consigo entender es porque funcionaba siempre excepto cuando se ejecutaba la interrupcion.
La cuestion es que funciona y si alguien es capaz de aclarame esto le estaria agradecido porque no le encuentro explicacion y llevo dias dando vueltas a ver por que fallaba
De todas formas gracias a todos


 

anything