Was ist falsch an diesem dsPIC30F2020-Blinkbeispiel?

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 :

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

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;
}

Und hier ist der Schaltplan:Schaltplan für Blinkbeispiel

Pickit 2-Screenshot:

Bildsatz 2

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?

Wow, das ist ein verwirrendes Rattennest von Verbindungen!

Antworten (1)

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 1 / 16 , 000 , 000 = 62.5 N S .

Sie rufen an __delay32(150000000);, was gleichbedeutend mit wäre 150000000 62.5 N S = 9.37 S . Die LED ist also etwa zehn Sekunden lang an und dann etwa 10 Sekunden lang aus.

Hei, ich habe die Uhr auf 16000000 (16 Mhz) und die Verzögerungszeit auf 15000000 geändert, also sollte es um etwa 0,937 Sekunden verzögert werden, aber die LED leuchtet immer noch die ganze Zeit. Irgendeine Idee?
@WildanSNahar Hmm. Zur Fehlersuche würde ich einen schnellen Test durchführen und die LED zuerst auf AUS und dann auf EIN stellen. Wenn sie trotzdem leuchtet, deutet das auf den Stromkreis hin...
Ja, das habe ich getan. Das funktioniert. Zuerst änderte ich in while(1) den Anfangszustand auf 0xffund es leuchtet, und dann änderte ich in while(1) wieder auf 0x00und es schaltete sich aus. Also, was ist dann falsch?
@WildanSNahar Nun, das ist gut! Es überprüft Ihre Hardware :) Als nächstes würde ich eine andere Funktion ausprobieren, um die Verzögerung vorzunehmen. Es gibt eine, die __delay_ms()Sie vielleicht ausprobieren möchten. Das "16-Bit Language Tools Libraries Reference Manual" sagt, dass Sie zuerst FCYals 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 16000000Zeile einfach an den Anfang der Datei verschieben, vielleicht beginnt Ihre ursprüngliche Funktion `__delay32() zu arbeiten ...
Das habe ich versucht. Aber es funktioniert nicht. Wie soll ich schreiben FCY? Und wie kann ich __delay_ms()statt verwenden __delay32()?
@WildanSNahar Fügen Sie zusätzlich zu #define _XTAL_FREQ 16000000eine 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);
Ich habe das getan, das Programm wurde erfolgreich kompiliert, aber die LED leuchtete immer noch die ganze Zeit. Schon wieder eine Idee?
Versuchen Sie, Ihren WDT (Watchdog Timer) zu deaktivieren. Es kann sein, dass es abläuft und den Code wiederholt zurücksetzt.