Variable an Ausgang zuweisen

Gast #1152622
Hi

Klar: PORTB = variable, falls du das meinst?!? Nicht vergessen, die 
Datenrichtungsregister (DDRB für Port B) richtig zu setzen (siehe 
Tutorial).

Gruss
Michael
#1152623
PORTB = (1 << PB0);

setzt das Bit 0 in Port B - vorausgesetzt, der ist als Output 
programmiert.

Statt dem Ausdruck auf der rechten Seite kann natürlich auch eine 
Variable stehe, die den zukünftigen Wert von Port B enthält.
Gast #1285818
Entschuldigt mich, falls euch dieser Thread zum Hervorholen zu alt ist, 
aber:
Kann man obigen Code von rufus auch einfacher/in einer Anweisung ohne 
if-Abfrage schreiben?
Mir kommt es ein wenig umständlich vor, für eine einfache Pinänderung 
eine If-Abfrage einzuführen.
Oder ist es für den µC sogar effizienter, wenn man den ganzen PORT in 
eine Variable schreibt, dort direkt den betreffenden Pin ändert und 
wieder zurückschreibt?
Gast #1285922
Hallo,

wenn Du schon genau weißt, ob der Pin gesetzt ODER gelöscht werden soll, 
dann geht das einfacher mit PORTB |= (1 << 3) zum Setzen und PORTB &= 
~(1 << 3) zum Löschen, wenn beispielsweise Pin 3 geändert werden soll. 
Statt (1 << 3) kann man in avr-gcc auch _BV(3) verwenden.

Schöne Grüße,
Björn
Gast #1286192
Danke für deine Antwort Björn,
der Wert steht allerdings in einer Variable; deren Wert kann von 
Schleifendurchgang zu Schleifendurchgang unterschiedlich sein.
#1286359
nowayback schrieb:
> Kann man obigen Code von rufus auch einfacher/in einer Anweisung ohne
> if-Abfrage schreiben?

Wenn du die anderen Port Pins nicht verändern willst: nein

> Oder ist es für den µC sogar effizienter, wenn man den ganzen PORT in
> eine Variable schreibt, dort direkt den betreffenden Pin ändert und
> wieder zurückschreibt?

Das ist eigentlich schlechter, weil die Operation nicht atomar abläuft.
Aber auf einem AVR gibt es eine Assemblerinstruktion um einen Portpin zu 
setzen bzw. zu löschen. Zumindest der avr-gcc ist daraufgetrimmt, solche 
Fälle zu erkennen und dann diese Operation zu benutzen.
1
  PORTB |= ( 1 << PB5 );

sieht zwar in C nach einem Monster aus, compiliert aber zu dieser 
Spezialinstruktion.
Gast #1286361
Du kannst auch eine Maske und Pattern nutzen:

PORTB = (PORTB & ~MASK) | (PATTERN & MASK) ;

Wobei MASK alle Bits gesetzt hat, die Pattern beeinflussen können soll. 
Alle nicht in Mask gesetzten Bits bleiben so unverändert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.