Forum: Mikrocontroller und Digitale Elektronik Daten in externen Speicher C167


von Heiko Humpert (Gast)


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.

von Heiko Humpert (Gast)


Lesenswert?

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

von Max Murks (Gast)


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.

von Heiko Humpert (Gast)


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.

von Max Murks (Gast)


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

von Heiko Humpert (Gast)


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?

von Heiko Humpert (Gast)


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.

von Mark de Jong (Gast)


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,

von Heiko Humpert (Gast)


Lesenswert?

8-bit Demultiplex

von Heiko Humpert (Gast)


Lesenswert?

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

von Torsten (Gast)


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.

von Heiko Humpert (Gast)


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.

von Heiko Humpert (Gast)


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?

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.