Ports beim 8051

Gast #2662716
Lesenswert?

Hallo zusammen!

Wir gehn gerade die Ports des 8051 durch, laut angehängten Bild gibt es 
4, aber wo sind die Ports? Im 8051-IC? Wo genau?

Was haben diese für einen Sinn?

Wir haben Übungen dazu gemacht z.B. ein Rechtecksignal darzustellen:

SQUAREWAVE:
MOV R2,#0
loop:CPL P1.3
DJNZ R2,loop
RET

Wo sehe ich das das Rechtecksignal? Was hat das mit einem Port zu tun?

Viele Anfänger fragen, aber ich hab schon das Internet durchforstet, 
aber für mich nichts verständliches gefunden.

Danke schonmal im voraus!

mfg

Mr Gast
Angehängte Dateien:
Gast #2662852
Lesenswert?

Danke! Jetzt verstehe ich schon ein bisschen mehr was so ein Port kann, 
aber für was ist er gut?

Wo ist den auf dem Bild P1.3? Ich schätze mal Port 1 und pin 3? Aber wo 
ist der?

Und den oben geposteten Code verstehe ich noch immer nicht.

CPL P1.3 --> komplementiert das Bit(0 oder 1). D.h. 0 wird zu 1 und 1 
wird zu 0 richtig?

DJNZ R2,loop --> dekrementiert R2 um 1 und springt wenn R2 nicht 0 ist.

R2 ist aber immer 0, d.h. die Schleife wird nur einmal durchgegangen, 
was hat das für einen Sinn?

Und was steht in P1.3 drinnen?
Gast #2662896
Lesenswert?

Mr Gast schrieb:
> R2 ist aber immer 0, d.h. die Schleife wird nur einmal durchgegangen,
> was hat das für einen Sinn?

Achso ne, was rede ich da...^^.

R2 ist nicht 0, sondern wird immer um 1 dekrementiert, d.h. die Schleife 
wird viel viel öfter durchgelaufen.

Wie weit sinkt den R2 ab? Wann kommt es den zu einen Überlauf?
#2662927
Lesenswert?

Mr Gast schrieb:
> Wo ist den auf dem Bild P1.3? Ich schätze mal Port 1 und pin 3? Aber wo
> ist der?

Auf dem Bild steht die Schaltung eines Bits von Port 3; es gibt davon 8 
Stck., daher auch P3.X mit X=0...7

> CPL P1.3 --> komplementiert das Bit(0 oder 1). D.h. 0 wird zu 1 und 1
> wird zu 0 richtig?

Ja.

> Und was steht in P1.3 drinnen?

Nach Reset steht irgendwas drin (müsste man im Datenblatt nachschauen), 
und das wird bei jedem Durchlauf invertiert.

Zu R2: 8-Bit-Register, Wertebereich 0...255. Beim inkrementieren kommt 
nach 255 wieder 0 (Überlauf), beim dekrementieren umgekehrt 
("Unterlauf").

Gruß Dietrich
Gast #2663152
Lesenswert?

Ok danke!

Ich hab hier 2 andere Programme:

Übung 1(WRITE_DD):
P1.4-P1.7

WRITE_DD:
ANL a,#0xF
SWAP A
ANL P1
ORL P1,A
RET

Was ist hier überhaupt die Aufgabenstellung, also was soll man hier 
erreichen? Und was macht dieses Programm?

Übung 2(Wait4Edge(4Low)):

WAIT4EDGE:
JB P1.0,$
JNB P1.0,$ ;jump if bit is not set
RET

WAIT4LOW:
JB P1.0,$ ;jump if bit is set
RET

Was können die Dollar-Zeichen hier? --> JMP $ ist ja eine 
Endlosschleifen, aber hier?
#2663237
Lesenswert?

Mr Gast schrieb:
> Übung 2(Wait4Edge(4Low)):
>
> WAIT4EDGE:
> JB P1.0,$
> JNB P1.0,$ ;jump if bit is not set
> RET
>
> WAIT4LOW:
> JB P1.0,$ ;jump if bit is set
> RET
>
> Was können die Dollar-Zeichen hier? --> JMP $ ist ja eine
> Endlosschleifen, aber hier?

Das ist aber nur ein JMP, wenn die Bedingung erfüllt ist; sonst geht das 
Programm weiter (zu RET).

Gruß Dietrich
#2663880
Lesenswert?

Mr Gast schrieb:
> Übung 1(WRITE_DD):
> P1.4-P1.7
>
WRITE_DD:
ANL a,#0xF  ; Akkuinhalt: D0...D3 bleibt, D4...D7 wird gelöscht
SWAP A      ; D0...D3 wird mit D4...D7 getauscht
ANL P1      ; der Befehl ist falsch: da fehlt der 2. Parameter
ORL P1,A    ; Port 1 wird mit der Oder-Verknüpfung von Port 1 und Akku
            ; geladen
RET         ; Rückkehr aus Unterprogramm

Was das Ganze soll, ist mir auch nicht klar, zumal da mindestens ein 
Fehler drin ist.

Gruß Dietrich
Gast #2664050
Lesenswert?

Ahja, ok danke!

Ich habe mir jetzt Port 1 näher angeschaut. Die verschiedenen Fälle 
etc., wann der FET durchschaltet und wann nicht, dass weis ich jetzt.

Man kann ja hier den Port-pin lesen und beschreiben. Und dann auch noch 
den Port-Latch lesen(kann man den Port-Latsch auch beschreiben?)

Ich verstehe nicht wie man jetzt liest oder beschreibt? Wie macht man 
das?

Bei meinen Codes hab ich das gelesen oder geschrieben und vorallem was 
Port pin oder Port latch?
#2664338
Lesenswert?

Mr Gast schrieb:
> Man kann ja hier den Port-pin lesen und beschreiben. Und dann auch noch
> den Port-Latch lesen(kann man den Port-Latsch auch beschreiben?)

Nein, schau Dir die Schaltung nochmal an:
- Port-Pin als Ausgang:
  * Du schreibst in das Latch und bestimmst damit den Zustand der 
Port-Pins
  * Du kannst das Latch lesen; so brauchst Du im Programm den Zustand 
der Bits nicht woanders merken, wenn Du später mal ein Bit ändern willst
- Port-Pin als Eingang:
  * das Latch muss auf "1" geschrieben sein, damit der Transistor 
abgeschaltet ist und den Eingang nicht auf "0" zieht (und damit das 
Eingangssignal kurzschließt)
  * den Pin kannst Du nur lesen (schreiben ist ja auch nicht logisch)

> Ich verstehe nicht wie man jetzt liest oder beschreibt? Wie macht man
> das?
> Bei meinen Codes hab ich das gelesen oder geschrieben und vorallem was
> Port pin oder Port latch?

Schreiben des Latch von Port 1 z.B.   MOV P1,A
Lesen der Pins von Port 1 z.B.        MOV A,P1
Bei einigen Befehlen wir aus dem Latch gelesen, z.B.
  ORL P1,#1  wird so ausgeführt: aus dem Latch Lesen, #1 dazuodern, 
wieder in das Latch schreiben

Genaueres muss man bei den Befehlen nachlesen.
siehe auch: 
http://electrofriends.com/articles/electronics/microcontroller-electronics-articles/8051-8951/8051-microcontroller-port-programming/

- Alle Angaben ohne Gewähr -
Gruß Dietrich
Gast #2664844
Lesenswert?

Danke dir!

Aber hier steht: Port lesen, Port schreiben und Port Latch Lesen, aber 
kein Port Latch schreiben? Jetzt bin ich verwirrt.

>>>Du kannst das Latch lesen; so brauchst Du im Programm den Zustand
der Bits nicht woanders merken, wenn Du später mal ein Bit ändern 
willst.

Ich verstehe nicht was damit gemeint wird. Wo brauch ich kein Bit merken 
und warum? Kann mir einer das bitte näher erklären?
#2664911
Lesenswert?

Mr Gast schrieb:
> Aber hier steht: Port lesen, Port schreiben und Port Latch Lesen, aber
> kein Port Latch schreiben? Jetzt bin ich verwirrt.

Port schreiben ist Latch schreiben, denn der Latch-Ausgang geht (mehr 
oder weniger) direkt auf den Port-Pin als Ausgang.

>> Du kannst das Latch lesen; so brauchst Du im Programm den Zustand
>> der Bits nicht woanders merken, wenn Du später mal ein Bit ändern
>> willst.
>
> Ich verstehe nicht was damit gemeint wird. Wo brauch ich kein Bit merken
> und warum? Kann mir einer das bitte näher erklären?

Das war wohl auch nicht ganz richtig. So wie ich das verstanden habe 
wird das wohl nur intern benutzt, z.B. beim ORL P1,#1 (s.o.: Lesen - 
Ändern - Schreiben).
Denn wenn es das "Lesen Latch" physikalisch nicht gäbe und man nur ein 
Bit im Port ändern wollte, müsste man den Zustand der anderen Bits ja 
kennen, um sie nicht zu verändern.

Es gibt auch die Möglichkeit, direkt Einzelbits zu ändern 
(Bitadressierung). Wie das aber jetzt intern abläuft, weiß ich nicht.

Gruß Dietrich
#2665075
Lesenswert?

Mr Gast schrieb:
> auf dieser seite da:
> http://electrofriends.com/articles/electronics/mic...
>
> Da ist ja überall beschrieben wie ein Port als Input funktioniert, warum
> ist das nicht beschrieben wie die Ports als Output funktionieren?

Ist es doch: bei "Port 0:" wird es benutzt als Ausgang, bei "Port 0 as 
Input:" als Eingang.
Wenn es Eingang sein soll, muss das Latch auf "1" geschrieben werden, 
sonst gibt es Kurzschluss mit der externen Quelle.

> Alle Ports können I/O oder?

Ja.

Gruß Dietrich
Gast #2665185
Lesenswert?

Alle Ports(inklusive Pins) müssen beim D-Eingang eine 1 haben das sie 
als input wirken?

D.h. am FET liegt Low Pegel an --> Er sperrt oder? Die 
Drain-Source-Spannung ist niedrig, dadurch ist er offen oder?

Warum muss am Pin High Pegel(3-5V) anliegen, das der Port als Input 
gilt?

Und warum muss am Pin Low Pegel anliegen, das der Port als Output gilt?

Read-modify-write:

Vom Port lesen, Wert verändern, zurückschreiben.

z.B.

MOV P0,A
ANL P0,#FFhex

Kann man dazu noch was näheres sagen zu Read-modify-write?
#2665262
Lesenswert?

Mr Gast schrieb:
> Alle Ports(inklusive Pins) müssen beim D-Eingang eine 1 haben das sie
> als input wirken?

Ja.

> D.h. am FET liegt Low Pegel an --> Er sperrt oder? Die
> Drain-Source-Spannung ist niedrig, dadurch ist er offen oder?

Ja. Aber das gilt für alle Ports.

> Warum muss am Pin High Pegel(3-5V) anliegen, das der Port als Input
> gilt?

Nein, muss nicht. Nur der FET muss abgeschaltet sein (d.h. Latch=1), 
damit das externe Signal, das man am Eingang "sehen" will, ungestört 
durchkommt. Dieses externe Signal kann natürlich High oder Low sein, 
sonst wäre das ja Unsinn ;-)

> Und warum muss am Pin Low Pegel anliegen, das der Port als Output gilt?

Nein, muss nicht. Es kann natürlich High oder Low sein, sonst könntest 
Du ja mit dem Ausgang nicht anfangen. Nur: High ist relativ hochohmig 
(nur der Pull-Up-Widerstand), darum kann in diesem Zustand der Pin 
auch als Eingang benutzt werden.

> Read-modify-write:
>
> Vom Port lesen, Wert verändern, zurückschreiben.
>
> z.B.
>
> MOV P0,A
> ANL P0,#FFhex
>
> Kann man dazu noch was näheres sagen zu Read-modify-write?

(Am Rande: In diesem Beispiel kannst Du ANL P0,#FFH weglassen, da 
UND-Verknüpung mit 0FFH kein Bit verändert..)

Das Read-modify-write macht der µC ganz alleine. Das gilt für bestimmte 
Befehle, z.B. ANL P0,#FFH oder ORL... Es gibt aber noch mehr Befehle, 
die das Port verändern, wo der Ablauf so ist. Ich habe jetzt aber nicht 
alle Befehle daraufhin durch geforstet. Das kannst Du bei Bedarf selber 
machen:
http://www.keil.com/dd/docs/datashts/philips/p51_pg.pdf
Schau dort mal z.B. auf Seite 97.

Gruß Dietrich

PS: Diese etwas "komplizierte" Art von Ports ist eine Spezialität von 
8051er µCs. Bei neueren µCs gibt es üblicherweise eigene 
"Richtungs-Register", in denen man hineinschreibt, ob der Pin Eingang 
oder Ausgang ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren