Hallo, Die Ports 0 und 1 bilden zusammen 16 Bit Data. So wie ich das verstanden habe, soll ich am anfang die Ports enweder als Ausgänge oder als Eingänge konfigurieren (port direction register), aber nicht I/O 's. Da ich in meinem Program Daten austausch ausführen möchte, sollte ich wenn es so ist während mein Program die konfiguration neu erstellen. Ist sowas erlaubt? uns wie kann ich port0 und port1 als ein 16 Bit Port einstellen? Vielen Dank im Voraus. LG Dennis
@ Dennis (Gast) >Die Ports 0 und 1 bilden zusammen 16 Bit Data. Hmm. >So wie ich das verstanden habe, soll ich am anfang die Ports enweder als >Ausgänge oder als Eingänge konfigurieren (port direction register), aber >nicht I/O 's. ??? >Da ich in meinem Program Daten austausch ausführen möchte, sollte ich >wenn es so ist während mein Program die konfiguration neu erstellen. >Ist sowas erlaubt? Ja. Aber man muss aufpassen. Einige Ports sind mit einem Schutz versehen (Protection Register). > uns wie kann ich port0 und port1 als ein 16 Bit Port >einstellen? Gar nicht, man muss immer einzelnen 8-Bit Zugriffe auf die einzelenen Ports machen. MFG Falk
@ Falk In meiner Aufgabe ist der M16 mit einem DPRAM verbunden. Als erster Schritt sollte ich den DPRAM mit Daten initialisiren (port0 und port1 als outputs konfiguriert). Als 2te Schritt der M16 sollte der inhalt vom DPRAM lesen um festzustellen, ob ein anderes Prozess an bestimmte Zellen der DPRAM Inhalt geändert hat. (port0 und port1 als inputs konfiguriert). wie soll vorgehen? wenn es um Die Ports Konfiguration geht. LG Dennis
Oh, der Herr aller MCs schon wieder... Beim M16C bilden P0 und P1 schon einen 16bit-Datenbus, wenn das externe Speicherinterface freigegeben ist. Dann braucht man sich aber über die Richtung nicht mehr kümmern. Wird geschrieben (/WR=L) sind es Ausgänge, beim Lesen (/RD=L) sind es Eingänge. Macht aber alles die Buslogik.
@crazy horse (Gast) Heisst das, dass ich ich für Ports 0 und 1 keine Direction Konfiguration brauche? LG Dennis
wenn du externen Speicher dran hast nein. void far SetExMem(){ prcr = 0x02; //Protection aus pm0 = 0x81; //Memory Expansion Mode RD WR BCKL ein prcr = 0x00; //Protection pur1 = 0x02; //Pull-Up für CS-Leitungen csr = 0x0F; //Alle CS einschalten }
>> uns wie kann ich port0 und port1 als ein 16 Bit Port >>einstellen? >Gar nicht, man muss immer einzelnen 8-Bit Zugriffe auf die einzelenen >Ports machen. Irrtum, die SFR-Register einiger Ports des M16C liegen direkt hintereinander. D.h., dass z.B. mit einem 16-bit Zugriff auf die Adresse von P0 direkt beide Port-Register (P0 & P1) gesetzt werden können. Gruß Judge
@ Judge (Gast) Nehmen wir an, dass ich 0xFF(data) zu der Adresse 0x01 schreiben möchte. Soll ich so vorgehen: p0 = 0xF; p1 = 0xF; p2 = 0x0; p3 = 0x1; oder gibt es eine zweite Schreibweise, die die 2 Ports kombiniert? LG Dennis
@Dennis Vergiss die Ports! Du schreibst einfach mit einem Befehl an Adresse 1 deine 0xff und fertig. kein p0 = sonstwas. Du darfst bei deiner Aufgabenstellung nicht auf die Ports 0 & 1 zugreifen. Siehe ins Datenblatt -> extern Memory
Hallo, Ja DPRAM ist Dual Port RAM. "Vergiss die Ports! Du schreibst einfach mit einem Befehl an Adresse 1 deine 0xff und fertig." Ja aber mit welchem Befehl? LG Dennis
Kann es sein, dass du dich noch gar nicht mit dem MC beschäftigt hast? Erst mal musst du dir im klaren sein, in welchem Mode du den M16C überhaupt betreiben willst. Ich nehme mal an, du brauchst den memory expansion mode (Programm im internen Flash, Datenbereich intern+extern). Weiterhin musst du entscheiden, ob du im 1M oder 4Mbyte-Mode arbeiten willst. Daraus ergebt sich die physikalische Zuordnung von CS-Signalen und Adressen. Ausserdem musst du festlegen, ob du mit 8 oder 16bit-Datenbus arbeiten willst, Mulltiplex (ALE) oder nicht usw. Den grössten Bereich bekommst mit 640kB mit /CS0. Und dieser beginnt bei 0x30000. Und nun kannst du Variablen anlegen: far long Test[3600]; far mappt die Variable in den externen Speicherbereich. Und wenn du nun schreibst: Test[0]=65652; Diese Variable wird beginnend bei Adresse 0 des externen Speichers geschrieben, der durch CS0 selektiert wird. Für den Prozessor ist es Adresse 0x30000 und folgende. Ohne ein Studium des Datenblatts wirst du eher nicht zum Erfolg kommen.
@ Dennis (Gast) >"Vergiss die Ports! Du schreibst einfach mit einem Befehl an Adresse 1 >deine 0xff und fertig." >Ja aber mit welchem Befehl?
1 | uint16_t *my_pointer; |
2 | uint16_t my_data; |
3 | |
4 | my_pointer = (uint16_t*) 0x01; // Adresszuweisung |
5 | *my_pointer = my_data; // Wertzuweisung |
MFG Falk
Vielen Dank für euren Antworten, Jetzt verstehe ich wie das läuft, jeder externe Speicher hat eine Speicher Abbildung in der M16 drin, und die CS Signale fonktionnieren wie ein Router für bestimmte Peripherie. Noch eine letzte Frage: Mit einem Read Befehl ,wird zuerst die Peripherie mit CS selektiert , dannach wird data in einer bestimmte Speicherzelle gespeichert. Nehmen wir an ,ich hab von der Adr.5 vom Externen Speicher gelesen , wird data im M16 in der Adr OFFSET + 5 gespeichert? LG Dennis
> Nehmen wir an ,ich hab von der Adr.5 vom Externen Speicher gelesen , > wird data im M16 in der Adr OFFSET + 5 gespeichert? im M16C wird dabei garnichts gespeichert. Beim Schreiben in eine externen Speicherzelle legt der M16C automatisch die entsprechenden Pegel für die Adresse aud die Adressleitungen, die Pegel für die Daten automatisch auf die Datenleitungen und die Pegel für /WE,/RD,/ALE,/CS usw. > In meiner Aufgabe ist der M16 mit einem DPRAM verbunden. Von wem hast du die Aufgabe bekommen. Sicher das du einen DualPort RAM brauchst? Du solltest dir evtl. mal Assembler anschauen, da wird das mit dem Schreiben und Lesen von Daten an bestimmte Speicherstellen deutlicher. Außerdem lernt man dabei mehr über die Speicherzugriffsmöglichkeiten, deirekt, indirekt usw.
@ Obelix (Gast) Vielen Dank für die Antwort! Wenn du mir sagst, dass im M16 dabei garnichts gespeichert wird. Mit einem Read Befehl Wo kann ich die Daten , die vom DPRAM zurück geschickt sind ,finden damit ich sie bearbeiten kann? LG Dennis
ich klinke mich hier mal aus. Da fehlen zuviele Grundlagen und vor allem Input.
> Mit einem Read Befehl Wo kann ich die Daten , die vom DPRAM zurück
geschickt sind ,finden damit ich sie bearbeiten kann?
Natürlich wird beim Lesen der gelesene Wert dort gespeicht wo du dem MC
sagst das er es speichern soll (andere Speicherstelle oder Register (in
C eine Variable)).
Ich kann hier aber kein 500 Seitiges Buch schreiben, wo das alles
genaustens beschrieben ist. Solch ein Buch findest du aber bestimmt in
der Bibliothek.
Nochmal sicher das es um Dual Port RAM geht?
Hallo, ich hab diese Funktion Programmiert, sie initialisiert den M16C62P damit Daten mit einem RAM ausgetauscht werden können. Die konfiguration ist so: 12 bit Adressbus 16 bit Databus cs3 ist ausgewählt wait state aktiv read / write kommandos über WRH, WRH und RD Als ich das getestet habe, funktionniert das nicht, cs3 ,wrh, wrl, und rd Leitungen sind tot sie reagieren nicht. kann mir bitte jemanden sagen, ob ich etwas wichtiges vergessen oder falsch konfigureiert habe. Vielen Dank im Voraus LG Dennis void init_hw(void) { /*Protection OFF*/ prc1 = 1; // Write to PMx enable /*Memory Expansion Mode*/ pm00 = 1; pm01 = 0; /*Separate Daten und Bus Leitungen*/ pm04 = 0; pm05 = 0; /*Memory Space expansion Funktion*/ pm14 = 0; // 1MB pm15 = 0; // 1MB /*Databus*/ // BYTE = 'L' // Databus = 16bit /*Adressbus*/ pm06 = 1; // Adressbus = 12bit pm11 = 1; // Adressbus = 12bit /*BCLK is Output*/ pm07 = 0; /*Software Reset Bit*/ pm04 = 0; /*Watchdog Timer*/ pm12 = 0; // No effect /*Internal Reserved Area*/ pm13 = 0; // From 0x04000 To 0x07FFF /*Wait Bit*/ pm17 = 1; // with wait state /*/RD/WRL/WRH*/ pm02 =1; /*Protection ON*/ prc1 = 0; // Write to PMx disable /*chip select register*/ csr = 0x08; // cs3 is enable cse = 0x80; // 3 wait state for /cs3 pur1 = 0x06;//Pull-Up (H) für CS-Leitungen und /WRL, /WRH, /RD return; }
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.