mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmel AVR PINxn vs PORTxn


Autor: fiffi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arduino Fanboy (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
Autor: fiffi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort.

Autor: DocMartin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
  PORTB = PINB | _BV(PB4);   // PB4 = high
  // ... some code
  PORTB = PINB & ~_BV(PB4);  // PB4 = low
  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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.