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.
Ein paar Beobachtungen. Ich verwende dieses Datenblatt als Referenz.
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):
Gemäß dem PIC18 Configuration Settings Addendum werden die Optionen in der C18-Toolsuite jedoch anders benannt (Seite 131):
Die Einstellung OSC
auf INTIO7
gibt eine Ausgabe von FOSC/4 (der Befehlsuhr) auf dem OSC2
Pin ( RA6
) aus. Dies ist möglicherweise nicht wünschenswert, für eine vollständig interne Uhr möchten Sie möglicherweise INTIO67
stattdessen.
Sie müssen OSCCON
wä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 IOFS
Bit 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);
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
}
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 #include
Anweisungen benötigen, etwa so:
#include <p18cxxx.h>
Werfen Sie einen Blick auf diese Stackoverflow-Frage , um eine ausführliche Erklärung zu erhalten, warum.
!OSCCONbits.IOFS
:)OSC = INTIO67
. Verrückt.
Andi aka
Wladimir Cravero
Roger Rowland
David
Rashiid Scherif
Rashiid Scherif
David
<
und>
Klammern um die Header-Dateien haben, die Sie haben#include
?Rashiid Scherif