Tiempos incorrectos, LEDs locos en simulación

#1
Hola, soy yo otra vez. Sigo con el tema de la programación-simulación en C. Resulta que hoy estoy intentando hacer parpadear LEDs en ciertas secuencias, aunque he acabado haciendo un contador... Me ocurre lo mismo. Hace un par de días hice un programa que hacía parpadear todos los LED del puerto B con delay, y funcionó perfectamente (aunque en la mitad de tiempo del que debería). Sin embargo, y ya me ha ocurrido en otras ocasiones, en éste programa al simularlo se "vuelven locos", es decir, con un delay y frecuencia del reloj declarados correctamente, funciona tan rápido que no se ve. ¿Alguien podría decirme si es un problema de simulación o de programación? Muchas gracias, os dejo el código:

Código:
#include <16f84a.h>
#use delay(clock=4000)
#byte port_b=0x06
#byte port_a=0x05
#byte TRISB=getenv("SFR:TRISB")
#byte TRISA=getenv("SFR:TRISA")
#fuses NOWDT

void main(){
   TRISB=0;
   port_b=0;
   while(true){
   port_b=port_b+1;
   delay_ms(1500);
   if(port_b==0xff){
      port_b=0;
   }
   }
}
 
Última edición por un moderador:
#2
Hola.
Agrega 3 ceros más a #use delay(clock=4000), se supone que debe de estar en MHz. y en el simulador coloca la misma frecuencia.

Saludos.
 
#3
Hola ByAxel, no es ése el problema, en realidad lo tengo a 4kHz (tanto el programa como la simulación) porque la CPU de mi churro-portatil no soporta mayor velocidad y empieza a ralentizar la simulación. De todas formas al hacerlo con 4Mhz sigue ocurriendo lo mismo. Gracias.
 
#4
Si lo quieres simular a 4KHz, cambia la frecuencia de reloj del PIC en ISIS a 4KHz también.
Y agrega otro signo = a la instrucción if(port_b=0xff) así...
if(port_b==0xff)

Esa sentencia If no es importante, ya que cuando el puerto B alcance la cuenta de 255 automáticamente regresará a 0 por desbordamiento.

Suerte.
 
Última edición:
#5
en este punto si el esquema está bien (MCLR a 5V) puedes probar lo siguiente:
- Compilar con otra versión (CCS tiene algunos bugs) o prueba reduciendo el valor del DelayMs.
- Cargar el archivo *.cof y correr el programa paso a paso, es necesario saber un poco de asm para que cambies la vista a assembly en el cuadro en el que aparece el código en C. Revisa en asm si el código que has escrito lo realiza al pié de la letra. Si va bien, entonces es culpa de la función DelayMs.
- También sugiero que seas más explícito en cuanto a la configuración del PIC. Fuses y demás.

Prueba eso. Saludos.
 
#6
He encontrado la solución: al parecer el simulador pasa completamente del clock que le he puesto externamente a 4kHz y estaba utilizando uno "interno" que viene por defecto en el simulador a 1MHz. He cambiado su valor en "Edit Properties" a los 4kHz que tengo programados y ha funcionado correctamente. Al parecer es algo que a veces ocurre y otras no, habrá que asegurarse de que está todo a la misma frecuencia las próximas veces. Gracias de nuevo.
 
#7
He encontrado la solución: al parecer el simulador pasa completamente del clock que le he puesto externamente a 4kHz y estaba utilizando uno "interno" que viene por defecto en el simulador a 1MHz. He cambiado su valor en "Edit Properties" a los 4kHz que tengo programados y ha funcionado correctamente.
Si lo quieres simular a 4KHz, cambia la frecuencia de reloj del PIC en ISIS a 4KHz también.
Al parecer es algo que a veces ocurre y otras no, habrá que asegurarse de que está todo a la misma frecuencia las próximas veces. Gracias de nuevo.
Nop, ISIS toma siempre en cuenta la frecuencia de reloj que se establece en las propiedades del PIC.
Y no lo hace aleatoriamente, ese fue un error tuyo que desde un principio debiste tener en cuenta. :cool:
Lo que no hace ISIS, es tomar cómo referencia el oscilador externo (El cristal se puede omitir)

Saludos.
 
Arriba