Forum: Mikrocontroller und Digitale Elektronik Atmel AVR PINxn vs PORTxn


von fiffi (Gast)


Lesenswert?

Ich habe in einem attiny-Programm folgende Zeile gesehen um einen 
Ausgang LOW zu schalten:


PORTB = PINB & ~_BV(PB4)

Ìch mache das immer so:

PORTB &= ~_BV(PB4)

Die erste Variante würde doch jedesmal, wenn ich einen Ausgang auf diese 
Weise setze, die Pull-Up-Konfiguration des Ports verändern. Also wenn 
ein Eingang gerade HIGH ist, würde ich den internen Pull-Up aktivieren 
und wenn er LOW ist entsprechend andersrum.

Hat das irgendeinen Sinn? Da der Verursacher schon ca 20 Jahre länger 
programmiert als ich, bin ich etwas irritiert, ob ich bei diesem Ansatz 
irgendwas übersehe.

von Peter D. (peda)


Lesenswert?

fiffi schrieb:
> PORTB = PINB & ~_BV(PB4)

Ja, das ist fehlerhaft.

fiffi schrieb:
> PORTB &= ~_BV(PB4)

So ist es richtig und auch schneller und kürzer.

fiffi schrieb:
> Da der Verursacher schon ca 20 Jahre länger
> programmiert

Die Dauer bedeutet leider nicht automatisch auch einen Qualitätslevel.

von Einer K. (Gast)


Lesenswert?

Peter D. schrieb:
> Ja, das ist fehlerhaft.
Sieht so aus....
Muss aber nicht sein.
Nur weil sich mir der Sinn nicht erschließt, tut der Code doch evtl. 
genau das, was der Programmierer beabsichtigt.

Also, ich weiß nicht, was sich dieser Profi dabei gedacht hat, oder ob 
er überhaupt gedacht hat.

von fiffi (Gast)


Lesenswert?

Danke für die schnelle Antwort.

von DocMartin (Gast)


Lesenswert?

Jetzt bin ich verwirrt:

PINB soll doch direkt den Pegel am Pin abbilden, PORTB hingegen das 
Ausgangslatch?

Aaah, jetzt: Wenn nicht alle Pin auf Ausgang stehen, wird dabei der 
Pullup der Eingänge abhängig von deren Pegel beeinflusst.

Danke fürs Aufmerksammachen, bisher hatte ich die Varianten für gleich 
gehalten.

Ahoi, Martin

von Peter D. (peda)


Lesenswert?

fiffi schrieb:
> PORTB = PINB & ~_BV(PB4)

Nicht nur die Pullups können sich ungewollt ändern.
Macht man das direkt hintereinander für 2 Ausgänge, geht die erste 
Änderung verloren:
1
  PORTB = PINB | _BV(PB4);   // PB4 = high
2
  // ... some code
3
  PORTB = PINB & ~_BV(PB4);  // PB4 = low
4
  PORTB = PINB & ~_BV(PB5);  // PB4 = high

"When reading back a software assigned pin value, a nop instruction must 
be inserted as indicated in Figure 13-4. The out instruction sets the 
“SYNC LATCH” signal at the positive edge of the clock. In this case, the 
delay tpd through the synchronizer is 1 system clock period."

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.