Lo que no entiendo es por que esta tan limitada, no se si sera por el tema de que el cristal esta a 20Mhz
La funcion __delay_ms() ya se encuentra definida en "xc.h" asi que no hay necesidad de hacerlo de nuevo. Probe con el __delay_ms(500) y me dijo que era un argumento demasiado grande.
Imagino esto por que debe usar la funcion delay __delay() y este debe tener un numero maximo. Y si quisiera calcula la cantidad de ciclos a meter para 500ms serian:
500ms / (4/Fosc) = 2.500.000 ciclos.... y se necesitarian casi 24 bits para eso,
y creo que le maximo es de 16 bits o 65535(Abajo digo cuales son los limites). Entonces intente hacer 500 delays de 1ms, y ahi me funciono.
#include <xc.h>
#include <stdint.h> /* Includes uint16_t definition */
#include <stdbool.h> /* Includes true/false definition */
#define _XTAL_FREQ 20000000
void main() {
uint16_t i;
TRISB = 0b00000000; // Configuro puerto B como salidas
while (1) // Bucle infinito
{
LATBbits.LB1 = 0; // Apago pin RB0
for(i=0;i<499;i++) { __delay_ms(1); }
LATBbits.LB1 = 1; // Enciendo pin RB0
for(i=0;i<499;i++) { __delay_ms(1); }
}
}
Tampoco pongo el .h del pic, ya que tambien se encuentra incluido por el compilador al elegirlo. Y la configuracion la tengo en otro archivo.
Culpa de de ese bucle si ponia (i < 500) en el for, terminaba durando:
Target halted. Stopwatch cycle count = 2505012 (501,0024 ms)
Entonces probe con 1 delay menos y termine con
Target halted. Stopwatch cycle count = 2500002 (500,0004 ms)
Si supongo el maximo de 65k (2^16) El maximo tiempo que puedo hacer una demora con ese oscilador es de 13ms :/
Asi que probe con:
for(i=0;i<50;i++) { __delay_ms(10); }
Y obtuve:
Target halted. Stopwatch cycle count = 2500258 (500,0516 ms)
Pero lo que mas me llamo la atencion fue esto:
:: advisory: (1233) Employing 18F4620 errata work-arounds:
:: advisory: (1234) * Corrupted fast interrupt shadow registers
:: advisory: (1234) * Data in RAM location can be corrupted if async. reset occurs during write
********** EDIT **********Buscando info por internet me encuentro que es distinto para PIC18 y para PIC16.
PIC16 , el maximo son 50.462.464 ciclos
PIC18 , el maximo es de 197.120 ciclos
Asi que el maximo delay que podes generar es de 197120 * Tcy = 39ms con ese cristal de 20Mhz, de intentar generar un valor mas grande, o repetis o usar un for.
Probado con
for(i=0;i<20;i++) { __delay_ms(25); }
Resultado
Target halted. Stopwatch cycle count = 2500108 (500,0216 ms)