PIC24FJ64GA002 läuft nicht mit hoher Geschwindigkeit

Ich versuche, meinen PIC24FJ64GA002 mit 32 MHz zum Laufen zu bringen. Ich messe die Frequenz am OSCO-Pin, und es sind nur 4 MHz. Hier ist mein Code:

config  __FOSCSEL, FNOSC_FRCPLL & IESO_OFF
config  __FOSC, FCKSM_CSECMD & OSCIOFNC_ON

                mov        #0x1182,        W0                    ; OSCCON
                mov        #0x0000,        W1                    ; CLKDIV
                mov        #0x0000,        W3                    ;OSCTUN

                mov        W0,                OSCCON
                mov        W3,                OSCTUN
                mov        W1,                CLKDIV

Antworten (2)

Es sieht so aus, als würden Sie die Uhr nicht umschalten - wenn es so etwas wie der dsPIC ist, den ich kürzlich verwendet habe, können Sie nur auf die PLL umschalten, nachdem der primäre Oszillator (INTRC oder EXT XTAL) läuft.

Dazu verwenden Sie eine im Handbuch beschriebene Entsperrsequenz. Ich habe gerade kurz nachgesehen und es ist da für Ihren Chip mit Erklärung auf Seite 93.

Es gibt Makros in der C30-Bibliothek (nur zur Information, wenn Sie irgendwann C verwenden möchten), um die erforderlichen OSC-Register zu entsperren und zu schreiben und dasselbe zu tun, aber ich kann sie dort nicht erwähnt sehen (wird in der C30 Handbuch).
Versuchen Sie auf jeden Fall, die Anweisungen auf dieser Seite zu befolgen, und lassen Sie es uns wissen. Wenn es immer noch nicht funktioniert, werde ich noch einmal nachsehen (ich glaube, ich habe hier irgendwo einen dieser PIC24s, um ihn bei Bedarf zu testen).

BEARBEITEN - Als Referenz finden Sie unten den betreffenden Code. Sie müssen 0x03 (den Code für den externen Kristall mit PLL) in W0 eingeben, kurz bevor es ausgeführt wird. Wahrscheinlich möchten Sie nach dem Wechsel eine kleine Verzögerung haben, damit sich die neue Uhr einpendeln kann, und OSWEN und das LOCK-Bit überprüfen, um sicherzustellen, dass der Wechsel erfolgreich war.

;Place the new oscillator selection in W0
OSCCONH (high byte) Unlock Sequence
MOV #OSCCONH, w1
MOV #0x78, w2
MOV #0x9A, w3
MOV.b w2, [w1]
MOV.b w3, [w1]
;Set new oscillator selection
MOV.b WREG, OSCCONH
;OSCCONL (low byte) unlock sequence
MOV #OSCCONL, w1
MOV #0x46, w2
MOV #0x57, w3
MOV.b w2, [w1]
MOV.b w3, [w1]
;Start oscillator switch operation
BSET OSCCON,#0

BEARBEITEN

Ich habe noch einmal nachgesehen und ich denke, Sie sollten in der Lage sein, mit der Verwendung des FRC mit PLL auf diesem Chip zu beginnen (auf dem dsPIC war es sowieso nur mit xtal IIRC). Ich werde das Obige trotzdem als Referenz zum Umschalten lassen.

Meine zweite Vermutung ist, dass ich denke, dass Sie die Konfiguration falsch haben - und die .inc-Datei zeigt, dass die Konfigurationen für das OSC usw. in config2 und nicht in config sind.
Überzeugen Sie sich selbst in Ihrem ASM30-Ordner - er sollte etwa unter:
C:\Program Files\Microchip\MPLAB ASM30 Suite\Support\PIC24F\inc)
Beachten Sie auch die Hinweise zum Setzen der Config-Bits entweder mit Makro oder dem längeren Weg. Stellen Sie sicher, dass Sie diese korrekt haben.
Es könnte sich auch lohnen, das PLL LOCK-Bit (im OSCCON-Register) zu überprüfen - siehe dieses FRM-Oszillator-Dokument für die gründlichste Diskussion. Bei den größeren PICs benötigen Sie sowieso das Familienreferenzhandbuch, also schnappen Sie sich alle Teile vom Mikrochip, wenn Sie sie nicht haben)

Danke für Ihren Vorschlag! Ich habe den Code hinzugefügt und er scheint die Geschwindigkeit zu wechseln, aber die PLL wird immer noch nicht eingeschaltet. Ich verwende den FRC (Fast RC Oszillator), also ist es 0x01, nicht 0x03.
Ah, dachte, Sie verwenden einen externen Kristall. Nach mehr Lektüre denke ich, dass Sie in der Lage sein sollten, die PLL ohne Umschalten zu verwenden. Siehe Änderungen für weitere Gedanken. Lass mich wissen wie es geht..
Es klappt! Ich habe die Zeile geändert in:
config __CONFIG2, FNOSC_FRCPLL & IESO_OFF

Laut Datenblatt:

Die Prozessortaktquelle wird durch zwei geteilt, um den internen Befehlszyklustakt FCY zu erzeugen. In diesem Dokument wird der Befehlszyklus auch mit FOSC/2 bezeichnet. Der interne Befehlszyklustakt FOSC/2 kann für einige Betriebsarten des Primäroszillators auf dem OSCO-I/O-Pin bereitgestellt werden.

Wenn Sie also 4 MHz aus dem OSCO-Pin herausbekommen, muss der interne Oszillator mit 8 MHz laufen.

8MHz ist die Grundfrequenz des internen Fast-RC-Oszillators.

Um auf 32 MHz zu kommen, müssen die 8 MHz durch die PLL gehen, um sie mit 4 zu multiplizieren.

Theoretisch sollten Sie bei einem Takt von 32 MHz 16 MHz auf dem OSCO-Pin sehen.

Dies tun Sie angeblich bereits, sowohl über die Konfigurationseinstellungen als auch über das OSCCON-Register.

Alle Ihre Postscaler sind auf 1:1 eingestellt, was gut ist.

Dinge zu versuchen und/oder zu klären:

  1. Läuft der Kern tatsächlich nur mit 8 MHz oder gibt der OSCO-Pin die Pre-PLL-Frequenz an (unwahrscheinlich)? Versuchen Sie, ein einfaches Programm auszuführen, das einen IO-Pin HIGH und dann LOW im Bereich umschaltet 2 T C Y und messen Sie die Breite des Impulses.
  2. Versuchen Sie, den Chip mit einem externen Quarz bei 8 MHz zu betreiben, und verwenden Sie die PLL, um zu versuchen, 32 MHz zu erhalten. Dies kann nur eine vorübergehende Anordnung sein, um zu bestätigen, dass die PLL aktiviert ist.
  3. Untersuchen Sie den Zustand der PLL, um sicherzustellen, dass sie sich als erstes, was Ihr Programm tut, eingestellt hat. Ich konnte bei meinem flüchtigen Blick durch das Datenblatt nicht genau erkennen, welches Flag darauf überprüft werden sollte, aber wenn Sie die PLL verwenden, sollte dies immer das erste sein, was Ihr Programm tut.
Ich habe Ihre Idee des Testprogramms implementiert, und es scheint 1/4 der erwarteten Geschwindigkeit zu sein, wenn wir 16 MIPS hätten. Aus irgendeinem Grund sperrt die PLL nicht. Ich habe einen anderen Chip ausprobiert, um zu sehen, ob er defekt ist, aber es hat nicht geholfen.
Ich verwende MPLab X Beta 7.12. Habe noch nicht auf das Finale aktualisiert. Weiß nicht, ob das einen Unterschied machen könnte.