Forum: Mikrocontroller und Digitale Elektronik Pin-Tooglefrequenz an PIC32MX


von S. G. (selles)


Lesenswert?

Hallo,

ich versuche gerade meinen PIC32MX795F512L auf 72MHz einzustellen. 
Externer Qwarz mit 20Mhz. Debugger ICD3.

Vorab:

1. wenn ich Inputdivider und Outputmultplier so einstelle, das 72MHz 
erzeugt werden sollten, kommt folgende Fehlermeldung:

ICD3Err0040: The target device is not ready for debugging.
Please check your configuration bit settings and program
the device before proceeding.

2. Mit folgenden Einstellungen funktioniert dann alles:

#pragma config POSCMOD=HS, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_5, FPLLMUL=MUL_18, FPLLODIV=DIV_4
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#pragma config FSOSCEN = OFF, IESO = OFF
#pragma config ICESEL = ICS_PGx1

(Rechnerisch: 18 MHz Systemtakt)

3. Ich habe dann eine PIN-Togglefrequenz von 203KHz.

Code:

void main (void)
{

TRISEbits.TRISE0 = 0;

  while(1)
  {
    LATEbits.LATE0 = 1;
    LATEbits.LATE0 = 0;
  }
}

So jetzt zu meinen Fragen:

1.) Wenn ich im Datenblatt lese, dass ich den PIC auf 72MHz (Systemtakt) 
takten kann, bedeutet dass nicht gleichzeitig, dass der Pin mit 72MHz 
(bzw. 36MHz) toggelt?

2.) Was mache ich falsch, dass ich nicht mal rechnerisch die 72MHz 
einstellen kann?

Vielen Dank im Voraus.


Selles
von Dirk W. (Gast)


Lesenswert?

Zumindest zu Punkt 1) kann ich Dir was sagen: Du wirst auf keinem 
Mikrocontroller dieser Welt ein Pin-Toggeling hinbekommen, das der 
halben Systemtaktfrequenz entspricht (PWM-Hardware mal ausgenommen). Das 
liegt daran, dass Du mindestens zwei Befehle brauchst: einen oder zwei 
für's Pin-Toggeling und einen Sprungbefehl. Und auf vielen 
Mikrocontrollern brauchen diese Befehle jeweils mehr als einen 
Systemtakt.
von S. G. (selles)


Lesenswert?

Vielen Dank, für die schnelle Antwort.

Doch die 203KHz sind für mich immer noch ein bisschen enttäuschend. Vor 
allem deswegen, weil ich mit dem selben Code auf dem PIC18f452 ein 
PIN-Toggling von 4,7 MHz hinbekomme.

An was könnte das liegen? Ich muss definitiv etwas falsch machen.

Gruß
von Steffen R. (stevven)


Lesenswert?

also bei den dsPIC's hab ich den Takt nicht über #pragma eingestellt, 
sondern über einen speziellen code. Das im pragma war nur dafür da, mit 
was der uC hochfahren soll. Und dann musste man die neue Clock source 
aktivieren/selektieren, PLL aktivieren, warten bis das so ist, etc....
Da gibts (zumindest für die dsPICs) Beispiele von Microchip
von Didi S. (kokisan2000)


Lesenswert?

Benutze den ICD3 mal als Programmierer und nicht als Debugger. Schaue in 
den Compiler Optionen nach, ob Du speziellen Code für den Debugger 
erzeugst. Wenn ja, dann abschalten. Lasse den Controller frei an den 
20MHz laufen, also ziehe den ICD3 ab.

Gruß
kokisan
von iaoffline (Gast)


Lesenswert?

Hab jetzt nicht nachgeschaut ob Pin ändern nur einen Systemtakt braucht, 
vermutlich sind es mehr. Nehmen wir mal an es sind zwei, dann läuft dein 
Pic evtl. mit 800-900 Khz. Entweder ist das jetzt der interne Takt oder 
er kriegt ständig nen Reset/Interrupt oder ne Kombination von beidem.
von Frank K. (fchk)


Lesenswert?

Ziehe Dir von Microchip das "PIC32 Oscillator Code Example" und schau 
nach, wie die das machen. Ich meine, ohne Run-Time-Konfiguration kommst 
Du nicht hin.

fchk
von usuru (Gast)


Lesenswert?

> Hab jetzt nicht nachgeschaut ob Pin ändern nur einen Systemtakt braucht,
> vermutlich sind es mehr.

bei den dsPICs sind es 2
von Dirk W. (Gast)


Lesenswert?

usuru schrieb:
> bei den dsPICs sind es 2

Eine nicht sehr hilfreiche Information, wo der OP doch einen PIC32MX mit 
völlig anderer Architektur verwendet...
von S. G. (selles)


Lesenswert?

Vielen Dank für die vielen Antworten. Ich werde mich an allem versuchen, 
was ihr so vermutet habt.

Ich melde mich wieder, wenn ich Ergebnisse habe.

Gruß
von S. G. (selles)


Lesenswert?

Neue Erkenntnisse:


#include <plib.h>

#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, 
FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_8
#pragma config ICESEL = ICS_PGx1

#define SYS_FREQ       (80000000L)

int main(void)
{

SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
OSCConfig( OSC_POSC, OSC_PLL_MULT_24, OSC_PLL_POST_4, OSC_FRC_POST_1 );

TRISEbits.TRISE0 = 0;

   while (1)
    {
      LATEbits.LATE0 = 1;
      LATEbits.LATE0 = 0;
    }
}

/***************************************************************/


Mit dieser Software (zusammengeschustert aus meiner und dem Example von 
Microchip) bekomm ich ne Pin-Toggle Frequenz von 4,56MHz hin. (ICD3 
abgehängt)

Deutlich mehr als zu Beginn.

Laut Disassembly Listing benötigt die while(1) Schleife 7 Schritte um 
einmal durch zulaufen.

Wie könnt ich jetzt noch überprüfen wie schnell der Systemtakt wirklich 
ist? Timer?

Auf die Einstellungen in den Configuration Bits vertraue ich nicht mehr.

Gruß
von iaoffline (Gast)


Lesenswert?

Silas Gschwender schrieb:
> Mit dieser Software (zusammengeschustert aus meiner und dem Example von
> Microchip)

dann druck dir das Datenblatt (den Oszillator Teil) und die Application 
Notes dazu aus, setzt dich vom PC weg und lies dir erstmal durch was du 
da machst.


> bekomm ich ne Pin-Toggle Frequenz von 4,56MHz hin.

Etwas Systematischer geht es vielleicht so:

- Sourcecode in Assembler anschauen
- die Takte zusammen zählen die dein Programm so braucht
- daraus die aktuelle Taktfrequenz errechnen.

Dann wirst du zum beispiel feststellen das deine While Schleife mehr 
Zeit braucht als das von allen Seiten mit Verdammnis behängte "GOTO". 
Das hängt aber aber u.a. vom compiler und der Optimierung ab.

In Mplab geht das mit dem Simulator sogar ohne lästiges Opcode 
nachschlagen.

>(ICD3  abgehängt)

Ja und?
von iaoffline (Gast)


Lesenswert?

Silas Gschwender schrieb:
> Laut Disassembly Listing benötigt die while(1) Schleife 7 Schritte um
> einmal durch zulaufen.

Das sind aber keine Takte.
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.