mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Ports


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich programmiere nun seit einigen Jahren die At90* und die AtMega Serie
von Atmel. Nun möchte ich zusätzlich die Programmierung von 8051er
lernen (ich habe meine Gründe dafür und will KEINE Diskussion über Vor-
und Nachteile der genannten uC auslösen).

Wie kann ich einen einzelnen Pin eines Ports als Ausgang oder Eingang
definieren? Ich habe nur die Register P0-P5 gefunden. Bei den AVRs geht
das über die Regsiter PORTx PINx und DDRx. Wie ist das bei den 8051ern
gelöst?

Ich habe leider keine Infos dazu finden können. (Wahrscheinlich fehlen
mir nur die entsprechenden Stichwörter).

Vielen Dank für eure Hilfe.
Grüße Steffen

Autor: Thomas Schattat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Steffen,
ist ganz einfach wie immer wenn man es weiß.
Ausgang:

MOV Port1, A
Schreibt den Akku in den Port 1

Eingang:
Mov P1, FF
MOV A, P1

Funktioniert so: Ich setze die Port Pins auf 1 und lese danach aus. Das
Setzen auf 1 muß nur einmal geschehen.
Wenn ich eine 1 einlese ist der Eingabewert (bitweise) 1, wenn ich eine
0 zurücklese ist der Eingabewert 0.
Kannste auch mit jedem Bit einzeln machen, also fünf Bits ausgeben und
drei Bits einlesen oder so.
Prinzipiell: Bits die ich einlesen will auf 1 setzen, dann Bit
einlesen.

Gruß und viel Erfolg

Thomas

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

danke für deine Antwort!

Ich programmiere in IAR Embedden Workbench, also C. Aber das dürfte da
ja keinen großen Unterschied machen.

Sprich: Man setzt das Portregister (alle Eingänge auf 1, alle Ausgänge
auf 0)

Anschließend liest man das Portregister ein.

Will man wieder einlesen, reicht es, dass Portregister zu lesen und die
entsprechenden Bits auszuwerten.

Will man die Ausgänge setzen, so setzt man diese wie gewünscht und die
Eingänge wieder auf 1.

Muss das Einlesen des Portregisters genau der nächste Befehl sein? Dann
werden die Pins als Eingang / Ausgang gesetzt.

Hab ich das so richtig verstanden?

Danke nochmals!!
Grüße Steffen

Autor: Dirk B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt nur ein Register für jeden Port. Wird dieses auf 0xFF gesetzt
liegen alle Pins auf high (mit Pull-up). Wird jetzt ein Pin extern
gegen Masse gezogen, wird auch das entsprechende Bit im Register low
und man kann es auch so auslesen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 8051 hat open-drain Ausgänge mit internen Pull-Up Widerständen.
Deshalb kann er keine großen High-Ströme treiben (z.B. LEDs gegen VCC
anschalten).
Eine Richtungsumschaltung gibt es deshalb nicht.
Gelesen wird immer von den Pins, geschrieben auf das Portregister.
Das Portregister kann nicht direkt gelesen werden, wird aber bei ORL,
ANL, XRL, SETB, CLR, JBC verwendet.

Nach dem Reset sind alle Ports auf High und Du kannst sie als Eingänge
benutzen.

Bei P0 fehlen die Pull-ups und Du must extern welche anschalten, sobald
P0 als Ausgang dienen soll.

Neuere schnelle 8051-er (z.B. C8051Fxx-Serie, Philips LPC-Serie) können
auch als Push-Pull Ausgagng geschaltet werden und dann größere
High-Ströme liefern.


Peter

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß zwar jetzt nicht welchen 8051 du verwendest, aber beim C515C
von Siemens kann man direkt auf die einzelnen Bits des Ports zugreifen
mit zb.

SETB P4.1
CLRB P4.1

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die vielen Antworten!

Ich verwende den AT89C51SND1 - als MP3 Player.
Das Datenblatt sagt natürlich nur etwas über die eigenheiten des SND1
aus - nichts über die generelle Programmierung von 8051ern. Daher meine
Fragen :-)

Aber mit der Erklärung von Peter hab ichs jetzt voll verstanden.
@Peter:
Eine Frage noch zu deiner Antwort:
"Das Portregister kann nicht direkt gelesen werden, wird aber bei
ORL,
ANL, XRL, SETB, CLR, JBC verwendet."
Wie genau ist das gemeint?
"MOV A, P1"
so kann ich das Portregister doch einlesen, oder nicht?

Grüße Steffen

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans:

"Ich weiß zwar jetzt nicht welchen 8051 du verwendest, aber beim
C515C
von Siemens kann man direkt auf die einzelnen Bits des Ports zugreifen
mit zb.

SETB P4.1
CLRB P4.1"

Was hat denn Deine Antwort mit Peters Aussage zu tun?
Nichts. Lies Peters Antwort nochmal durch und schau ins Datenblatt des
8051ers.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, Hans' Antwort war mehr auf meine Fragen bezogen.
Und er wollte wissen, was ich für einen 8051 er verwende ...

Grüße Steffen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.