Forum: Mikrocontroller und Digitale Elektronik Unterschied PinX und PortX


von Christian S. (mueke)


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

von A.K. (Gast)


Lesenswert?

Vereinfacht: PORTx Ausgang, PINx Eingang.

von Christian S. (mueke)


Lesenswert?

OK. Danke...
Kann ich auch mit PinX den Status eines Ausgangsports laden?

MfG
Muecke

von Stefan B. (stefan) Benutzerseite


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.

von A.K. (Gast)


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.

von Johannes M. (johnny-m)


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.

von Fred (Gast)


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

von Tom (Gast)


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.

von Michael U. (Gast)


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


von Johannes M. (johnny-m)


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

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.