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 :
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; }
Captura de pantalla de Pickit 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?
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
Estás llamando __delay32(150000000);
, lo que equivaldría a
. Entonces, el LED estará encendido durante unos diez segundos y luego se apagará durante unos 10 segundos.
0xff
y se enciende, y luego en while(1) cambié nuevamente a 0x00
y se apagó. Entonces, ¿qué pasa entonces?__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 FCY
como 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 16000000
línea a la parte superior del archivo, tal vez su función `__delay32() original podría comenzar a funcionar...FCY
? ¿Y cómo puedo usar __delay_ms()
en lugar de __delay32()
?#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);
olin lathrop