¿Qué está mal con este ejemplo de parpadeo dsPIC30F2020?

0

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

Herramientas:

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

Aquí está el código:

#include "xc.h"
#include "libpic30.h"
#include "stdio.h"
#include "stdlib.h"
#include "p30F2020.h"

// xtal
#define _XTAL_FREQ 16000000

// DSPIC30F2020 Configuration Bit Settings
// 'C' source line config statements

// FBS
#pragma config BWRP = BWRP_OFF          // Boot Segment Write Protect (Boot Segment may be written)
#pragma config BSS = NO_BOOT_CODE       // Boot Segment Program Flash Code Protection (No Boot Segment)

// FGS
#pragma config GWRP = GWRP_OFF          // General Code Segment Write Protect (General Segment may be written)
#pragma config GSS = GSS_OFF            // General Segment Code Protection (Disabled)

// FOSCSEL
#pragma config FNOSC = PRIOSC           // Oscillator Mode (Primary Oscillator (HS, EC))

// FOSC
#pragma config POSCMD = HS              // Primary Oscillator Source (HS Oscillator Mode)
#pragma config OSCIOFNC = OSC2_CLKO     // OSCI/OSCO Pin Function (OSCO pin has clock out function)
#pragma config FRANGE = FRC_HI_RANGE    // Frequency Range Select (High Range)
#pragma config FCKSM = CSW_FSCM_OFF     // Clock Switching and Monitor (Sw Disabled, Mon Disabled)

// FWDT
#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      // Watchdog Timer Window (Non-Window mode)
#pragma config FWDTEN = FWDTEN_OFF      // Watchdog Timer Enable (Disable)

// FPOR
#pragma config FPWRT = PWRT_128         // POR Timer Value (128ms)

// FICD
#pragma config ICS = ICS_PGD            // Comm Channel Select (Use PGC/EMUC and PGD/EMUD)

int main(){
    _TRISD0 = 0x00;

    while(1){
        _RD0 = 0xff;
        __delay32(150000000);
        _RD0 = 0x00;
        __delay32(150000000);
    }
    return 0;
}

Y aquí está el esquema:

CapturadepantalladePickit2:

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

¿Qué podría estar mal?

[ACTUALIZACIÓN] Creo que el __delay32() es el problema. ¿Alguna idea?

    
pregunta Wildan S Nahar

1 respuesta

1

Parece que estás usando un cristal de 16 MHz, pero le dices al compilador que tu frecuencia es de 160 MHz:

#define _XTAL_FREQ 160000000

Además, a 16 MHz, cada ciclo de reloj es \ $ 1 / 16,000,000 = 62.5ns. \ $

Está llamando a __delay32(150000000); , lo que equivaldría a \ $ 150000000 \ cdot62.5ns = 9.37s \ $. Por lo tanto, el LED se encenderá durante unos diez segundos y luego se apagará durante unos 10 segundos.

    
respondido por el bitsmack

Lea otras preguntas en las etiquetas