Forum: Mikrocontroller und Digitale Elektronik PortB = 0xFF, was ist dann PinB?


von O. A. (sokrates1989)


Lesenswert?

Hallo,

wenn ich PORTB = 0xFF; setze z.b für Pullups, dann wäre ja der
PortB=0b1111 1111

Würde ich jetzt nun einen beliebigen PINB abfragen, liegt dort dann eine 
"1" an?

Müsste doch so sein oder..?

von Georg (Gast)


Lesenswert?

O. A. schrieb:
> Würde ich jetzt nun einen beliebigen PINB abfragen, liegt dort dann eine
> "1" an?

Das kommt auf den Prozessortyp an und auf die Programmierung - z.B. ob 
die Pins als Ausgang oder Eingang programmiert sind, dazu hast du dich 
ja auch nicht geäussert.

Georg

von Einer K. (Gast)


Lesenswert?

O. A. schrieb:
> Würde ich jetzt nun einen beliebigen PINB abfragen, liegt dort dann eine
> "1" an?

Der Pullup macht nur eine 1, wenn die externe Beschaltung nichts anderes 
erzwingt.
Ausgenutzt wird das z.B. beim abfragen von Schaltern/Tastern.

von Axel S. (a-za-z0-9)


Lesenswert?

O. A. schrieb:
> wenn ich PORTB = 0xFF; setze z.b für Pullups, dann wäre ja der
> PortB=0b1111 1111
>
> Würde ich jetzt nun einen beliebigen PINB abfragen, liegt dort dann eine
> "1" an?

Kommt drauf an, was an der Hardware passiert.

PINB liefert immer die Zustände der Pins am Port B zurück. Auch dann, 
wenn ein Pin auf Ausgang konfiguriert ist. Wenn du bspw. eine 1 für so 
einen Pin nach PORTB schreibst, dann wird der Pin auf H gehen. Hast du 
nun aber in deiner Schaltung einen Kurzschluß dieses Pins nach GND, dann 
bleibt der auf L und wenn du jetzt PINB liest, bekommst du auch eine 0 
für diesen Pin. Sinngemäß bei einem Schluß eines Pins nach Vcc.

Im Normalfall wird PINB aber für alle Ausgangs-Pins den gleichen Wert 
liefern, den du vorher nach PORTB geschrieben hast.

von Georg (Gast)


Lesenswert?

Axel S. schrieb:
> wenn du jetzt PINB liest, bekommst du auch eine 0
> für diesen Pin

Ich weiss nicht, ob es sich hier um einen Arduino handelt, das scheinen 
hier alle Teilnehmer am Forum einfach vorauszusetzen. Was ich aber 
sicher weiss, ist dass deine Behauptung keineswegs auf alle Prozessoren 
zustrifft. Es gibt sogar welche, bei denen man sowohl das eben 
beschriebene Ausgaberegister lesen kann oder den tatsächlichen Zustand 
des Pins.

Die Unkenntnis dieser Zusammenhänge führt zu besonders hübschen 
Fehlerbildern, z.B. dass man mit einem Read-Modify-Write einen 
Eingangszustand versehentlich festschreibt.

Georg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Georg schrieb:
> Es gibt sogar welche, bei denen man sowohl das eben beschriebene
> Ausgaberegister lesen kann oder den tatsächlichen Zustand des Pins

Das ist beim AVR durchaus so: liest du PORTB zurück, dann liest du
das Ausgaberegister, liest du PINB, dann den Eingangszustand.

Das ist keineswegs auf „Arduino“ beschränkt, aber die Namen der
Register deuten schon sehr stark auf einen AVR.

von O. A. (sokrates1989)


Lesenswert?

Angenommen,

PortB ist als Eingang konfiguriert.

also
DDRB=0;
PORTB=0xFF;

Und ein anderer Port als Ausgang.

Nun frage ich einen PINB o bis 7 ab, wenn kein Taster gedrückt wird, 
dann müsste mir die Abfrage immer "1" liefern richtig?

von c-hater (Gast)


Lesenswert?

O. A. schrieb:

> Angenommen,
>
> PortB ist als Eingang konfiguriert.
>
> also
> DDRB=0;
> PORTB=0xFF;

Er ist damit für alle Pins als Eingang mit aktiviertem Pullup 
konfiguriert.

> Nun frage ich einen PINB o bis 7 ab, wenn kein Taster gedrückt wird,
> dann müsste mir die Abfrage immer "1" liefern richtig?

Sofern äußere Beschaltung das nicht verhindert, z.B. ein angeschlossener 
ISP-Programmer (bei vielen Megas sind die ISP-Anschlüsse an PortB) oder 
ein schlichter Zinnpopel nach GND...

Übrigens: PinX hängt dem realen Geschehen an den Pins immer 1..2 Takte 
hinterher. Das ist manchmal nützlich, manchmal aber auch schädlich (vor 
allem, wenn man beim Programmieren nicht an dieses Verhalten denkt).

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Zu allem Überfluss kannst Du, wenn Du PinB0 mit 1 beschreibst, den 
Zustand des PortB0 invertieren (toggel/torkeln).
Sollte bei allen ATmega und ATtiny gehen, getestet nur mit ATtiny - aber 
Da geht's.

MfG

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Patrick J. schrieb:
> Sollte bei allen ATmega und ATtiny gehen, getestet nur mit ATtiny - aber
> Da geht's.

Dazu muss man wirklich ins DB schauen. Als Beispiel das alte 
Schlachtschiff Mega8 hat es nicht, Mega16 auch nicht und ebenso fehlts 
beim Mega32 und Tiny13. Also immer gucken.

: Bearbeitet durch User
Beitrag #5012833 wurde vom Autor gelöscht.
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Danke für die Klarstellung - bisher hatte ich wohl beim Schauen das 
Glück, daß die angeschauten µC dieses 'Feature' hatten - somit n2k (nice 
to know) - in beide Richtungen.

MfG

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.