No hace el delay correcto

Estoy haciendo un programa con un pic16f887 en que haga a un led parpadear y lo estoy simulando en proteus. El problemas es que el delay que hace es muy lento comparado con el de otros videos que he visto. Aqui les dejo el programa y la simulacion (El cristal que estoy usando es de 20Mhz):


// PIC16F887 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz

void main(void) {
TRISD = 0;
while(1){
RD0 = 1;
__delay_ms(500);
RD0 = 0;
__delay_ms(500);
}
return;
}

pic16f887.gif
 
Claro que no hace el delay correcto. "delay" + "correcto" no pueden estar en la misma frase, es un oxímoron como el color blanconegro el agua seca y subir hacia abajo.

Aprende a usar timers y olvida las cosas esas del diablo.


Al margen de mi "leve" animadversión por los delays, estás hablando de una simulación, a lo mejor es que tu PC es lento o cualquier otra configuración del simulador.

Pero usa timers, no delays.
 
Técnicamente puede hacer un delay correcto, que lo haga en sincronía correcta es otra cosa.
En teoría el código debería estar bien, pero recuerda, un simulador no es la realidad, podría ser un retraso por la simulación en la computadora o que esté mal configurada la velocidad de ella.
PD: ese return está demás, void no retorna valores.
 
PD: ese return está demás, void no retorna valores.
Muchas personas usan eso en XC. ¿Por qué? porque aún no entienden el C y copian lo que se encuentran.
Y es cierto, un retardo bien hecho en el lenguaje que sea, será perfecto si se realiza bien y obviamente no es cosa del diablo ni hay por que creer que usarlos está mal.
Quebrarse la cabeza calculando timers sí es del diablo, cuando todo lo resuelve una rutina llamada "delay"
Hay que tener en cuenta cuando hay que seguir atendiendo un programa y cuando no, que en tal caso, no viene al caso.
Desterrar un "delay", para un novato es como decirle; no programes hasta que entiendas que existen los timers o la multitarea basada en RTOS.
Se llenará de pánico y quizás hasta las ganas de programar se le vayan.

Pienso que, antes de decirle a una persona que apenas comienza a programar, que los retardos basados en bucles son malos porque detienen otros procesos, primero se debe ver en qué los está usando y con sutileza explicarle el motivo de no usarlos.
 
Atrás
Arriba