Hallo, wenn ich ein 100Mhz getakteten LPC1768 nehme und ein Port Pin ein und aus schalte, welch eine Frequenz erzeuge ich damit?
Gast
#2186799
Hängt davon ab, wie schnell Du ihn ein- und ausschaltest.
Hallo FredFerkel, Natürlich nur mit 0Hz.
Ich möchte gerne wissen, wie schnell ein Port Pin maximal sein kann.
Warum?
Gast
#2186850
Wer will das wissen?
Gast
#2186852
Ich hol dann mal das Popcorn raus...
Gast
#2186858
@: Siegfried Schrader Wie wäre es mit einem Blick ins Datenblatt? Ich hab nicht nachgesehen, aber ich wette da gibts was von wegen "rise time bzw. "fall time" - das sollte deine Frage beantworten. Gruß Rainer
1 | |
2 | |
3 | |
4 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Dauert 15 Takte, was 6,67MHz bei einem 100MHz Takt ergibt. Kommt mir gerade etwas träge vor aber das zeigt mir das Scope an. CCLK = PCLK = 100MHZ. Ist ein LPC1766.
@Rainer: Ich schaetze mit Rise Time / Fall Time wird man
dies nicht beantworten koennen, da die CPU die Pins nur langsamer
schalten kann, als die GPIO Pins ihre Zustaende wechseln.
@Michael: Danke fuer die konstruktive Antwort !
Kannst Du noch folgende 3 Versuche ausprobieren:
(vielleicht wird man noch etwas schneller,
wenn man die (1 << 21) vor der Schleife in eine Variable packt ???)
while(1) {
/* 2 x toggeln */
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
}
while(1) {
/* 3 x toggeln */
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
}
while(1) {
/* 100 x toggeln (aber nicht mit for-next-Schleife !) */
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
(LPC_GPIO1->FIOSET) = (1<<(21));
(LPC_GPIO1->FIOCLR) = (1<<(21));
....einfach 100 x kopieren...
}
Ich habe sowas mal mit dem alten LPC2106 o.ae. gemacht,
da konnte man (soweit ich mich erinnern kann) durch "entrollen"
der Schleife einen hoeheren Takt erzielen.
Danke !
Gast
#2186926
Hallo, von NXP gibt es ein Forum, wo sich viele leute mit solchen Fragen zu den LPC17xx etc. beschäftigen . Wenn ich es nicht ganz falsch verstanden habe, gibt es 2 unterschiedliche Methoden den Port zu setzten. Die herkömmliche Methode habt ihr oben beschrieben, damit es schneller geht, gibt es aber noch einen anderen Weg. Damit war es möglich den Pin in 6 Takten zu setzen (meine mich so zu entsinnen). Wie genau man dafür vorgeht, kann ich nicht sagen. Schau mal im NXP Forum nach, da wirst du deine Antwort finden, du must nur der englischen Sprache mächtg sein. Gruß Carsten
Martin Maurer schrieb: > while(1) { > /* 2 x toggeln */ > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > } 10MHz > while(1) { > /* 3 x toggeln */ > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > } 12MHz > while(1) { > /* 100 x toggeln (aber nicht mit for-next-Schleife !) */ > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > (LPC_GPIO1->FIOSET) = (1<<(21)); > (LPC_GPIO1->FIOCLR) = (1<<(21)); > ....einfach 100 x kopieren... > } 20MHz Der Wert für die FIO Register steht schon in R3. Wüsste nicht wie man das weiter optimieren könnte. Das die Frequenz doch recht stark ansteigt könnte vielleicht mit dem Cache zusammenhängen. Könnte ich ausprobieren indem ich den Takt runterfahre und die Zugriffszeiten für das Flash auf 1 Takt umstelle. Aber nicht jetzt. Die Pulsebreite verringert sich jedenfalls von 50ns auf 20ns.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.