PIC18F4520 ist bei Verwendung des internen Oszillators bei 1 MHz ausgefallen

Ich möchte den internen Oszillator des pic18f4520 mit einer Frequenz von 1 MHz verwenden, was ich am Ende erreichen möchte, um ein Servo zu steuern.

#include p18cxxx.h          
#include pwm.h              
#include timers.h               
#include adc.h

#pragma config OSC = INTIO1
#pragma config MCLRE = ON           /* Set Master Clear */ 
#pragma config WDT = OFF            /* set watchdog timer off */ 
#pragma config LVP = OFF            /* Low Voltage Programming Off */ 
#pragma config DEBUG = OFF          /* Compile without extra Debug compile Code */ 
#pragma config PBADEN = OFF         /* Disable Analogue on PORTB */

void main() { 
    OSCCON = 0x42;
    TRISC = 0X00;
    PR2=152;  // period
    T2CON = 0x06;  //prescale to 16
    OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_20_TAD,ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 0b1011); 
    SetChanADC(ADC_CH0); 
    ConvertADC( ); 
    while(BusyADC( )); /* wait for completion */
    CCP1CONbits.CCP1M = 0x0C;    //make the pin an output
    CCPR1L = (ReadADC()/4);   // duty cycle
    CCP1CONbits.DC1B=0;
}

Wenn ich einen externen Oszillator verwende, funktioniert die PWM einwandfrei, aber ich kann mit einem externen 20-MHz-Oszillator kein 50-Hz-Signal erhalten. Ich möchte die PWM ohne den externen Oszillator verwenden, nur weil es wie ein süßer Trick zu wissen scheint.

Ich bin sehr neu bei Mikrocontrollern und entschuldige mich, wenn ich keine Protokolle befolge, um mein Problem zu erklären, aber um es noch einmal zu wiederholen, das Problem besteht darin, den internen Oszillator auf 1 MHz einzustellen, ich habe das Datenblatt gelesen und dem OSSCON-Register den erforderlichen Wert und zugewiesen um den internen Oszillator einzuschalten und auf 1 MHz einzustellen.

Der Code lässt sich nicht kompilieren und scheint etwas zweifelhaft zu sein, wenn ich den OSC auf INTIO1 konfiguriere, obwohl das Datenblatt dies vorschreibt, wenn ich die internen Oszillatorfunktionen des Mikrocontrollers verwenden möchte.

Das Programm ist im c18-Compiler

Aus irgendeinem Grund löscht die Site Wörter mit "< > " und schreibt alles vor dem "#"-Zeichen groß, also gehen Sie bitte davon aus, dass alles korrekt ist, außer in den Include- und Pragmas, außer der Pragma-Konfiguration OSC=INTIO1, die wie erwähnt nicht erlaubt ist gelungener Aufbau.

Wow "MHz" (richtig), "MHZ" und "Mhz" in einer Frage. Ich bin kein Experte für Mikros, aber die Liebe zum Detail ist wichtig, da bin ich mir sicher. Ich bin mir auch sicher, dass dir jemand helfen wird, aber pedantisch mich nicht!!
Bitte fügen Sie den Compiler-Fehler ein
Das erste, was mir auffällt, ist, dass Sie keine Hauptschleife haben, Ihr Code fällt einfach durch die Hauptfunktion. Das führt immer zu merkwürdigen Ergebnissen.
Ich habe eine Antwort hinzugefügt, weil meine Kommentare zu lang für Kommentare waren. Ich werde dies aktualisieren, wenn Sie uns den Compiler-Fehler zeigen können, wie Vladimir vorgeschlagen hat.
Hallo, Andy Aka, es tut mir leid wegen meiner MHZ-, MHz- und MHZ-Inkorrektheit,
Ich habe wie empfohlen eine While-Schleife hinzugefügt, es tut mir so leid wegen der Verzögerung, ich hätte nicht gedacht, dass eine Antwort so schnell folgen würde. Dies ist der Fehler, den ich anscheinend von MPLAB bekomme: C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:1:Error [1026] fehlerhafte #include-Direktive C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:2:Fehler [1026] fehlerhafte #include-Direktive C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:3:Fehler [1026] fehlerhafte #include-Direktive C:\Users\Rashiid \Desktop\PWM TEST PIC18F4520\pwm.c:4:Fehler [1026] fehlerhafte #include-Direktive –
Sind Sie absolut sicher, dass Sie <und >Klammern um die Header-Dateien haben, die Sie haben #include?
Sie haben so recht, ich muss den Code, den ich hier eingefügt habe, in MPLAB kopiert haben, ich habe meinen eigenen Rat nicht befolgt !!! Wow, ich muss so dummmmmmmm erscheinen. Es tut mir so leid für meine Unbeholfenheit.

Antworten (1)

Ein paar Beobachtungen. Ich verwende dieses Datenblatt als Referenz.

Oszillatorauswahl

Ihr Problem scheint ein Konflikt zwischen dem Datenblatt und der Compiler-Dokumentation zu sein. Hier sehen wir die Liste der möglichen Oszillatortypen (Datenblatt Seite 23):

PIC 18F4520 Oszillatortypen

Gemäß dem PIC18 Configuration Settings Addendum werden die Optionen in der C18-Toolsuite jedoch anders benannt (Seite 131):

Geben Sie hier die Bildbeschreibung ein

Die Einstellung OSCauf INTIO7gibt eine Ausgabe von FOSC/4 (der Befehlsuhr) auf dem OSC2Pin ( RA6) aus. Dies ist möglicherweise nicht wünschenswert, für eine vollständig interne Uhr möchten Sie möglicherweise INTIO67stattdessen.

Oszillator-Setup

Sie müssen OSCCONwährend der Initialisierung eigentlich nichts ändern, wenn Sie eine 1-MHz-Ausgabe wünschen, da dies die Standardeinstellung ist. Dies können Sie dem Datenblatt (Seite 30) entnehmen:

Bit 6-4 IRCF2:IRCF0: Interne Oszillatorfrequenzauswahl-Bits

  • 100 = 1 MHz(3)

3 - Standardausgabefrequenz von INTOSC beim Zurücksetzen.

Außerdem sollten Sie warten, bis der interne Oszillator stabil ist, bevor Sie fortfahren. Sie können dies tun, indem Sie das IOFSBit von überwachen OSCCON. Ich bin mir nicht sicher, wie C18 dieses Register darstellt, aber so etwas wie das Folgende würde funktionieren:

// Wait for the internal oscillator to be stable
while(!(OSCCON & 0b100));

Beachten Sie, dass Sie auch beide verwenden können, die genau gleichwertig sind. Alle werden wahrscheinlich zu derselben Bittest-Anweisung kompiliert (z. B. btfss):

while(OSCCONbits.IOFS == 0);
while(!OSCCONbits.IOFS);

Fehlende Hauptschleife

Sie haben keine Hauptschleife, wie Roger in den Kommentaren bemerkt hat. Im Allgemeinen würden Sie Ihre Arbeit in einem Look wie folgt erledigen:

void main() {
    // Setup ports and internal features

    // Main program
    while(1) {
        // Do your work here, which repeats forever
    }

    // Execution will never reach here
}

Syntax einschließen

Ihre Kommentare deuten darauf hin, dass Sie diesen Fehler erhalten haben:

PIC18F4520\pwm.c:1:Error [1026] malformed #include directive

Dies liegt daran, dass Sie spitze Klammern um die #includeAnweisungen benötigen, etwa so:

#include <p18cxxx.h>

Werfen Sie einen Blick auf diese Stackoverflow-Frage , um eine ausführliche Erklärung zu erhalten, warum.

So lässt sich das IOFS-Bit besser prüfen: while (OSCCONbits.IOFS == 0) ;
Cheers, ich war mir nicht sicher, wie das in C18 funktioniert, aber so mache ich es in XC8. Noch ordentlicher ist !OSCCONbits.IOFS:)
Hallo, wo würde ich nach diesem Bit suchen wollen? vor meiner while(1)-Schleife, damit sie erst in die Hauptschleife geht, wenn sich der Oszillator stabilisiert hat?
Ja, das wäre ein guter Ort. Nachdem Sie Änderungen an der Oszillatorkonfiguration vorgenommen haben oder beim Start / Aufwachen aus dem Ruhezustand.
Außerdem habe ich keine Ahnung, wie ich meinen Oszillator konfigurieren soll, C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:6:Fehler [1225] Konfigurationswert 'INTIO1' nicht erkannt für Konfigurationseinstellung 'OSC' Dies ist die Fehlerantwort auf den Versuch, INTIO2 #pragma config OSC = INTIO2 zu verwenden
Laut diesem Dokument möchten Sie wahrscheinlich OSC = INTIO67. Verrückt.
es erfolgreich gebaut!!! Mir war dieses Dokument nie bekannt, aber jetzt werde ich es lesen, bevor ich hier irgendwelche Fragen stelle. Vielen Dank, dass Sie mir bisher geholfen haben. Es ist erstaunlich, wie schnell ihr alle geantwortet habt.
Es scheint, dass das Datenblatt und die Compiler-Dokumentation direkt in Konflikt stehen, was nicht hilfreich ist. Ich werde meine Antwort am Morgen aktualisieren.
Kein Problem, mein Servo hat gerade voll funktioniert, das war sehr fröhlich, einen halben Tag nicht verschwendet zu sehen !!!!
Wenn dies Ihre Frage beantwortet, sollten Sie sie als akzeptiert markieren.