Atmel AVR PINxn vs PORTxn

Gast #4729326
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.