Forum: Mikrocontroller und Digitale Elektronik PIC Externer Takt, SFR richtig eingestellt ?


von Kevin N. (Gast)


Lesenswert?

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:
1
 
2
// FOSC
3
#pragma config POSCMD = XT              // Primary Oscillator Mode Select bits (XT Crystal Oscillator Mode)
4
#pragma config OSCIOFNC = OFF           // OSC2 Pin Function bit (OSC2 is clock output)
5
#pragma config IOL1WAY = ON             // Peripheral pin select configuration (Allow only one reconfiguration)
6
#pragma config FCKSM = CSDCMD           // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are disabled)
7
8
// FOSCSEL
9
#pragma config FNOSC = PRI              // Oscillator Source Selection (Primary Oscillator (XT, HS, EC))
10
#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.

von Peter C. (peter_c49)


Lesenswert?

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 ;-)

von quartett (Gast)


Lesenswert?

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 :
1
// max speed 40Mips
2
    CLKDIVbits.FRCDIV  =  0;  // 8Mhz -> 1:1 ->
3
    CLKDIVbits.PLLPRE  =  0;  // PLLPRE (N1) 0 == /2, => 8Mhz/2 => 4Mhz
4
    PLLFBD             = 38;  // pll multiplier (M)  80Mhz /N2 = 40Mhz -> 160Mhz/40Mhz => 40 , 40-2 = M = 38
5
    CLKDIVbits.PLLPOST =  0;  // PLLPOST (N2) 0== /2  , 160 = 80Mhz

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.

von PICianer (Gast)


Lesenswert?

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.

von Kevin N. (Gast)


Lesenswert?

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?

von Ump (Gast)


Lesenswert?

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:
1
#pragma config FNOSC = PRI              // Oscillator Select (Primary Oscillator (XT, HS, EC))
2
#pragma config POSCMOD = XT             // Primary Oscillator Configuration bits (XT oscillator mode selected)
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.

von Kevin N. (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kevin / quartett, einigt Euch, wie Ihr heißt.
1
Ebenso nicht erlaubt ist:
2
3
    ...
4
    Beteiligung an einer Diskussion unter verschiedenen Namen

https://www.mikrocontroller.net/user/conditions


Lass' das mit den verschiedenen Namen einfach sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.