Autor Tema: Adaptador de velocidades de puerto serie  (Leído 1587 veces)

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

Desconectado QuePollo

  • PIC10
  • *
  • Mensajes: 2
Adaptador de velocidades de puerto serie
« en: 02 de Septiembre de 2010, 13:06:50 »
Estimados,

Me registre hace 3 años pero esta vez es la primera vez que publico algo, ja.

Estoy en un proyecto que deberia ser super sencillo y sin embargo no esta andando como corresponde.

Tengo 2 equipos, un transmisor y un receptor, que el transmisor cada 12 segundos envia 2 bytes. Esos aparatos estan configurados para andar a 300bauds. Sin embargo, necesito crear un adaptador para llevarlos a 1200bauds para poder transmitirlos por un sistema inalambrico, a un aparato igual pero que los convierta a 300bps de vuelta para que le lleguen al receptor. Hice este codigo en CCS, con el circuito mas sencillo del mundo (saco 5v de un lado y conecto el pin de RX del micro a la salida del transmisor, y lo mismo para el otro lado)

Sin embargo, nunca me envia nada este aparato, alguno tiene idea? Yo veo que los datos entran, y si pongo en un while(true) un putc('c'), salen cosas correctas por ahi.

Dejo el codigo en su totalidad.
Código: [Seleccionar]
#include <16F88.h>
#device adc=8

#FUSES NOWDT                    // Watch Dog Timer
#FUSES XT                      
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                     //Master Clear pin enabled
#FUSES NOCPD                    //No EE protection
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOLVP
#FUSES NOWRT
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled

#use delay(clock=3686000)


#define LARGOBUFFER 10
#define VEL_ENTRADA 300
#define VEL_SALIDA 1200
#define TIEMPO 50 //200hz = 1/200 segundos, cuento 0,25 segundos
#define MODULE_SETTINGS PIN_A2

#use rs232(baud=VEL_ENTRADA,parity=N,UART1,bits=8,ERRORS)

int1 cuentaVueltas;
int1 enviaTodo;
int16 tiempoCuentaVueltas;

int8 buffer[LARGOBUFFER];
int8 bufferLen;

#int_Rda
void rda_isr()
{
   output_high(PIN_A1);     //para  ver cuando entra a la int, en el osciloscopio
   if(bufferLen<LARGOBUFFER)
   {
      buffer[bufferLen++]=getc();
      tiempoCuentaVueltas=0;
      cuentaVueltas=TRUE;
   }
   output_low(PIN_A1); //para  ver cuando sale de la int, en el osciloscopio
}

#int_timer2
void timer2_isr()
{
   if(cuentaVueltas)
   {
      if(++tiempoCuentaVueltas>=TIEMPO)
      {
         enviaTodo=TRUE;
         cuentaVueltas=FALSE;
         tiempoCuentaVueltas=0;
      }      
   }
}

#inline
void clearVars()
{
   cuentaVueltas=FALSE;
   enviaTodo=FALSE;
   tiempoCuentaVueltas=0;
   memset(buffer,0,sizeof(buffer));
   bufferLen=0;
}

void main()
{
   int8 i;  
   setup_timer_2(T2_DIV_BY_16,178,16); //interrupt de 200hz, cada 0,005 seg
   set_uart_speed(VEL_ENTRADA);
   output_high(MODULE_SETTINGS); //el pin de config del modulo para que no se configure
   clearVars();
   //setup_wdt(WDT_144MS);
  
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      //restart_wdt();
      if(enviaTodo)
      {
         disable_interrupts(GLOBAL);
         set_uart_speed(VEL_SALIDA);
         //delay_ms(50);
         for(i=0;i<bufferLen;i++)
         {
            putc(buffer[i]);
         }
         set_uart_speed(VEL_ENTRADA);
         //delay_ms(50);
         enviaTodo=FALSE;
         bufferLen=0;
         //memset(buffer,0,sizeof(buffer));
         enable_interrupts(GLOBAL);
      }
   }
  
}

Gracias!

EDIT: Acabo de ver en el osciloscopio, que el pin A1, el que uso como trace de entrada y salida de RDA, esta toggleando constantemente. O sea, 10uS de high y 70uS de low constantemente, mientras que por el pin B5 no esta saliendo nada. Curioso.
« Última modificación: 02 de Septiembre de 2010, 13:16:17 por QuePollo »

Desconectado QuePollo

  • PIC10
  • *
  • Mensajes: 2
Re: Adaptador de velocidades de puerto serie
« Respuesta #1 en: 02 de Septiembre de 2010, 13:35:13 »
Solucionado. No fue uno de mis momentos mas brillantes al hacer ese codigo. Este anda bien.
Código: [Seleccionar]
#include <16F88.h>
#device adc=8

#FUSES WDT                    // Watch Dog Timer
#FUSES XT                       
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                     //Master Clear pin enabled
#FUSES NOCPD                    //No EE protection
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOLVP
#FUSES NOWRT
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled

#use delay(clock=3686000)


#define VEL_ENTRADA 300
#define VEL_SALIDA 1200

#define MODULE_SETTINGS PIN_A2

#use rs232(baud=VEL_ENTRADA,parity=N,rcv=PIN_B2,bits=8,ERRORS,STREAM=streamin)
#use rs232(baud=VEL_SALIDA,parity=N,xmit=PIN_B5,bits=8,ERRORS,STREAM=streamout)

void main()
{

   int8 q;
   
   output_high(MODULE_SETTINGS); //el pin de config del modulo para que no se configure   
   setup_wdt(WDT_144MS);   
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      restart_wdt();
      if(kbhit(streamin))
      {
         q=getc(streamin);
         putc(q,streamout);
      }
   }
}

Me siento humillado por mi propio codigo, que desastre.

Desconectado Rogil

  • PIC10
  • *
  • Mensajes: 41
Re: Adaptador de velocidades de puerto serie
« Respuesta #2 en: 07 de Diciembre de 2011, 18:56:01 »
Que tal QuePollo?
Te escribo para hacerte una pregunta, resulta que soy un novato con la programación en C para pics, y requiero un ejemplo sencillo para saber como utilizar el EUART o la UART mejorada de la familia 18 que tiene autodetección de bauidios, si sabes de alguno, por favor me comentas, hace rato estoy buscando y haciendo programitas de ensayo pero no me rinde el trabajo, pues como te digo soy un neofito en este lenguaje.

Muchas gracias y mucha suerte