Forum: Mikrocontroller und Digitale Elektronik ARM7 Datenleitungen von externem Chip ansteuern.


von Peter Pippinger (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Nix für ungut, aber besorg Dir erstmal ein einführendes Buch über 
Mikroprozessortechnik. Dir fehlen ja die elementarsten Grundlagen.

von A.K. (Gast)


Lesenswert?

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.

von Peter Pippinger (Gast)


Lesenswert?

> 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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

=> 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.

von Peter Pippinger (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.