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 ?
Hi Klar: PORTB = variable, falls du das meinst?!? Nicht vergessen, die Datenrichtungsregister (DDRB für Port B) richtig zu setzen (siehe Tutorial). Gruss Michael
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.
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
das ist dann aber der ganze Port oder? also 8 pins. wie geht es einem einzelnen Pin eine variable zuzuweisen?
if (Variable) PORTB |= (1 << Nummer); else PORTB &= ~(1 << Nummer);
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?
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
Danke für deine Antwort Björn, der Wert steht allerdings in einer Variable; deren Wert kann von Schleifendurchgang zu Schleifendurchgang unterschiedlich sein.
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.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.