Ruido en el canal TTL

#1
Bueno, ante todo un saludo. Mi duda es si hay alguna forma de eliminar el ruido producido en un TTL.

Tengo el GPS MT3339 y el detalle es que traté de conectarlo al RX del PIC18F2550 pero en un principio no pasaba nada, luego me di cuenta de que el GPS trabajaba como máximo con 2.8, por lo que tuve que tratar de amplificar el voltaje, para lo cual utilicé el 74HC08N y bueno, me funcionó pero a medias.

Esto es lo que en sí, debería obtener:
Código:
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,000103.799,,,,,0,0,,,M,,M,,*4D
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,000103.799,V,,,,,0.00,0.00,060180,,,N*47
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

$GPGGA,000104.799,,,,,0,0,,,M,,M,,*4A
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,000104.799,V,,,,,0.00,0.00,060180,,,N*40
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
Ahora cuando lo proceso con el PIC, usando el 74HC08N:

Código:
contenido de buffer: $GPGGA,000107.799,,,,,0,0,,,M,,M,,*49
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,000107.799,V,,,,,0.00,0.00,060180,,,N*43
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
~X@VI–iF3Ô€¡￾â

contenido de buffer: $GPGGA,000107.799,,,,,0,0,,,M,,M,,*49
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,000107.799,V,,,,,0.00,0.00,060180,,,N*43
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
~X@VI–iF3Ô€¡￾â
El código está hecho en C de CCS
PHP:
#include <18f2550.h>

#fuses hs,cpudiv1,nomclr
#use delay(clock=20000000)

#use rs232(baud=9600, parity=N, bits=8, xmit=PIN_C6, rcv=PIN_C7, stream=conexiongps)
#use rs232(baud=9600, parity=N, bits=8, xmit=PIN_A0, rcv=PIN_A1, stream=debug_gps)


char buffergps[400]="esto es una prueba                                                           \0";
int posicionbuffergps=0;

#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{     
   buffergps[posicionbuffergps] = fgetc(conexiongps);
   posicionbuffergps++;
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   //setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   

   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);
   output_high(PIN_B7);
   fprintf(debug_gps,"contenido de buffer:");
  
   // TODO: USER CODE!!
   while(1)
   {  
      if(posicionbuffergps>0)
      {
         buffergps[posicionbuffergps]='\0';
         fprintf(debug_gps,"contenido de buffer: %s\r\n",bufferGPS);             
         posicionbuffergps=0;
      }
   }

}
 
Última edición por un moderador:
#2
Prueba realizando lo siguiente:

Cambia la palabra de configuración por ésta:
#fuses NOFCMEN,NOVREGEN,NOMCLR
#use delay(crystal = 20MHz)

Elimina las configuraciones de los módulos que no se vayan a usar.
O sea, todo ésto:
Código:
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   //setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
Para las conexiones del GPS es conveniente que uses el módulo USART y el debug sí lo hagas por software.
Entonces, configuras de esta manera:
Código:
[COLOR=Red]#use[/COLOR] rs232(UART1, stream = conexiongps)
[COLOR=Red]#use[/COLOR] rs232(xmit = PIN_A0, rcv = PIN_A1, stream = debug_gps)
De esta manera se asume que se usará el módulo EUSART a 9600 Bps (Por defecto) para el GPS
y que se usará RS-232 (También a 9600 Bps) por software para el debug del GPS.

También te recomiendo que en lugar de usar el 74HC08, uses un adaptador de niveles.
Mira este post: Conexion de varios dispositivos I2C que trabajan con diferente Vdd
Ese adaptador fue pensado para usarse con dispositivos I2C, pero funciona para adaptar cualquier tipo de señal digital y a otros niveles de tensión.
 
#4
Usá una compuerta con entrada de 3,3v (o menos) y que tenga salida colector abierto, eso te va a permitir hacer el cambio de nivel sin problemas.

Otra alternativa, si no tenés muchos de esos puertos que requieren un cambio de nivel, usá un simple transistor como llave usando una fuente acorde al nivel de salida que se necesita.
 
Arriba