Hola firepic, mira, prueba este código:
#include <16f876.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#define led PIN_C5
#define Tx PIN_C6
#define Rx PIN_C7
#define Rg PIN_C0
#define DTR PIN_C1
#use delay (CLOCK=20000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use rs232 (STREAM=PC,BAUD=19200,XMIT=Tx,RCV=Rx)
#use rs232 (STREAM=GPS,BAUD=4800,RCV=Rg)
void main(void)
{
char caracter;
setup_ccp1(CCP_OFF);
set_tris_a(0b11111110);
set_tris_b(0b11111111);
set_tris_c(0b10000001);
fputs("=====RECIBIDO DEL GPS=====",PC
); output_high(led);
output_high(DTR);
while(TRUE)
{
}
}
El problema es que estas declarando los #use rs232 antes de los #use fast_io, y como la configuración predeterminada es el standard_io, los #use RS232 y sobre todo el del GPS, cambia los pines del puerto que utiliza como se le da la gana, según he visto en el .asm, pone todo el puerto C en flotante.
Ahora bien, me diras, pues que problema hay si total luego aplico los set_tris configurando todo como debe estar y además estoy poniendo las salidas DTR y led en alto luego de haber configurado las transimisiónes??!?!
.
En realidad CCS no llama a la configuración #use rs232 para el GPS hasta que no la necesita, pues tienes dos transmisiones UART y por lo tanto no va a deshabilitar la que va hacia la PC hasta que realmente debas utilizar la otra (Con deshabilitar no me refiero a inhabilitar el HW, sino a que las funciones fgetc, printf, fputc y kbhit solo pueden referirse a la ultima #use rs232 declarada). En resumen, el #use rs232 para el GPS se ejecuta justo antes del fgetc. Por lo tanto al ejecutar fgetc dentro del bucle esta te deshabilita las salidas despues de que las hallas puesto en alto, por lo que tu solo verás que las salidas DTR y LED no se activan.
La solución a esto es declarar el #use rs232 para el GPS (o mejor ambos rs232) despues de los #use fast_io, por lo tanto CCS compila los #use RS232 con las restricciones correspondientes, evitando que estos cambien los registros tris. Esto confirma la regla de que los preprocesadores llevan un orden y no pueden colocarse al azar.
La configuración fast_io de los puertos es realmente la mas eficiente y la más rapida, pero a veces trae estos dolores de cabeza, hay que saber bien como se ejecuta el programa y en muchos casos revisar el .asm, aumentar la velocidad de procesamiento de un programa a veces disminuye la velocidad con la que podemos programar el mismo (el principio de conservacion de la energia
). Esperamos tus resultados.
Nos estamos escribiendo.