Ich verwende einen PIC16F1824 mit einem externen 4-MHz-Oszillator. Ich möchte eigentlich den internen Oszillator verwenden, aber das Timing scheint falsch zu sein.
Ich habe zum Beispiel versucht, delay_ms(1000) zu verwenden, und es hat 5 Sekunden statt der erwarteten 1 Sekunde verzögert.
Was habe ich falsch gemacht?
Datenblatt: http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en546901
Ich bin ahnungslos, wenn ich die OSCCON-Details lese:
Um 4 MHz zu erhalten, setzen Sie Bit 6-3 von OSCCON auf 1101 (Seite 71 des Datenblatts).
Ich habe das in einem Kommentar vorgeschlagen, und es hat anscheinend das Problem gelöst.
Der interne Oszillator sollte laufen, wenn das Gerät zurückgesetzt wird, also müssen Sie nur diese Bits ändern und Sie sollten mit 4 MHz statt mit dem 4-MHz-Quarz laufen.
Es gibt viele Dinge, die zwischen dem Oszillator und der von Ihnen gemessenen Verzögerung schief gehen könnten. Machen Sie zunächst dasselbe mit dem bekannten guten 4-MHz-Oszillator und stellen Sie sicher, dass Sie die erwartete Messung erhalten. Versuchen Sie es dann mit dem verdächtigen Oszillator-Setup und sehen Sie, was Sie bekommen.
Ich würde sowieso nicht C und eine möglicherweise verdächtige Verzögerungsroutine verwenden, um die Oszillatorrate zu messen. Gelegentlich möchte ich überprüfen, ob der Oszillator wie erwartet eingerichtet ist, insbesondere bei PICs mit komplizierten PLLs und Teilern. Normalerweise schreibe ich eine Schleife, die bei jeder Iteration einen Port-Pin umschaltet, etwa so:
Schleife btg portb, 0 BH-Schleife
Diese Schleife benötigt 3 Befehlszyklen pro Iteration, also 6 Befehlszyklen pro Ausgabeperiode und 24 Oszillatorzyklen pro Ausgabeperiode. Betrachten Sie nun die Rechteckwelle mit einem Oszilloskop oder Frequenzmesser und multiplizieren Sie sie mit 24, um die PIC-Oszillatorfrequenz zu erhalten, nachdem alle PLLs und Teiler angewendet wurden.
delay_ms erfordert wahrscheinlich, dass die Taktgeschwindigkeit in einer .h-Datei definiert ist, damit sie die Geschwindigkeit des Oszillators kennt und berechnen kann, wie lange die Schleife dauert. Wenn Sie sich in MPLAB befinden, können Sie mit der rechten Maustaste auf den Funktionsaufruf delay_ms klicken und auf „GoTo Locator“ klicken; Sie gelangen zur Definition. Schauen Sie sich in dieser Datei um, um zu sehen, ob es irgendwo eine Definition gibt, die nach der Taktfrequenz oder etwas Ähnlichem fragt.
delay_ms() verlässt sich darauf, dass Sie XTAL im Code vor seiner Verwendung korrekt definieren, es hat keine Ahnung, auf was Sie die Uhr in der Hardware eingestellt haben, also müssen Sie es sagen, indem Sie so etwas wie XTAL 4000000 tun (kann mich nicht von Anfang an erinnern von meinem Kopf, aber werfen Sie einen Blick in die Details der Funktion delay_ms(); im Compiler-Handbuch und es wird sagen)
AKTUALISIEREN:
Fand meinen Code und die Zeile lautet:
#define _XTAL_FREQ 4000000
Majenko
Leon Heller
Kenny
mlam
Majenko
Leon Heller
Olin Lathrop
mlam