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
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.
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ß
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
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
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.
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
> Hab jetzt nicht nachgeschaut ob Pin ändern nur einen Systemtakt braucht, > vermutlich sind es mehr. bei den dsPICs sind es 2
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...
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ß
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ß
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.