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.
Kleine Ergänzung: Gibt es vielleicht wie beim C51 ein Makro? Also etwas was ähnlcih dem XBYTE ist?
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.
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.
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
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?
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.
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,
Im 8 Bit Demultiplex Mode habe ich doch aber nur 8 Datenleitungen. Wie will ich da ein 16 Bit Signal übertragen?
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 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.