¡El código básico para cambiar el LED para PIC18f4550 XC8 no funciona!

0

No puedo ejecutar este código en mi PIC18F4550 con un oscilador de cristal de 20.00 MHz. Yo uso el compilador XC8. ¿Dónde está el problema? ¿Cómo escribir una configuración en el compilador XC8? Por cierto, soy un principiante en el mundo de los microcontroladores. ¿Alguien puede decirme qué está mal con mi configuración?

#pragma config OSC = HS,OSCS = OFF
#pragma config PWRT = OFF,BOR = ON,BOVR = 45
#pragma config WDT = OFF,LVP = OFF
#pragma config DEBUG = OFF,STVR = OFF
#include<p18f4550.h>

void msdelay(unsigned int ms)
{
    unsingned int x;
    unsigned char z;
    for(x = 0; x < ms ; x++)
        for(z = 0; z < 165;z++);
}

void main(void)
{
    TRISB = 0;
    while(1)
    {
        PORTB = 0x55;
        msdelay(500);
        PORTB = 0xAA;
        msdelay(500);
    }
}
    
pregunta user2329082

1 respuesta

1

Si está ejecutando su código a 20Mhz, y si recuerdo bien, el Fcyc fue un Fosc / 4, lo que significaría que está ejecutando su código a 5Mhz.

A 5Mhz, eso es 200 ns por instrucción.

Su función de retardo es ~ 500 * 165 = 82500 ciclos = 16.5ms. "No funciona" podría ser que ESTÁ funcionando, pero simplemente no funciona de la manera que podría haber esperado. Es probable que solo sea demasiado rápido para que lo veas.

Intente cambiar su msdelay (..) a lo siguiente

void msdelay(unsigned int ms)
{
   unsingned int x;
   unsigned int z;
   for(x = 0; x < ms ; x++)
     for(z = 0; z < 5000;z++);
}

¿Cómo obtuve 5000?

Cada ciclo toma 200ns. Entonces, para obtener un retraso de 500 ms, primero puede averiguar cuánto es por 1 ms. \ $ \ frac {1ms} {200ns} = 5000 \ $

Ahora, cuando pase su parámetro en ms, por cada ms se ejecutará 5000 veces.

Esperemos que eso ayude.

    
respondido por el efox29

Lea otras preguntas en las etiquetas