Autor Tema: Problemas con fast_io(C)?  (Leído 8912 veces)

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

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Problemas con fast_io(C)?
« en: 16 de Mayo de 2008, 12:39:54 »
Saludos!  :-)

Pues sí, fíjense que me ha pasado algo bien interesante...
Siempre acostumbro usar las sentencias #use fast_io(puerto) para hacer el código más eficiente... lo que hago es que al principio del main declaro todos los tris correspondientes con set_tris_X(value).
Siempre lo había hecho así sin problemas, pero esta vez me ha ocurrido que el #use fast_io(C) no funciona.
Verán, estoy usando el puerto C para recibir datos serialmente desde un módulo gps y luego transmitir datos a la pc, para ello tengo por ahora el siguiente circuito:



Usando el siguiente código:

Código: C
  1. /*
  2. /////////////////////////////////
  3. Recibe del gps y envia al pc
  4. /////////////////////////////////
  5. */
  6.  
  7. #include <16f876.h>
  8. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  9. #define led PIN_C5
  10. #define Tx  PIN_C6
  11. #define Rx  PIN_C7
  12. #define Rg  PIN_C0
  13. #define DTR PIN_C1
  14. #use delay (CLOCK=20000000)
  15. #use rs232 (STREAM=GPS,BAUD=4800,RCV=Rg)
  16. #use rs232 (STREAM=PC,BAUD=19200,XMIT=Tx,RCV=Rx)
  17. #use fast_io(A)
  18. #use fast_io(B)
  19. #use fast_io(C)
  20.  
  21. void main(void)
  22. {
  23.    char caracter;
  24.    setup_ccp1(CCP_OFF);
  25.    set_tris_a(0b11111111);
  26.    set_tris_b(0b11111111);
  27.    set_tris_c(0b10000001);
  28.    fputs("=====RECIBIDO DEL GPS=====",PC);
  29.    output_high(led);
  30.    output_high(DTR);
  31.    while(TRUE)
  32.    {
  33.       caracter=fgetc(GPS);
  34.       fputc(caracter,PC);
  35.    }
  36. }

Me compila y todo genial y las comunicaciones seriales por el puerto C las hace estupendas... pero las instrucciones output_high (led) y output_high(DTR) (ambos como verán son pines del portc) no las ejecuta... todos los demás pines del portc quedan en estado bajo.

Pero quitándole el fast_io y colocándole el standard_io y quitándole el set_tris_c, así:

Código: C
  1. /*
  2. /////////////////////////////////
  3. Recibe del gps y envia al pc
  4. /////////////////////////////////
  5. */
  6.  
  7. #include <16f876.h>
  8. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  9. #define led PIN_C5
  10. #define Tx  PIN_C6
  11. #define Rx  PIN_C7
  12. #define Rg  PIN_C0
  13. #define DTR PIN_C1
  14. #use delay (CLOCK=20000000)
  15. #use rs232 (STREAM=GPS,BAUD=4800,RCV=Rg)
  16. #use rs232 (STREAM=PC,BAUD=19200,XMIT=Tx,RCV=Rx)
  17. #use fast_io(A)
  18. #use fast_io(B)
  19. #use standard_io(C)
  20.  
  21. void main(void)
  22. {
  23.    char caracter;
  24.    setup_ccp1(CCP_OFF);
  25.    set_tris_a(0b11111111);
  26.    set_tris_b(0b11111111);
  27.    fputs("=====RECIBIDO DEL GPS=====",PC);
  28.    output_high(led);
  29.    output_high(DTR);
  30.    while(TRUE)
  31.    {
  32.       caracter=fgetc(GPS);
  33.       fputc(caracter,PC);
  34.    }
  35. }

Funciona de maravilla!  :shock:

Qué opinan? Cuál creen que sea el problema? El fast_io(C) mientras uso otros pines del portc como seriales, o qué otra cosa estoy haciendo mal?  :?

Bueno espero sus respuestas.
Hasta entonces, nos leemos!  :mrgreen:

P.D. Me acabo de dar cuenta de que este post no debe ir aquí... creo que debería ir en el subforo de C...
       Disculpen la burrada! :(
       Espero que algún moderador lo mude.
« Última modificación: 16 de Mayo de 2008, 13:07:21 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas con fast_io(C)?
« Respuesta #1 en: 16 de Mayo de 2008, 19:56:32 »
Hola firepic, mira, prueba este código:

Código: C
  1. #include <16f876.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  3. #define led PIN_C5
  4. #define Tx  PIN_C6
  5. #define Rx  PIN_C7
  6. #define Rg  PIN_C0
  7. #define DTR PIN_C1
  8. #use delay (CLOCK=20000000)
  9. #use fast_io(A)
  10. #use fast_io(B)
  11. #use fast_io(C)
  12. #use rs232 (STREAM=PC,BAUD=19200,XMIT=Tx,RCV=Rx)
  13. #use rs232 (STREAM=GPS,BAUD=4800,RCV=Rg)
  14.  
  15. void main(void)
  16. {
  17.    char caracter;
  18.    setup_ccp1(CCP_OFF);
  19.    set_tris_a(0b11111110);
  20.    set_tris_b(0b11111111);
  21.    set_tris_c(0b10000001);
  22.    fputs("=====RECIBIDO DEL GPS=====",PC);
  23.    output_high(led);
  24.    output_high(DTR);
  25.    while(TRUE)
  26.    {
  27.       caracter=fgetc(GPS);  
  28.       fputc(caracter,PC);
  29.    }
  30. }

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 :D :D :D). Esperamos tus resultados.

Nos estamos escribiendo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con fast_io(C)?
« Respuesta #2 en: 16 de Mayo de 2008, 20:13:55 »
Saludos Dr. Gonzalo!

Digo yo, como hace usted para tener tanto conocimiento en el cerebro?  :shock:
Será verdad que eres completamente humano, o tienes una parte androide que se va autoactualizando con las nuevas tecnologías?  :D

Pues sí, acomodé lo que me mencionaste y santo remedio! Funcionó de maravilla...  :-/
Caramba! Fíjate, yo pensaba que bastaba con colocar los fast_io y ya... pero no sabía el detalle que hay que colocarlos de primero para que el compilador lo entienda bien... gracias por la explicación man!

Ok nos leemos!  :mrgreen:

PD: No creas que te estoy adulando, pero te diré que cuando sea grande quiero ser como tú  :D
PD2: También quisiera ser como manolo, como ariel, pocher... todos ustedes son unos genios, los felicito!  :P
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado georgeliners

  • PIC10
  • *
  • Mensajes: 31
Re: Problemas con fast_io(C)?
« Respuesta #3 en: 07 de Mayo de 2014, 14:25:04 »
Hola amigos, Bueno soy nuevo en el foro y para no crear una nueva pregunta con mas de lo mismo me uno a este hilo ya que tengo una duda similar a la que pregunta el amigo.
Mi duda es que cuando utilizo el wizard del CCS Compiler por ejemplo para el uso del rs232 de un pic x, este wizard me genera un archivo proyecto.h en el que se incluye la directiva "#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)" por ejemplo. y dentro del archivo proyecto.c aparece la directiva #include "C:\Documents and Settings\jojo\Mis documentos\contador_3.h". y luego coloco bajo esa linea el correspondientes #use fast_io(A). La pregunta ¿me conviene configurar luego manualmente el archivo proyecto.h para colocar ahi la directiva #use fast_io(A)  antes de #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8).O no es necesario ya que el compilador se encarga de eso?
Bueno la otra duda ¿exite alguna manera de que el wizard no me genera el archivo .h y que coloque todas las directivas sobre el archivo .c de una para no lidiar con tanto archivo?
De antemano gracias y disculpen lo enredado que soy para explicar cosas.  :oops: Saludos
 

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas con fast_io(C)?
« Respuesta #4 en: 07 de Mayo de 2014, 14:39:30 »
Hola georgeliners, bienvenido al foro

en cuanto a tu pregunta, el wizard siempre te genera el .h, sin embargo, si quieres puedes cortar el contenido del .h y lo pegas en el .c, y quitas el include de ese archivo y listo, ya tienes todo un un solo archivo.

"Nada es imposible, no si puedes imaginarlo"

Desconectado georgeliners

  • PIC10
  • *
  • Mensajes: 31
Re: Problemas con fast_io(C)?
« Respuesta #5 en: 08 de Mayo de 2014, 01:17:13 »
Ok, muchas gracias  :). Saludos