www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variable an Ausgang zuweisen


Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
den Wert von einem Eingang kann man ja kann einfach z.B. mit
taster1 = PINB & (1<<PB0)
in einer Variable speichern. Geht das auch von einer Variable zu einem 
Ausgang ?

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Gruss
Michael

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhu Uhuhu wrote:
> PORTB = (1 << PB0);
>
> setzt das Bit 0 in Port B - vorausgesetzt, der ist als Output
> programmiert.
>

und setzte alle anderen Bits von Port B auf 0

Autor: Martin S. (drunkenmunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist dann aber der ganze Port oder? also 8 pins.

wie geht es einem einzelnen Pin eine variable zuzuweisen?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (Variable)
  PORTB |= (1 << Nummer);
else
  PORTB &= ~(1 << Nummer);

Autor: nowayback (Gast)
Datum:

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

Autor: Björn (Gast)
Datum:

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

Autor: nowayback (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort Björn,
der Wert steht allerdings in einer Variable; deren Wert kann von 
Schleifendurchgang zu Schleifendurchgang unterschiedlich sein.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
  PORTB |= ( 1 << PB5 );

sieht zwar in C nach einem Monster aus, compiliert aber zu dieser 
Spezialinstruktion.

Autor: Maxxie (Gast)
Datum:

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

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.