Verwenden Sie den internen PIC-Oszillator

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:Geben Sie hier die Bildbeschreibung ein

Welche Uhr verwenden? Der 16MHz, 500KHz oder 32KHz Takt? Es hört sich so an, als würden Sie die 500-kHz-Version verwenden?
Die Standardfrequenz beträgt 500 kHz. Poste deinen Code.
Ein weiterer Test besteht darin, beim Umschalten eines Ausgangs eine Schleife zu erstellen und seine Frequenz auf einem Oszilloskop zu messen. Es wird offensichtlich langsamer als die Oszillatorfrequenz sein, aber im Bereich dessen, worauf Sie hinauslaufen. (BEARBEITEN, das ist im Grunde die Antwort von @Olin Lathrop)
Danke Leute. @Matt, @Leon, @Kenny, @olin. Verzeihen Sie, ich weiß, das klingt elementar. Ich habe nichts eingestellt. Ich benutze es einfach. Wie Sie sagten, ist der Standardwert 500 kHz. Wie stelle ich es auf 4 MHz ein?
@mlam Tust du nicht. Dieser PIC hat 16MHz, 500KHz oder 31KHz. Es gibt keine 4MHz-Option. Überprüfen Sie das OSCCON-Register (im Abschnitt Oszillatoren des Datenblatts)
Um 4 MHz zu erhalten, setzen Sie Bit 6-3 von OSCCON auf 1101 (Seite 71 des Datenblatts).
Mir ist gerade aufgefallen, dass Sie ursprünglich 18F1824 sagten, aber auf der später zu Ihrem Beitrag hinzugefügten Datenblattseite steht 16F1824. Welches ist es? Der Code, den ich in meiner Antwort gegeben habe, ging von dem PIC 18-Befehlssatz aus, da dies alles war, was Sie damals erwähnt haben. Gibt es überhaupt einen 18F1824? Eigentlich klingt das eher nach einer erweiterten PIC 16-Teilenummer. Es scheint jetzt, dass Ihr ursprünglicher Text falsch war, was etwas seltsam ist, wenn man bedenkt, dass das PIC-Modell ein wichtiger Punkt der Frage ist.
Entschuldigung @Olin. Ich habe einen Tippfehler gemacht. Mein Fehler. Sie haben Recht, es ist PIC16F1824.

Antworten (4)

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.

Danke an @Leon Heller. Ich habe es geschafft, dass mein XTAL 4 Mhz funktioniert. Ich habe OSCCON = 1101 hinzugefügt; Und mein USART funktioniert gleichzeitig! Danke Leute. Aber ich habe keine Möglichkeit gefunden, den internen Oszillator zu verwenden.
Ich habe mein XTAL entfernt und versucht, die folgenden Codes zu verwenden, um interne 4 MHz zu erhalten. Die delay_ms werden viel schneller. Im Grunde möchte ich nur einen einfachen internen Oszillator.: OSCCON.SCS1 = 1; OSCCON.SCS0 = 0; OSCCON.IRCF3 = 1101;
OK. Gelöst. Dieser Oszillator ist wirklich schwierig. Ich habe die Referenz von hier: roughrecord.blogspot.com/2010/12/…

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.

Danke ajs410. Ich habe die Antwort gefunden. Siehe Kommentar von Leon

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  
Danke @SimonBarker, ich benutze MikroC, ich werde sehen, wie man es benutzt.