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
OK. Danke... Kann ich auch mit PinX den Status eines Ausgangsports laden? MfG Muecke
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.
> 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.
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.
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
> 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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.