Ich habe ein einfaches Blinkbeispiel für einen dsPIC30F2020 codiert. Ich denke, dass der Schaltplan korrekt ist, aber ich bin mir der Konfigurationsbits nicht sicher.
Werkzeug :
Hier ist der Code:
#include "xc.h" #include "libpic30.h" #include "stdio.h" #include "stdlib.h" #include "p30F2020.h" // xtal #define _XTAL_FREQ 16000000 // DSPIC30F2020 Konfigurationsbiteinstellungen // Konfigurationsanweisungen der 'C'-Quellzeile // FBS #pragma config BWRP = BWRP_OFF // Boot Segment Write Protect (Boot Segment darf geschrieben werden) #pragma config BSS = NO_BOOT_CODE // Boot-Segment-Programm-Flash-Code-Schutz (kein Boot-Segment) // FGS #pragma config GWRP = GWRP_OFF // General Code Segment Write Protect (Allgemeines Segment darf geschrieben werden) #pragma config GSS = GSS_OFF // Allgemeiner Segmentcodeschutz (deaktiviert) // FOSCSEL #pragma config FNOSC = PRIOSC // Oszillatormodus (Primäroszillator (HS, EC)) // FOSC #pragma config POSCMD = HS // Primäre Oszillatorquelle (HS-Oszillatormodus) #pragma config OSCIOFNC = OSC2_CLKO // OSCI/OSCO-Pin-Funktion (OSCO-Pin hat Clock-Out-Funktion) #pragma config FRANGE = FRC_HI_RANGE // Frequenzbereich auswählen (hoher Bereich) #pragma config FCKSM = CSW_FSCM_OFF // Uhrumschaltung und Überwachung (Sw deaktiviert, Mo deaktiviert) // 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-Fenster (Nicht-Fenster-Modus) #pragma config FWDTEN = FWDTEN_OFF // Watchdog-Timer aktivieren (deaktivieren) // FPOR #pragma config FPWRT = PWRT_128 // POR-Timer-Wert (128 ms) // FICD #pragma config ICS = ICS_PGD // Kommunikationskanal auswählen (PGC/EMUC und PGD/EMUD verwenden) int Haupt() { _TRISD0 = 0x00; während (1) { _RD0 = 0xff; __delay32(150000000); _RD0 = 0x00; __delay32(150000000); } 0 zurückgeben; }
Pickit 2-Screenshot:
Wenn ich die LED an RD0 (Pin 15) anschließe, leuchtet die LED die ganze Zeit; es blinkt nicht.
Was könnte falsch sein?
[UPDATE] Ich denke, das __delay32()
ist das Problem. Irgendeine Idee?
Es sieht so aus, als würden Sie einen 16-MHz-Quarz verwenden, aber dem Compiler mitteilen, dass Ihre Frequenz 160 MHz beträgt:
#define _XTAL_FREQ 160000000
Auch bei 16 MHz ist jeder Taktzyklus
Sie rufen an __delay32(150000000);
, was gleichbedeutend mit wäre
. Die LED ist also etwa zehn Sekunden lang an und dann etwa 10 Sekunden lang aus.
0xff
und es leuchtet, und dann änderte ich in while(1) wieder auf 0x00
und es schaltete sich aus. Also, was ist dann falsch?__delay_ms()
Sie vielleicht ausprobieren möchten. Das "16-Bit Language Tools Libraries Reference Manual" sagt, dass Sie zuerst FCY
als Ihre Kristallfrequenz definieren müssen. Und es muss vor Ihrer #include "libpic30.h"
Aussage definiert werden. Hmm. Ich frage mich, ob Sie Ihre #define _XTAL_FREQ 16000000
Zeile einfach an den Anfang der Datei verschieben, vielleicht beginnt Ihre ursprüngliche Funktion `__delay32() zu arbeiten ...FCY
? Und wie kann ich __delay_ms()
statt verwenden __delay32()
?#define _XTAL_FREQ 16000000
eine neue Zeile oben hinzu: #define FCY 16000000
. Dann können Sie __delay_ms() aufrufen, wobei das Argument eine Anzahl von Millisekunden ist. Rufen Sie für eine Verzögerung von einer Sekunde an__delay_ms(1000);
Olin Lathrop