Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

22/10/2015 #1


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:
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.
22/10/2015 #2
Moderador

Avatar de D@rkbytes

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:
Código 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.
23/10/2015 #3


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.

24/10/2015 #4


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.
24/10/2015 #5
Moderador

Avatar de D@rkbytes

Ese programa está algo mal.

Mira lo fácil que lo puedes simplificar y hacerlo funcional.
Código 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.
      
}
   }

25/10/2015 #6


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:
Archivos Adjuntos
Tipo de Archivo: zip proteus.zip (15,7 KB (Kilobytes), 5 visitas)
25/10/2015 #7
Moderador

Avatar de D@rkbytes

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.
26/10/2015 #8


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.
Archivos Adjuntos
Tipo de Archivo: zip videosimulacion.zip (2,42 MB (Megabytes), 7 visitas)
26/10/2015 #9
Moderador

Avatar de D@rkbytes

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.
26/10/2015 #10


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.

---------- Actualizado después de 10 minutos ----------

adjunto mi codigo de vb2010 y como se ve mi formulario es algo muy sencillo que hice para poder enviar mis datos.
Archivos Adjuntos
Tipo de Archivo: zip en visual mi codigo.zip (120,0 KB (Kilobytes), 6 visitas)
26/10/2015 #11
Moderador

Avatar de D@rkbytes

Prueba enviando primero el texto y luego el Chr(13)

Por ejemplo:
SerialPort1.Write(TextBox1.Text)
SerialPort1.Write(Chr(13))
26/10/2015 #12


acabo de hacer lo que me indico, pero tampoco. no hubo ningun cambio



amigo Darkbytes me puedes adjuntar la simulacion. si me puedes colaborar
26/10/2015 #13


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
Archivos Adjuntos
Tipo de Archivo: pdf simulacion proteus.PDF (456,6 KB (Kilobytes), 5 visitas)
26/10/2015 #14


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.
26/10/2015 #15
Moderador

Avatar de D@rkbytes

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
Archivos Adjuntos
Tipo de Archivo: rar 18F4685 Rx.rar (59,2 KB (Kilobytes), 8 visitas)
27/10/2015 #16


buenas tardes amigo D@rkbytes la verdad ya lo he hecho todo he modificado mi código de visual, el proteus y no me funciona. el gets esta sin capturar datos.
27/10/2015 #17
Moderador

Avatar de D@rkbytes

Adjunta tu proyecto de Visual Basic. (Ejecutable y código fuente)
28/10/2015 #18


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.
Archivos Adjuntos
Tipo de Archivo: zip visual envia y recibe cadena.zip (4,3 KB (Kilobytes), 2 visitas)
28/10/2015 #19


adjunto nuevo documento de visual por que el anterior no quedo bien adjunto
Archivos Adjuntos
Tipo de Archivo: zip visual envia cadena.zip (608,4 KB (Kilobytes), 2 visitas)
28/10/2015 #20
Moderador

Avatar de D@rkbytes

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):


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.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.