¿Qué tiene de malo este ejemplo de parpadeo de dsPIC30F2020?

He codificado un ejemplo de parpadeo simple para un dsPIC30F2020. Creo que el esquema es correcto, pero no estoy seguro de los bits de configuración.

Herramientas :

  • UCM: dsPIC30F2020
  • Programador: PICKit 2
  • IDE: MPLAB X IDE v3.60

Aquí está el código:

#incluir "xc.h"
#incluir "libpic30.h"
#incluir "stdio.h"
#incluir "stdlib.h"
#incluye "p30F2020.h"

// xtal
#define _XTAL_FREQ 16000000

// Ajustes de bits de configuración de DSPIC30F2020
// Declaraciones de configuración de la línea fuente 'C'

// FBS
#pragma config BWRP = BWRP_OFF ​​// Protección contra escritura del segmento de arranque (se puede escribir el segmento de arranque)
#pragma config BSS = NO_BOOT_CODE // Protección de código de destello del programa de segmento de inicio (sin segmento de inicio)

// FGS
#pragma config GWRP = GWRP_OFF ​​// Protección contra escritura del segmento de código general (se puede escribir el segmento general)
#pragma config GSS = GSS_OFF // Protección de código de segmento general (deshabilitada)

// FOSCSEL
#pragma config FNOSC = PRIOSC // Modo Oscilador (Oscilador primario (HS, EC))

// FOSC
#pragma config POSCMD = HS // Fuente de oscilador principal (modo de oscilador HS)
#pragma config OSCIOFNC = OSC2_CLKO // Función de pin OSCI/OSCO (el pin OSCO tiene función de reloj)
#pragma config FRANGE = FRC_HI_RANGE // Selección de rango de frecuencia (rango alto)
#pragma config FCKSM = CSW_FSCM_OFF // Cambio de reloj y monitor (Sw deshabilitado, Mon deshabilitado)

// ADELANTE
#pragma config WDTPS = WDTPOST_PS32768 // Watchdog Timer Postscaler (1:32,768)
#pragma config FWPSA0 = WDTPRE_PR128 // WDT Prescaler (1:128)
#pragma config WWDTEN = WINDIS_OFF // Ventana del temporizador de vigilancia (modo sin ventana)
#pragma config FWDTEN = FWDTEN_OFF // Habilitar (deshabilitar) el temporizador de vigilancia

// FPOR
#pragma config FPWRT = PWRT_128 // Valor del temporizador POR (128ms)

// FICD
#pragma config ICS = ICS_PGD // Selección de canal de comunicación (Use PGC/EMUC y PGD/EMUD)

int principal(){
    _TRISD0 = 0x00;

    mientras(1){
        _RD0 = 0xff;
        __retraso32(150000000);
        _RD0 = 0x00;
        __retraso32(150000000);
    }
    devolver 0;
}

Y aquí está el esquema:esquema para el ejemplo de parpadeo

Captura de pantalla de Pickit 2:

foto kit 2

Cuando conecto el LED a RD0 (pin 15), el LED se enciende todo el tiempo; no parpadea

¿Qué podría estar mal?

[ACTUALIZAR] Creo que ese __delay32()es el problema. ¿Alguna idea?

¡Vaya, esa es una de las conexiones más confusas!

Respuestas (1)

Parece que está usando un cristal de 16 MHz, pero le dice al compilador que su frecuencia es de 160 MHz:

#define _XTAL_FREQ 160000000

Además, a 16 MHz, cada ciclo de reloj es 1 / dieciséis , 000 , 000 = 62.5 norte s .

Estás llamando __delay32(150000000);, lo que equivaldría a 150000000 62.5 norte s = 9.37 s . Entonces, el LED estará encendido durante unos diez segundos y luego se apagará durante unos 10 segundos.

Oye, he cambiado el reloj a 16000000 (16 Mhz) y el tiempo de retardo a 15000000, por lo que debería retrasarse unos 0,937 segundos, pero el led seguía encendido todo el tiempo. ¿Alguna idea?
@WildanSNahar Hmmm. Para solucionar problemas, haría una prueba rápida y apagaría el LED primero y luego lo encendería. Si se enciende de todos modos, eso apunta al circuito...
Sí, hice eso. Eso funciona. Primero, en while(1) cambié la condición inicial a 0xffy se enciende, y luego en while(1) cambié nuevamente a 0x00y se apagó. Entonces, ¿qué pasa entonces?
@WildanSNahar Bueno, ¡eso es bueno! Verifica su hardware :) A continuación, probaría una función diferente para hacer el retraso. Hay uno __delay_ms()que tal vez quieras probar. El "Manual de referencia de bibliotecas de herramientas de lenguaje de 16 bits" dice que primero debe definir FCYcomo su frecuencia de cristal. Y debe definirse antes de su #include "libpic30.h"declaración. Mmm. Me pregunto si simplemente mueve su #define _XTAL_FREQ 16000000línea a la parte superior del archivo, tal vez su función `__delay32() original podría comenzar a funcionar...
Intenté eso. Pero no funciona. ¿Cómo debo escribir FCY? ¿Y cómo puedo usar __delay_ms()en lugar de __delay32()?
@WildanSNahar Además de #define _XTAL_FREQ 16000000, también puso una nueva línea en la parte superior: #define FCY 16000000. Luego, puede llamar a __delay_ms() con el argumento en una cantidad de milisegundos. Para una demora de un segundo, llame__delay_ms(1000);
Hice eso, el programa se compiló con éxito pero el led seguía encendido todo el tiempo. ¿Alguna idea, de nuevo?
Intente deshabilitar su WDT (Watchdog Timer). Podría estar expirando y reiniciando el código repetidamente.