www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC 2138 ARM Taktung


Autor: Fried Vissel (tich)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich betreibe ein Olimex Board mit 14,7456 Mhz und PLL *4 Einstellung.
Folgendes Programm:
while(1) {
    IO0CLR|=IO_LED_Y; //Yellow LED on  (P0.12)
    IO0SET|=IO_LED_Y; //Yellow LED off
    }
erzeugt ein Rechtecksignal von ca. 1 Mhz. Müsste das nicht erheblich 
schneller sein?
In dem CrossStudio von Rowley muss für den Olimex Tiny der JTAG Clock 
Divider auf 2 oder höher stehen, sonst tut sich nix, ist das so richtig? 
Habe bisher leider keine Doku dazu gefunden.
Gruß Fried

Autor: Fried Vissel (tich)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag, zugehöriger .h file Auszug:

#define REG(x) (*((volatile unsigned int *)(x)))
#define IO0DIR      REG(0xE0028008)  // I/O direction control
#define IO0CLR      REG(0xE002800C)  // output clear
#define IO0SET      REG(0xE0028004)  // output set

#define IO_LED_Y    (1<<12)
#define IO_LED_G    (1<<13)

Thx, Fried

Autor: Kai F. (k-ozz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für dein LPC2138 ist denn da drauf? LPC2138FBD64 oder 
LPC2138FBD64/01 ?
Ansprechen tust du die Pins zumindest im langsamen Modus. Damit sind bei 
60Mhz max. etwa 4Mhz möglich. Die schnellen IOs des LPC2138FBD64/01 
können das etwa 3.5x schneller.

Ein Grund, dass du nur etwa 1MHz erreichst liegt darin, dass du die 
Register falsch anspricht! Die IOxCLR bzw. IOxSET Register sollten nur 
geschrieben werden, da sie selbst rückstellend sind, d.h. wenn du deinen 
Code durch den nachfolgenden ersetzt solltest du die volle 
Geschwindigkeit erreichen:

while(1)
{
    IO0CLR = IO_LED_Y;
    IO0SET = IO_LED_Y;
}

Autor: Fried Vissel (tich)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,
das war wohl einer der  Gründe, mit der Code Änderung sind es jetzt beim
LPC2138FBD64/01 ca. 2.5 Mhz. Mal sehen, was man da noch einstellen muss 
um die volle Speed zu erreichen.
Wenn man vom AVR und anderen 8 Bittern kommt ist der ARM an Anfang doch 
recht gewöhnungsbedürftig!
Thx, Fried

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Über den IOxxx Adressen der LPC2000 Ports sind keine Rennen zu gewinnen, 
das ist allgemein bekannt. Die hängen an einem vergleichweise langsamen 
Sekundärbus.

Wenn man es eilig hat, sollte man die Fast-IO verwenden. Wenn das Device 
die schon hat.

Autor: Robert Teufel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fried,

das Stichwort Fast I/O ist schon mehrfach genannt worden. Wenn I/O ueber 
die traditionelle Art gemacht wird, dann sind da mehrere Teiler drin zur 
Synchronisation des Peripheral Busses.
Fast I/O haengt am sogenannten Local Bus und hat keine Teiler, kann also 
deutlich schneller laufen.
Beim urspruenglichen Design der ARM Prozessoren wurde nicht in Betracht 
gezogen, dass sie eines Tages zur schnellen Bitmanipulation hergenommen 
wuerden, in den Telefonen der 90er Jahre war das nicht so notwendig. Das 
Anwendungsgebiet hat sich geaendert, die Preise fuer die Chips auch.
p.s. Du brauchst keinen 14.756 MHz Takt falls eigentlich ein "gerader 
Takt" besser waere. Es kann also ein 12 MHz Quartz genommen werden. Der 
213x/01 hat einen Fractional Baudrate Generator (im original 213x ist 
der noch nicht drin), d.h. es wird eine sehr genaue Baudrate auch dann 
erreicht, wenn der Takt kein vielfaches von 115200 ist.

Gruss, Robert Teufel

Autor: Kai F. (k-ozz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du den LPC2138FBD64/01 hast kannst du auch die Fast-IOs (FIO) nutzen.
Für FIOs mußt du gleich am Programmanfang folgende Zeile einfügen:

SCS = 0x00000003;

Danach DARFST du aber nicht mehr auf die normalen IOxxx-Register 
zugreifen, sondern nurnoch auf die FIOxxx. Für jedes IOxxx-Register gibt 
es ein FIOxxx Pendant und noch ein paar weitere, die einem das Leben 
leichter machen. Dann solltest du den 3.5 fachen Wert erreichen. Für 
maximale Geschwindigkeit sind vermutlich ein paar Zeilen Assembler 
notwendig.

Der von Robert erwähnte Fractional Baudrate Generator ist auch eine 
feine Sache und funktioniert bestens. Auf der Seite von NXP existiert 
auch eine Excel-Datei, die die Berechnung der Werte für das 
UxFDR-Register erleichtert.

Eine weitere, sehr nützliche Neuerung sind auch die erweiterten Register 
der A/D-Wandler, die die CPU-Auslastung drastisch reduzieren können.

Autor: Fried Vissel (tich)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlielen Dank für Eure Tips,
so laaangsam lernt man die Haken und Ösen
des LPC2138 kennen!
Gruß Fried

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.