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
Mr Gast schrieb:> Wo sehe ich das das Rechtecksignal?
Öffne das Datenblatt, schaue unter Pinbelegung, welcher Pin der ominöse
P1.3 ist und schließe dort das Oszi an.
Peter
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?
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?
Mr Gast schrieb:> Wo ist den auf dem Bild P1.3? Ich schätze mal Port 1 und pin 3? Aber wo> ist der?
P1.X wobei x für 0 bis 7 steht.
P1.3 Konkret ist PIN 4 am Controller Gehäuse(bei 40 Pin DIL).
Der Sinn?
Damit Signale rein und raus können.
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
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?
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
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
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?
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
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?
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
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
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?
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.