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.
>> 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.
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
> 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;
}