Hallo NG, jetzt hab ich nochmal ne Frage: ich habe gelernt, dass ich Pins über eine bestimmte Adresse (FFFFF434) auf High setzen kann. Und über eine andere Adresse (FFFFF430) wieder auf Low setze. Wie löst man dann eine Parallele Datenübertragung (z.B. das Setzen einer Adresse auf einem externen Chip). nehmen wir an, an den Adressleitungen sollen nacheinander die folgenden Werte "angelegt" werden: 1.) 11110001b 2.) 00001001b Muss ich dann vor dem Setzen des zweiten Wertes erst mal alle Pins auf Low setzen? Wohl eher nicht, sonst würde ja als zwischenschritt 00000000b anliegen, oder? So wie ich das sehe, brauche ich doch dann immer 2 Schritte, um den Zustand zu wechseln... Wie macht man das? Vielen Dank für jeden Hinweis! MfG Peter
Nix für ungut, aber besorg Dir erstmal ein einführendes Buch über Mikroprozessortechnik. Dir fehlen ja die elementarsten Grundlagen.
Lass gut sein, er hat u.U. recht. Es gibt Controller auf ARM7-Basis, die aus dem beschriebenen Grund tatsächlich nicht in der Lage sind, ein beliebiges Pattern in einem Rutsch auf die Pins zu bringen. Er hat nur freundlicherweise unterlassen, den Typ zu nennen, so dass ihn weiter nicht zu helfen ist.
> Nix für ungut, aber besorg Dir erstmal ein einführendes Buch über > Mikroprozessortechnik. Dir fehlen ja die elementarsten Grundlagen. Naja, ich habe schon in verschiedenen anderen Themen geschrieben, dass es ein Hobby von mir ist, mit dem ich gerade anfange. Wenn ich dann hier und da mal eine unqualifizierende Frage von Stapel lasse, bitte ich recht herzlich um Entschuldigung. Ich mache das nicht beruflich. Habe aber Spaß an der Freude. Mir ist es einfach nicht klar, wie ich die Pins in einem Rutsch so schalten kann, wie ich es brauch... > Lass gut sein, er hat u.U. recht. Es gibt Controller auf ARM7-Basis, die > aus dem beschriebenen Grund tatsächlich nicht in der Lage sind, ein > beliebiges Pattern in einem Rutsch auf die Pins zu bringen. Er hat nur > freundlicherweise unterlassen, den Typ zu nennen, so dass ihn weiter > nicht zu helfen ist. Sorry, hab hier schon so viele Fragen gestellt, dass vergessen habe, den Typ anzugeben. Es ist ein Atmel AT91SAM7S256
Wenn es sich bei den beschriebenen Pins um die Adressleitungen des externen Speicherinterfaces handelt, dann kannst Du die im Grunde genommen gar nicht auf irgendwelche definierten Bitmuster schalten, sondern diese nur kurzzeitig im Rahmen eines Zugriffes auf externen Speicher ausgeben lassen. Dazu solltest Du Dir mal die Timingdiagramme des externen Speicherinterfaces näher ansehen, die im Datenblatt/User's Manual des µCs zu finden sind. In einem festgelegten zeitlichen Raster geschieht in etwa folgendes: Der µC legt das gewünschte Adressmuster an die Adressleitungen an. Bei Schreibzugriffen legt der µC das gewünschte Datenmuster an die Datenleitungen an. Der µC aktiviert diverse Steuerleitungen, anhand derer externe Peripherie erkennen kann, daß das Adressmuster gültig ist Bei einem Lesezugriff wird nun der Zustand der Datenleitungen eingelesen. Der µC deaktiviert die Steuerleitungen wieder und ist nun bereit, einen weiteren Speicherzugriff durchzuführen. Zu den Steuerleitungen gehören unter anderem Signale, die die Richtung des Datenzugriffes definieren, also ob es sich um einen Lese- oder Schreibzugriff handelt. Programmiertechnisch ist so ein Speicherzugriff nicht von einem Speicherzugriff auf internen Speicher zu unterscheiden, bis auf die verwendeten Adressen. Diese Vorgehensweise ist bei allen µCs mit externem Speicherinterface gleich; manche µCs (wie die AVRs) verwenden einen gemultiplexten Adress- und Datenbus und verwenden die gleichen Leitungen sowohl für die Ausgabe von Adressen als auch die Ausgabe und das Einlesen von Daten. Die Umschaltung zwischen diesen beiden Varianten erfolgt mit einem vom µC erzeugtem Steuersignal, mit dem i.d.R. ein Latch angesteuert wird, das Adress- und Datenbus so demultiplext. Das erfordert einen zusätzlichen Schritt im weiter vorne beschrieben Ablauf. Näheres hierzu ist dem im AVR-Datenblatt/User's Guide zu findenden Timingdiagramm zu entnehmen.
=> Manual not read error. 15.4.5, da steht ausdrücklich drin wie es geht (ODSR). Nicht möglich ist es beispielsweise mit einigen älteren LPC2000 Modellen.
Hallo NG, so, jetzt habe ichs glaube ich gefunden, das mit dem Schalten von mehreren Pins gleichzeitig. Kann mal jemand über den Code schauen, ob mans so machen kann, oder ob es totaler Mist ist (abgesehen von der fehlenden Initialisierung :-) Danke! Peter NAME main PUBLIC main COMMON INTVEC:CODE CODE32 B main RSEG ICODE:CODE CODE32 main: NOP // Watchdog ausschalten // ------------------------------------------------------------ ldr r0, =0xFFFFFD44 ldr r1, =0x8000 str r1, [r0] // ------------------------------------------------------------ // Basisadresse setzen // ------------------------------------------------------------ ldr r0, =0xFFFFF400 // ------------------------------------------------------------ // PIO-control fuer Pin 17 + 18 setzen // ------------------------------------------------------------ ldr r1, =1100000000000000000b str r1, [r0,#0x0] // ------------------------------------------------------------ // Ausgabe fuer Pin 17 + 18 setzen // ------------------------------------------------------------ ldr r1, =1100000000000000000b str r1, [r0,#0x10] // ------------------------------------------------------------ // direktes schreiben auf Register (Pin 17 + 18) zulassen // ------------------------------------------------------------ ldr r1, =1100000000000000000b str r1, [r0,#0xa0] // ------------------------------------------------------------ schleife1: // LED 18 an / 17 aus // ------------------------------------------------------------ ldr r1, =1000000000000000000b str r1, [r0,#0x38] // ------------------------------------------------------------ ldr r8, =0x1000000 warte1: subs r8,r8,#1 bne warte1 // LED 18 aus / 17 an // ------------------------------------------------------------ ldr r1, =0100000000000000000b str r1, [r0,#0x38] // ------------------------------------------------------------ ldr r8, =0x1000000 warte2: subs r8,r8,#1 bne warte2 B schleife1 END main
Solange du den Code so unlesbar gestaltest, wie mit Assembler grad noch möglich, ist eher unwahrscheinlich dass sich jemand der Binär/Hex-Origie anschliesst und eifrig Nullen zählt. Tip: Symbole für Steuerregister und -bits benutzen, nicht direkt in Hex und Binärformat reinschreiben.
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.