Instrucción if no funciona en 18f4685

#21
Buen día Amigo D@rkbytes muchas gracias por tus respuestas y explicaciones bien guiadas.

El día de hoy sigo en el intento de no rendirme para poder hacer funcionar este sistema.

Siguiendo sus indicaciones al pie de la letra no logre hacer funcionar mi sistema.:confused:

utilice la pareja creada por el software virtual serial port 6.9.
com2 y com3 no logre que funcionara. los invertí en mis programas y tampoco.
cree otra pareja de puertos virtuales
com1 y com4 y tampoco logre que funcionara. los inverti y tampoco logre nada.

utilice el mismo código que adjuntaste días atrás.
utilice el circuito de proteus que adjuntaste dias atras.
utilice mi formulario de visual basic 2010 el mismo que adjunte.

y no logre el funcionamiento.
por lo que vi en las imágenes a usted le corre perfectamente y su funcionamiento es normal.(y)

no entiendo la razón del no funcionamiento en mi pc.

pero mi pc no es porque esta misma función gets a funcionado en esta pc con puertos virtuales y con el pic 16f877A.

no se si el pic18f4685 tiene algun truco para que sirva esta funcion gets en proteus o ccs.
adjunto imagenes y link de video en youtube.
https://www.youtube.com/watch?v=5ywifkjv02g&feature=youtu.be
Mil gracias por su colaboración y espero no incomodar con este tema
 

Adjuntos

#22
Pues qué cosas. Si es muy extraño que no lo logres hacer funcionar, acá no tengo ningún problema.

Te adjunto las simulaciones que tengo funcionando, junto con un programa sencillo de VB 10.
Ya están configurados para funcionar. Simulaciones en COM2 y programa de VB en COM3 a 9600 Bps.

Escribes y envías 100 y debe encender LED1 y al enviar 200 debe encender el LED2.
Si no te funcionan entonces puede ser tu simulador y debes reinstalarlo o actualizarlo.
 

Adjuntos

#24
Buen día amigo D@rkbytes.
Que bien funcionó, que alegría, pero los archivos que adjuntaste son los .cof y .hex estos no los pude abrir con mi compilador CCS para ver el código fuente, entonces yo le adjunté el .hex y el .cof de la vez anterior que subió y no me funcionó.
No entiendo por qué si es el mismo programa.

¿Por favor puedes subir el código fuente? Ya sería el último favor para cerrar este tema que fue de mucho aprendizaje.

Que bueno que ya me funcionó, gracias a usted, amigo.



Otra cosa que se me olvidaba decirle. Compilé mi formulario de Visual Basic 10 y también funcionó con el
circuito y el .hex que subió. :) :) Eres un excelente programador.
Este es mi correo: políticas@delforo.com

Estuve modificando el código pero no tuve éxito agregando algunos fuses y no logré ningún cambio.
Espero resolverlo esta noche ya que se me esta acabando el tiempo.

Sólo tengo una pregunta. ¿El código fuente es el que adjunto la vez pasada?
Porque es sobre éste que estoy trabajando pero estoy utilizando LEDs para ver donde se queda el programa y es en la función gets, no hace el proceso de dato=atoi(datovisual) no sé qué pasa.
 
Última edición por un moderador:
#25
Sólo tengo una pregunta. ¿El código fuente es el que adjunto la vez pasada?
Los archivos .cof y .hex que adjunté, son del programa del post #5 (Sin ninguna modificación)
en la función gets, no hace el proceso de dato=atoi(datovisual) no sé qué pasa.
La instrucción gets(string) únicamente retorna hasta que encuentra el valor 13 en la cadena.
Si ya estás en el proceso; dato = atoi(datovisual); quiere decir que ya se ha salido de la interrupción y aparte se a puesto en 1 la bandera "flag_rx"
Eso es, si haz seguido bien la estructura del programa que expuse.

Ya no supe si lograste que funcionara, o no.
En tus primeros comentarios mencionas que sí lo lograste y en los siguientes mencionas que no. :confused:
 
Última edición:
#26
si funciono pero lo ultimo que adjunto, pero en este no venia adjunto el código fuente y yo tengo el código fuente del post #5 que lo descargue pero no me funciona con este código, por eso digo que no funciona, pense que usted habia modificado el codigo porque el .cof es mas grande de tamaño que el .cof del post #5.

puedes ayudarme con subir por ultima vez el codigo fuente del ultimo archivo adjunto que funciono perfectamente.
 
#27
Como mencioné, los archivos que adjunté fueron resultado de la compilación del programa del post #5
La variación de tamaños se puede deber a la versión de tu compilador, ya que lo pueden generar con diferente optimización.

Volverlo a publicar sería copiar y pegar el mismo código. :rolleyes:
 
#28
Buen dia amigo D@rbytes

estuve compilando de nuevo el codigo del Post #5 para extraer los archivos .hex y .cof y se los cargue al circuito de proteus y no funciono. no entiendo el motivo. :confused:



D@rkbytes

adjunto imagenes con las simulaciones con los archivos .cof que me sirvio y el archivo .cof que no sirvio. para que me ayude con este tema porfa.

codigo que yo estoy compilando:

Código:
#include <18f4685.h>
#fuses   NOFCMEN, NOPBADEN,HS
#use     delay(crystal = 8MHz)

#include <stdlib.h>

#use rs232(UART1)                  // Configuración USART por defecto: (9600, N, 8, 1)

char cadena[4];
int1 flag_rx = 0;

#INT_RDA
void rs232_rx (void)
{
   gets(cadena);                       // Recibir la cadena. (Se espera "\r" al final. (ASCII 13))
   flag_rx = 1;                        // Indicar que se recibieron los datos. (Activar "flag_rx")
}


void main (void)
{
   int8 dato;
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   output_low(pin_c0);
   output_low(pin_c1);
   
   while (true)
   {
     if(flag_rx)
      {
        disable_interrupts(INT_RDA);  // Desactivar interrupción RDA para evitar reingresos.
         dato = atof(cadena);          // Convertir la cadena a entero.
         
         switch (dato)                 // Selección de datos.
         {
            case 100:                  // Caso 100
               output_high(pin_c0);
               delay_ms(2000);
               output_low(pin_c0);
               break;
            case 002:                  // Caso 200
               output_high(pin_c1);
               delay_ms(2000);
               output_low(pin_c1);
         }
         flag_rx = 0;                  // Indicar que se cumplió la rutina. (Limpiar "flag_rx")
         enable_interrupts(INT_RDA);   // Activar nuevamente la interrupción.
      }
   }
}
 

Adjuntos

Última edición:
#29
Es el mismo código pero yo usé atoi(string); y no atof(string);
atof(string); es para pasar el resultado a una variable tipo float y en este caso se requiere un valor entero.

Y usé 200 en vez de 002 en el programa del post #5 porque esos valores requerías en tu programa.
 
#30
hola amigo D@rkbites
si el codigo que subí lo modifique para pruebas que estaba haciendo pero realmente utilice el código del post #5 diractamente lo copie del post #5 y lo compile y no me funciono.

por eso te adjunte imágenes de la falla que presentaba. en que me puedes ayudar. porfa

este es el codigo que utilice:

Código:
#include <18f4685.h>
#fuses   NOFCMEN, NOPBADEN
#use     delay(crystal = 8MHz)

#include <stdlib.h>

#use rs232(UART1)                  // Configuración USART por defecto: (9600, N, 8, 1)

char cadena[4];
int1 flag_rx = 0;

#INT_RDA
void rs232_rx (void)
{
   gets(cadena);                       // Recibir la cadena. (Se espera "\r" al final. (ASCII 13))
   flag_rx = 1;                        // Indicar que se recibieron los datos. (Activar "flag_rx")
}


void main (void)
{
   int8 dato;
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   output_low(pin_c0);
   output_low(pin_c1);
   
   while (true)
   {
     if(flag_rx)
      {
        disable_interrupts(INT_RDA);  // Desactivar interrupción RDA para evitar reingresos.
         dato = atoi(cadena);          // Convertir la cadena a entero.
         
         switch (dato)                 // Selección de datos.
         {
            case 100:                  // Caso 100
               output_high(pin_c0);
               delay_ms(2000);
               output_low(pin_c0);
               break;
            case 200:                  // Caso 200
               output_high(pin_c1);
               delay_ms(2000);
               output_low(pin_c1);
         }
         flag_rx = 0;                  // Indicar que se cumplió la rutina. (Limpiar "flag_rx")
         enable_interrupts(INT_RDA);   // Activar nuevamente la interrupción.
      }
   }


esta es la imagen de cuando yo le envió un 200:
 

Adjuntos

Última edición:
#31
Pues ese es el código que funciona, pero te mencioné que si no lograbas hacerlo funcionar, deberías reinstalar o actualizar el compilador y usar puertos inferiores al COM15.
 
#32
Listo, amigo. Volveré a reinstalar mi compilador por una versión más reciente, a ver.(y)
Y los puertos, si ya estoy utilizando el COM2 y COM3 como lo has indicado anteriormente.



Disculpe. ¿Qué versión de CCS tienes, para ver si puedo encontrar la misma y poder compilar el archivo?

Hola, amigo D@rkbytes.

Que bien amigo, me funcionó, que alegría, que descanso.
No sé cómo expresar esta felicidad que funcionó.
Gracias, amigo D@rkbytes, le agradezco su paciencia y ayudarme a resolver este tema.

Era la versión del compilador, instalé el CSS v4.114 y funcionó perfectamente.
:D:D:D:D:D:D :aplauso::aplauso::aplauso::aplauso::aplauso:

Que raro eso lo del compilador, nunca pensé que fuera eso. Gracias por decírmelo.
 
Última edición por un moderador:
#33
Pues así es. Ya cuando el programa no le funciona a una persona, siempre recomiendo actualizar el compilador.
Disculpe. ¿Qué versión de CCS tienes, para ver si puedo encontrar la misma y poder compilar el archivo?
Actualmente tengo registrada la versión 5.048.

Me da gusto que ya te haya funcionado y suerte con tus proyectos.
 
Arriba