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
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
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; }
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
Ü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.
@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
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.
Vlielen Dank für Eure Tips, so laaangsam lernt man die Haken und Ösen des LPC2138 kennen! Gruß Fried
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.