mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten in externen Speicher C167


Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Kann mir jemand sagen, wie ich Daten in meinen externen Speicher
bekomme. Ich benutze einen C167. An dem externen BUS soll ein AnyBus
Modul (Ethernet/IP) angeschlossen werden. Folgendes Problem habe ich
nun, vielleicht übersehe ich auch einiges:

-Das BUSCON und ADDRSEL Register habe ich eingestellt.
-Da über den Port0 auch das RAM geht, kann ich diesen nicht ständig als
Ausgang deklarieren, da dann das Programm nicht weiter laufen kann.
-Ich weiß nicht, wie ich den RD oder WR/WRL Pin des C167 ansteuern kann
(im Datenblatt steht dazu nichts, nur, daß es die beiden Pins gibt)
-Es ist klar, daß mein AnyBus Modul nicht weiß was es machen soll, wenn
ich ihm einfach nur ne Adresse über Port1 schicke und dann Daten aus
Port0 auslesen will, da es nicht weiß ob es lesen oder schreiben soll.

Ich hoffe, mir kann jemand helfen.
Vielen Dank schon jetzt.

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Ergänzung:
Gibt es vielleicht wie beim C51 ein Makro?
Also etwas was ähnlcih dem XBYTE ist?

Autor: Max Murks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Reset Konfiguration (Anzahl CS, Adressen, etc.) überprüfen
2. CS-Signal (CS1...CS4) aussuchen (Siehe Layou!!!)
3. ENTSPRECHENDES BUSCONX und ADDRSELX register kofigurieren
4. Entsprechenden Firmware Part RICHTIG mappen (liegt das Modul an der
richtigen Adresse?)

Wo liegt das Problem?

Um Port0, Port1 musst Du dich gar nicht kümmern.

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für die Antwort.

Es geht ja genau um Port0.
Die Datenleitungen gehen über Port0 an das AnyBus-Modul.
Über Port1 gehen die Adressleitungen. Port1 kann ich auch ohne Probleme
als Ausgang definieren und denen Daten zuweisen.
Port0 kann ich nicht als Ausgang definieren, da das RAM auch über Port0
läuft und somit dann das Programm nicht weiterlaufen kann.
Aber selbst das auslesen der Daten die an Port0 anliegen sollten, kann
ich nicht lesen.
Das Modul liegt an CS3 und ADDRSEL3 und BUSCON3 ist auch richtig
konfiguriert. Ich spreche auch den jeweiligen Adressbereich an, den ich
in ADDRSEL3 festgelegt habe und versuche dann zum Test die
Versionsnummer des AnyBus-Moduls auszulesen über die jeweilige Adresse.
Also Startadresse (die in ADDRSEL3 festgelegt wurde) + die Adresse des
Registers in dem die Versionsnummer liegt. Die Frage ist nun, woher
weiß der Bus Controller, daß er Daten auf die Adresse die ich ihm
übermittelt habe lesen und nicht schreiben soll und wie bekomme ich
diese Daten dann an Port0 zum lesen? Logisch wäre, wenn man den CS3
setzt und dann die Readleitung aktiviert, aber ich habe im Datenblatt
nirgends gelesen, wie ich die Readleitung setzen kann und auch sonst
nirgends.

Autor: Max Murks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal: Um Port0, Port1 musst Du dich gar nicht kümmern.

Wenn Du den externen Bus freigibst, dann gibt es keinen Port0 und
Port1, sondern nur Adressleitungen und Datenleitungen (je nach
MUX-Config).

Du sprichst das Modul wie ein RAM-Baustein an.

>Die Frage ist nun, woher
>weiß der Bus Controller, daß er Daten auf die Adresse die ich ihm
>übermittelt habe lesen und nicht schreiben soll:

Der Assembler MOV-Befehl weiß es!

Beispiel:


huge int   iAnyBusModul[16] _at(0x100000);


 ADDRSEL3 = 0x1000;         //Modul liegt bei 0x01 00 00
 BUSCON3  = 0x???? ;

 iMyVariable  = iAnyBusModul[10]; // Lesen
 iAnyBusModul = iMyVariable;      // Schreiben

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hilfe. Zumindest habe ich den EBC nun verstanden,
aber trotzdem noch eine Frage und zwar zum _at Befehl.

Die Speicheradresse müßte doch eigentlich eine 4-stellige
Hexadezimalzahl sein und nicht 6-stellig, oder?

Kleines Beispiel:
Ich lege meinen Bereich mit
ADDRSEL3 = 0x6008;
fest. Dann fängt der zugeordnete Speicher doch bei 6000 an oder?
Der Feldbustyp des Anybusmoduls liegt als Information auf dem Modul
vor, unter der Adresse 0x7CD. Also müßte doch eigentlich die
anzusprechende Adresse 0x67CD sein, oder stehe ich da mal wieder auf
der Leitung?

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ne, der Speicherbereich geht ja dann von 0x600000-0x6FFFFF.
Also müßte die anzusprechende Adresse dann 0x6007CD sein, oder sehe ich
das falsch?

_huge int Modulart _at(0x6007CD);

Ich habe es hiermit probiert. Im TaskingUser's Guide war noch der
Unterstrich vor dem huge. Allerdings bekomme ich folgende Fehlermeldung
dann:

79: _huge int Modulart _at(0x6007CD);
E 731: _at() this type of object must be word aligned

Wo liegt mein Gedankenfehler?
Vielen Dank schon jetzt für die Hilfe.

Autor: Mark de Jong (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Heike,

Der C167 ist eine 16-bitter, er kann int's nur an eine grade adresse
legen.

also adresse 0x6007CE oder 0x6007CC

Wie ist das modul anschlossen als 8-bitter oder 16-bit?

Grüße Mark,

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8-bit Demultiplex

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im 8 Bit Demultiplex Mode habe ich doch aber nur 8 Datenleitungen. Wie
will ich da ein 16 Bit Signal übertragen?

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist kein Problem. Der Bus wird auf 8-Bit konfiguriert und der C167
führt anstelle eines 16-Bit Zugriffs zwei mit 8-Bit durch.

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Fehlermeldung zu Fehlermeldung:
Folgende Deklaration habe ich nun vorgenommen:

short int Modulart _at(0x6007CC);

und folgender Fehlermeldung liefert mir diesmal der linker:

E 270: absolute segmented element 'section TASKS_2_FB class CFAR'
cannot be located

Allerdings habe ich keine Ahnung warum das nicht funktioniert.

Autor: Heiko Humpert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das Problem gelöst. Zwar nicht mit dem "_at" Befehl, weil
da anscheinend eine Speichermodell Probleme gemacht hat, aber ich
habe ein C-Makro gefunden, welches funktioniert. Nun noch eine kurze
und hoffentlich letzte Frage:

Folgendes Problem:
Die beiden Register 7FE und 7FF sind die beiden Wichtigsten zur
Konfiguration und Initialiersung des AnyBus-Moduls. 7FE ist R/W
(Read/Write), aber 7FF ist RO (Read only). Da ich ja nur wordweise
agieren kann, müßte ich aber versuchen auch 7FF zu beschreiben.
Ich habe es noch nicht ausprobiert, aber beschreibt der dann einfach
nur 7FE und lässt 7FF in Ruhe weil es ja RO ist?

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.