Hallo an alle,
Ich möchte gerne an einen dsPIC33 einen Externen Takt anschließen. Dazu
habe ich in MPLAB das Tool "Set Configuration Bits" benutzt. Dabei kam
folgendes raus für den Oscillator:
#pragma config PWMLOCK = ON // PWM Lock Enable bit (Certain PWM registers may only be written after key sequence)
11
#pragma config IESO = OFF // Two-speed Oscillator Start-up Enable bit (Start up with user-selected oscillator source)
Reicht das schon um meinem Pic mitzuteilen, dass ein Systemtakt dran
hängt ?
Habe im Datenblatt und in der Suche nachgeschaut, bin da auf folgendes
gestoßen:
1
_FOSCSEL(FNOSC_PRI);
2
_FOSC(POSCMD_HS);
3
_FWDT(FWDTEN_OFF);
4
_FICD(JTAGEN_OFF);
Leider bekomme ich damit nur fehlermeldungen.
Was benötige ich, was NICHT ?
Vielen dank im Vorraus,
Kevin.
Hallo Kevin,
> _FOSC(POSCMD_HS)
das ist die alte (c30) config syntax, die ev noch bei einigen xc16
versionen funktioniert.
ich rate dir die docu des XC16 anzusehen, zb: hier bei linux:
/opt/microchip/xc16/v1.30/docs/config_index.html
dort findest du genaue beschreibung und hilfe.
hier starte ich mit dem FRC, falls der Quarz nicht anschwingt, bzw
externer takt tot ist.
// FOSCSEL
#pragma config FNOSC = FRC // Oscillator Mode (Internal
Fast RC (FRC))
#pragma config IESO = OFF // Two-speed Oscillator Start-Up
Enable (Start up with user-selected oscillator)
// FOSC
#pragma config POSCMD = XT // Primary Oscillator Source (XT
Oscillator Mode)
#pragma config OSCIOFNC = OFF // OSC2 Pin Function (OSC2 pin
has clock out function)
#pragma config FCKSM = CSECMD // Clock Switching and Monitor
(Clock switching is enabled, Fail-Safe Clock Monitor is disabled)
...
dann, im code, mache ich einen clock switch auf das externe Quarz.
// max speed 40Mips
CLKDIVbits.FRCDIV = 0; // 8Mhz -> 1:1 ->
CLKDIVbits.PLLPRE = 0; // PLLPRE (N1) 0 == /2, => 8Mhz/2 => 4Mhz
PLLFBD = 38; // pll multiplier (M) 80Mhz /N2 = 40Mhz
-> 160Mhz/40Mhz => 40 , 40-2 = M = 38
CLKDIVbits.PLLPOST = 0; // PLLPOST (N2) 0== /2 , 160 = 80Mhz
// clock switching
__builtin_write_OSCCONH(0x83);
__builtin_write_OSCCONL( OSCCON | 0x81);
while(!OSCCONbits.LOCK); // wait for PLL has settled
und kann somit einen ausfall in der while schleife behandeln.
ausserdem hast du ein fallback falls dein externers Quarz nicht
anschwingt bzw der externe takt fehlt.
ach, hier noch ein link :
http://microchipdeveloper.com/16bit:configuration-bits
mfG
Peter ;-)
Zuerst mal vielen Liebend Dank für deine Tolle Antwort!
Gut zu wissen wo ich nachschauen muss, sonst kann ich ja lange dran
sitzen wenn im Mplab Help ein veraltetes Beispiel angezeigt wird.
Mal zum Verstädnis:
Wenn ich sagen würde:
1
#pragma config FNOSC = PRI // Primärer externer Oscillator an Pin OSC1.
2
#pragma config POSCMD=EC // Externer Oscillator
Dann würde der uC sofort beim POR auf den externen Oszillator zugreifen.
( der externer Oszillator hat 8 Mhz.)
Damit wäre ich ja dann schon fertig ?
So jetzt zu deiner eleganteren Lösung:
Am Anfang sagst du mit FNOSC=FRC, dass der Interne (schnelle RC)
Oszillator benutzt wird.
Das würde ja auch mit IESO=ON funktionieren? (Start up device with FRC,
then switch to user-selected oscillator source)
Nun stellst du mit :
den PLL Regelkreis ein. Dabei ist der interne und der externe Oscillator
im Regelkreis.
Falls ich das richtig verstanden habe, da der PLLPOST am Ende des
Regelkreises sitzt, haben wir eine Ausgangsfrequenz von 80Mhz ?
1
// clock switching
2
__builtin_write_OSCCONH(0x83);
3
__builtin_write_OSCCONL(OSCCON|0x81);
Mit dem ersten Befehl gehst du das ganze "Entsperren" und mit dem
zweiten sagst du nun dass der externe Oscillator MIT PLL dran kommt ?!
Hm so ganz klar ist das noch nicht, stimmt meine erste Vermutung oben ?
Schöne Grüße
Kev.
Du hast MPLABX, richtig?
Probier mal das in der IDE:
Window->PIC memory view->Configuration bits
Da kannst du die bequem per drop-down Menü einstellen. Eine Beschreibung
dazu gibts auch, sonst kannst du die Daten auch aus dem Datenblatt
entnehmen.
Dann klickst du auf den Button "Generate Source Code to Output" und
kopierst das was dann erscheint in den betreffenden Header oder C-File.
Das hat den Vorteil, dass es einfach ist, und die Settings immer
kompatibel sind.
Kevin N. schrieb:> Hallo an alle,>> Ich möchte gerne an einen dsPIC33 einen Externen Takt anschließen. Dazu> habe ich in MPLAB das Tool "Set Configuration Bits" benutzt. Dabei kam> folgendes raus für den Oscillator:> ..
hallo PICianer,
Habe ich doch gemacht. Aber bin mir unsicher dass das alleine reicht,
sonst würde es doch die anderen Befehle nicht geben?
Um mit dem Externen Takt ohne PLL zu arbeiten, ist es normalerweise
ausreichend, die entsprechenden Configbits zu setzen.
Bei einem PIC24FV32KA204 ist das zum Beispiel:
Der PIC läuft dann auf dem externen Quarz hoch. Wird bei dir auch so
sein, das ist im Prinzip der gleiche Oszillator.
Mehr ist nicht nötig. Das sieht anders aus, wenn du Prescaler oder die
PLL verwenden möchtest. Auch da gilt aber eigentlich: Mehr als
Configbits setzen ist nur dann nötig, wenn man den Takt im Betrieb
umschalten will.
Zum Stromsparen zum Beispiel. Oder, wenn man wie oben gezeigt, bei einem
Ausfall des externen Quarzes auf FRC zurückwill. Hab ich so nie
verwendet ;-)
Mein Tipp wäre:
Schalte den Clockausgang ein, und schau dir die Sache mit dem
Oszilloskop an. Dann kannst du in Ruhe verschiedene Clockmodi
ausprobieren.
Schau dir das Blockschaltbild des Oszillators im Datenblatt an. Das ist
ziemlich gut als Überblick.
Hallo Ump,
Vielen vielen dank für deine Antwort. Jetzt bin ich zumindest beruhigt,
dass Ich den controller damit nicht ausversehen sperren könnte oder so.
Allerdings müsste für den Externen Oscillator, das config POSCMD auf
"EC"(external Clock) stehen.
Ich werde die Tage dann mal mit dem Oszi die verschiedenen Modi
ausprobieren.
Liebend Dank
Schönes WE,
Kevin