www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unterschied PinX und PortX


Autor: Christian S. (mueke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich suche schon seit geraumer Zeit den Unterschied zwischen PinX und 
PortX. Ich kapier den Unterschied einfach nicht und weiß nicht wann ich 
was anwenden muss. Aus den Datenblättern der ATMega serie werde ich auch 
nicht schlau.

Wenn ich jetzt z.B. PortD halb als Ausgang und halb als Eingang 
definiere:

ldi r16, 0xF0
out DDRD, r16

Wie kann ich jetzt folgendes realisieren?

1.) Wie gebe ich nun etwas an den vier Bits mit einem mal was aus?
2.) Wie lese ich die Pins ein, die als Eingang definiert sind?
3.) Wie frage ich den Status der Pins ab, die als Ausgang definiert 
sind?

Danke für eure Hilfe.

MfG
Muecke

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vereinfacht: PORTx Ausgang, PINx Eingang.

Autor: Christian S. (mueke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK. Danke...
Kann ich auch mit PinX den Status eines Ausgangsports laden?

MfG
Muecke

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1/ PortX zunächst einlesen, um die eingestellten Pullups (für 
Eingabepins) und Iststellung der Ausgabepins zu ermitteln. Alternativ 
bekannte (weil selbstgesetzte) Pullupmaske benutzen und Ausgabepins 
ignorieren.

   Komplett LOW ausgeben:  PortX auf 0x0# setzen
   Komplett HIGH ausgeben: PortX auf 0xF# setzen

An die Stelle # werden die oben ermittelten Pullup-Werte gesetzt. 
Programmtechnisch würde ich so arbeiten, um z.B. Pin 5 auf HIGH zu 
setzen.

t = PortX          ; Akt. Status einlesen
PortX = t OR 0x10  ; alten Status übernehmen dabei zusätzlich Pin 5 HIGH

2/ PinX einlesen. Eingabestatus aus dem unteren Nibble ermitteln. Dazu 
gibt es verschiedene Methoden (Shift-Opcodes, Bitvergleich-Opcodes, 
Maskieren mit Bitmaske,...). Das obere Nibble wird vernachlässigt.

3/ Weiss ich nicht, was du meinst. Willst du kontrollieren, ob der zuvor 
von dir eingestellte Ausgabewert noch vorhanden ist? Dann einfach nur 
PortX einlesen und interessierende(s) Bit rauspflücken s.o.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann ich auch mit PinX den Status eines Ausgangsports laden?

PINx liest den Zustand vom Pin. Egal ob der Ausgang oder Eingang ist.

PORTx liest das, was ausgegeben wird, sobald der betreffende Pin ein 
Ausgang ist. Man liest also auf jedem Bit das zurück was man 
reingeschrieben hat.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTx enthält den vom Programm vorgegebenen Schaltzustand der 
Ausgangsstufe des Ports (nicht von außen beeinflussbar!). PINx enthält 
die tatsächlichen Zustände der Pins. Wenn ein Pin als Eingang 
konfiguriert ist, dann bringt es nichts, PORTx einzulesen, da dieses 
Register für die betreffenden Pins entweder eine 0 (Pull-Up 
ausgeschaltet, hochohmiger Eingang) oder eine 1 (Pull-Up eingeschaltet) 
enthält. PINx hingegen enthält das, was am Pin tatsächlich passiert, 
also auch von außen vorgegebene Pegel, und das ist ja schließlich das, 
was man eigentlich einlesen will. Bei Ausgängen kann man theoretisch 
beide Register einlesen, wobei PINx immer den selben Wert wie PORTx 
haben sollte, es sei denn, es liegt ein Kurzschluss vor. Wenn man wissen 
möchte, ob ein Ausgang High- oder Low-Pegel ausgibt, sollte man 
sinnvollerweise das PORTx-Register einlesen.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

@Johannes M.:
Es kann durchaus passieren, dass PORTX und PINX verschiedene Werte 
haben. Wenn z.B. in PORTX geschrieben wird, ist PINX erst einen Takt 
später auf dem gewünschten Level. Allerdings sollte das in den 
allermeisten Fällen nicht von Bedeutung sein.
Gruß

Fred

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es kann durchaus passieren, dass PORTX und PINX verschiedene Werte
> haben. Wenn z.B. in PORTX geschrieben wird, ist PINX erst einen Takt
> später auf dem gewünschten Level.

Oder noch später, wenn was kapazitives am Port hängt.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Versuch, es noch kürzer zu machen... ;)

Aus PORTx lese ich immer das, was ich vorher mal in PORTx 
reingeschrieben habe. Was der Zustand jedes Bits gerade bedeutet, hängt 
davon ab, ob der Pin gerade als EIngang oder Ausgang programmiert ist.

Aus PINx lese ich immer den Zustand, den ich auch außen am Port messen 
kann, egal, wodurch der zustande kommt. Ausnahmen sind jeweils bei den 
alternativen Port-Funktionen zu finden.

Gruß aus Berlin
Michael


Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fred & Tom:
Die Wahrscheinlichkeit, dass der Inhalt von PORTx und PINx sich 
unterscheidet (bei Konfiguration als Ausgang) ist aber eben auf die 
genannten Sonderfälle beschränkt. Und die Wahrscheinlichkeit, dass 
innerhalb kürzester Zeit nach dem Schreiben von PORTx bereits der 
Zustand wieder gelesen werden soll, ist auch recht gering (wie Fred 
schon richtig schrieb). Große Kapazitäten (die zu nennenswerten 
Spannungsanstiegs- oder -Abfallverzögerungen führen) sollte man sowieso 
nicht direkt an den Port hängen (Stromspitzen), sondern entweder über 
Begrenzungswiderstände schalten oder (wenns auf Schaltgeschwindigkeit 
ankommt) über zusätzliche Schalter.

Aber wegen genau dieser Sonderfälle habe ich auch den letzten Satz in 
meinem Posting von 12:08 geschrieben. Da es sich beim OP augenscheinlich 
um einen Anfänger handelt, habe ich jedoch keine detailliertere 
Begründung hinzugefügt. Man muss die Leute ja nicht gleich mit 
Informationen erschlagen...

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.