Instrucción if no funciona en 18f4685

Buenas tardes, amigos del foro.
Necesito de su ayuda, ya que me encuentro bloqueado debido a que mi código no funciona.

El problema que tengo es que no entra al if que está dentro del bucle y que ponga en alto el pin RA0 por 3 segundos y apague.

Agradezco a quien pueda ayudarme con este tema.

Éste es el código:
PHP:
#include <18F4685.h>

#fuses NOWDT,HS
#use delay(clock=8000000)
#use rs232(UART1, stream=PC)

#use standard_io(A)
#use standard_io(D)

#include <stdio.h>
#include <stdlib.h>
#include <input.c>
#include <string.h>

#byte port_a=5
#byte port_b=6
#byte port_d=8
#byte port_e=9

int16 c;

void main() 
{
set_tris_a(0x00);
set_tris_b(0xFF);


port_a=0x00;
port_d=0x00;


while(true) 
{
if(port_d==0x01) // Aquí está la instrucción que no toma, no sé por qué.
{
output_high(pin_A0);
delay_ms(3000);
output_low(pin_A0);
}
}
}
Necesito que me funcione con esta forma para utilizar las 128 combinaciones.
Con por ejemplo: 0x00,0x01,0x02,0x03... y así sucesivamente hasta agotar con todas mis alternativas.
 
Última edición por un moderador:
Nunca va a funcionar así. ¿Leíste la hoja de datos del PIC18F4685? Estoy seguro que no.
El puerto D se encuentra en la dirección 0xF83 y no en la dirección 8.

Puerto A = 0xF80
Puerto B = 0xF81
Puerto C = 0xF82
Puerto D = 0xF83
Puerto E = 0xF84

Y tampoco es necesario que declares los puertos, el compilador tiene instrucciones que puedes usar.

Por ejemplo:
PHP:
int8 puerto_d;

   while(true) 
   {
      puerto_d = input_d();
   
      if(puerto_d ==1)
      {
         output_high(pin_a0);
         delay_ms(3000);
         output_low(pin_a0);
      }
   }
Otros detalles a tener en cuenta:
Los puertos por defecto están configurados como entradas, así que el SET_TRIS_B(0xFF); está de sobra.
Si no vas a usar esas librerías, no tiene caso que las incluyas y tampoco el uso del UART.
Tal vez los pienses utilizar posteriormente, pero lo que no uses, no lo incluyas.

Suerte.
 
Buenas tardes amigo D@rkbytes agradezco su gran aporte. me ayudaste a solucionar el inconveniente ya que efectivamente yo no habia leido la hoja de datos del pic18f4685.

me deje llevar por la misma configuracion del pic16f877a.

(y):apreton::aplauso::aplauso:
 
Buen dia amigo D@rkbytes tengo el siguiente inconveniente, envio desde mi pc un dato como este "100+chr 13" al pic 18f4685 por rs232 pero no entra al if donde le pregunto if(c==100) prenda mi led. el programa que utilizo es visual basic 2010

yo he realizado este mismo proceso en el pic 16f877A y funciona de maravilla con este mismo codigo solo cambio #include<16f877A>.

Este es mi codigo.
Código:
#include <18F4685.h>
#fuses NOWDT,HS,NOLVP,NOPROTECT
#use     delay(crystal = 8MHz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


#use standard_io(A)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)

#include <stdio.h>
#include <stdlib.h>
#include <input.c>
#include <string.h>

#byte puerto_a=0xF80
#byte puerto_d=0xF83
#byte puerto_e=0XF84

char dato[16];
int16 c;

#INT_RDA 
void RDA_isr(void) 
{
gets(dato);
c=atoi(dato);//convierte el dato
delay_ms(10);//espera

   if(c==100)
           {
           OUTPUT_HIGH(PIN_C0);
           delay_ms(2000);
           OUTPUT_LOW(PIN_C0);
           }
   if(c==200)
           {
           OUTPUT_HIGH(PIN_C1);
           delay_ms(2000);
           OUTPUT_LOW(PIN_C1); 
           }
}
void main() 
{
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
    while(true)
   {
   }
}

No entiendo el motivo estuve leyendo la hoja de datos pero no encuentro el detalle que necesito para que me funcione,entiendame que estoy novato en este pic.
agradezco su colaboración.
 
Última edición:
Ese programa está algo mal.

Mira lo fácil que lo puedes simplificar y hacerlo funcional.
PHP:
#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.
      }
   }
}
 
buenas noches amigo D@rkbytes, estuve probando el programa que subiste pero no me funciono, lo estoy simulando con proteus pero no funciona. es como si el gets no funcionara en este pic. agradezco su ayuda.

adjunto el circuito proteus:
 

Adjuntos

  • proteus.zip
    15.7 KB · Visitas: 7
Si funciona, pero olvidaste conectar el pin de reset (1) hacia VDD por medio de una resistencia.
Puede ser una resistencia de 4.7 KΩ o 10KΩ

También se puede conectar directamente hacia VDD si no piensas usar ese pin como reset.
Pero el pin RE3 (MCLR) también se puede deshabilitar para usarlo como entrada digital.
 
Buenos dias amigo D@rkbytes,
Sigo en la tarea de hacer funcionar el codigo pero la verdad nada que me funciona, puse el pin E3 a VDD como lo indico pero no tuvo cambios. no se cual sera el problema.

Adjunto video en formato avi donde tengo mi formulario en visual y le escribo en el textbox el numero 100 + el chr 13 para que el gets me funcione. y estoy utilizando el codigo que subio.

ante todo muchas gracias por su respuesta espero me pueda ayudar.(y)
 

Adjuntos

  • videosimulacion.zip
    2.4 MB · Visitas: 9
No pude ver el vídeo porque debe estar creado con un CODEC desconocido y eso que tengo instalado el K-Lite CODEC Pack.

Se me ocurre que debe ser el programa de Visual Basic que estás usando.

Yo estoy usando esta interfaz: Serial PORT Control RC1
Y con esa funciona muy bien, pero está escrita en Visual Basic 6.0 Captura SPCTRL 18F4685.jpg

Usé el COM2 en la simulación y obvio, su pareja el COM3 en la interfaz: Puerto COM3 SPCTRL.jpg

Yo veo que tú usas el COM31 en simulación y según recuerdo, Windows no soporta tantos puertos.
 
gracias D@rkbytes,
estoy utilizando un programa que se llama virtual serial port y este me crea puertos virtuales en este caso com31 y com32 uno para proteus y el otro para visual 2010.
Lo raro es que me estaba funcionando con el pic 16f877A y me pase a este otro pic18f4685 por sus excelentes características pero este pic me ha dado duro y no me funciona con el mismo programa de visual 2010.
voy adjuntar algunas imagenes del visual.

con visual basic 2010 puedo abrir el programa que tu tienes en vb 6.0. para hacer la prueba.

necesito porfa lograr hacer funcionar este sistema.



adjunto mi codigo de vb2010 y como se ve mi formulario es algo muy sencillo que hice para poder enviar mis datos.(y)
 

Adjuntos

  • en visual mi codigo.zip
    120 KB · Visitas: 7
Última edición:
Hola colombia90

No será que tienes mal conectado el COMPIM Con respecto al PIC?

Así se ve en el archivo que adjuntaste en tu mensaje #6.

saludos
a sus ordenes
 

Adjuntos

  • simulacion proteus.PDF
    456.6 KB · Visitas: 7
Buenas noches, amigo MrCarlos. Gracias por su aporte.
Yo ya realicé ambas conexiones de las dos formas, pero no tuve cambios.
Persiste el problema y con la conexión que subí me funcionó en el PIC16f877A, sólo que éste PIC16F877A no me sirve porque no tiene suficiente EEPROM, en cambio el PIC18F4685 es muy excelente PIC por sus características.
 
Última edición por un moderador:
El pin Tx del PIC se conecta al pin Tx del COMPIM y el pin Rx se conecta al pin Rx del COMPIM.
Cuando se usa el Virtual Terminal de Proteus, entonces si se conectan inversamente.
Tx del PIC con Rx del Virtual Terminal y Rx del PIC con Tx del Virtual Terminal.

Adjunto el proyecto que tengo funcionando con el código que expuse, pero con simulación en versión 7.10
No adjunto la simulación en versión 8 porque tengo una versión superior y no la podrás abrir.
Para abrir el diseño 7.10 con extensión .DSN, se debe seleccionar "Design Files" en Proteus 8: Proteus 8 Design Files.jpg
 

Adjuntos

  • 18F4685 Rx.rar
    59.2 KB · Visitas: 14
Buenas tardes amigo D@rkbytes adjunto todo lo de visual basic es visual basic 2010.
Como anteriormente lo dije este mismo formulario y codigo de visual basic 2010 me funciono con el pic16f877A, el pic 18f4685 me ha tomado mucho problema para resolverlo.

De antemano muchas gracias por su tiempo y ayudar a solucionar este tema mil gracias.(y)
 

Adjuntos

  • visual envia y recibe cadena.zip
    4.3 KB · Visitas: 4
De todos modos venía incompleto el proyecto pero lo armé con los dos que subiste.

Ya lo ejecuté y parece ser que es por las siguientes causas:
Tal vez no estás usando puertos pares.
Debes fijarte en Virtual Serial Port Driver, qué puertos son los pares.

Por ejemplo:
COM2 > COM3
COM4 > COM5
COM6 > COM7
Etc.
Puertos pares. (Enlazados con líneas azules):
Puertos pares.jpg

Proteus tampoco soporta más del COM4. (Al menos en los que tengo. v7.10 y v8.3)

Y como te mencioné anteriormente, Windows tampoco soporta muchos puertos virtuales.
Yo uso XP y me muestra este error: Port Error.jpg
Nota: Aún teniendo instalados hasta el COM33

Con Visual Basic 10 me sucede lo mismo, no me permite usar COM32: Invalid Property Value.jpg

Poniendo el puerto COM2 en la simulación y COM3 en el programa de Visual Basic, si funciona. Prueba con COM2 y COM3.jpg

Intenta cómo te indico y debe funcionar.
También te recomiendo que realices tus pruebas con puertos inferiores al COM15.
 
Última edición:
Atrás
Arriba