Forum: Mikrocontroller und Digitale Elektronik M16C ports Konfiguration


von Dennis (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Dennis (Gast)


Lesenswert?

@ 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

von crazy horse (Gast)


Lesenswert?

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.

von Dennis (Gast)


Lesenswert?

@crazy horse (Gast)
Heisst das, dass ich ich für Ports 0 und 1 keine Direction Konfiguration 
brauche?
LG
Dennis

von crazy horse (Gast)


Lesenswert?

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
}

von Judge (Gast)


Lesenswert?

>> 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

von Dennis (Gast)


Lesenswert?

@ 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

von crazy horse (Gast)


Lesenswert?

Was genau willst du denn nun eigentlich machen??

von Gast (Gast)


Lesenswert?

@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

von Gast (Gast)


Lesenswert?

Meinst du mit DPRAM Dual Port?

von Dennis (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Dennis (Gast)


Lesenswert?

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

von Obelix (Gast)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

@  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

von crazy horse (Gast)


Lesenswert?

ich klinke mich hier mal aus. Da fehlen zuviele Grundlagen und vor allem 
Input.

von Obelix (Gast)


Lesenswert?

> 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?

von Dennis (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.