Atmel AVR PINxn vs PORTxn

Gast #4729326
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.
Gast #4729345
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.
Gast #4729379
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
#4729435
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."

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren