Forum: Mikrocontroller und Digitale Elektronik I/O-Register ansprechen


von David (Gast)


Lesenswert?

Moin

hab eine frage zu den I/O Register;

ldi r16, 0b00000001
out DDRB, r16


Als erstes wird die Konstante (logische 1) ins Register r16 geladen bzw. 
dort abgespeichert;

Mit out wird dieses Register r16 wieder ausgegeben an den Port DDRB; da 
es sich um eine logische 1 handelt, ist sind alle Port B.0 - B.7 als 
Ausgänge konfiguriert, oder?

Bei diesem Bsp steht aber dabei, dass Port B.0 ein Ausgang und Port B.1 
bis Port B.7 Eingänge sind. hmmm... heißt das, dass DDRB ohne Nummer das 
Pin B.0 anspricht??? und alle Ports automatisch immer zuerst als 
Eingänge konfiguriert sind??

Wie kann ich z.B. nur Port B.1 oder B.5 ansprechen?? Geht dass dann über 
DDRB1 DDRB3??

David

von Karl H. (kbuchegg)


Lesenswert?

David wrote:
> Moin
>
> hab eine frage zu den I/O Register;
>
> ldi r16, 0b00000001
> out DDRB, r16
>
>
> Als erstes wird die Konstante (logische 1) ins Register r16 geladen bzw.
> dort abgespeichert;
>
> Mit out wird dieses Register r16 wieder ausgegeben an den Port DDRB; da
> es sich um eine logische 1 handelt, ist sind alle Port B.0 - B.7 als
> Ausgänge konfiguriert, oder?

Nein.

Das geht bitweise

Deine Maske war:

   0b00000001

jede 0 steht für einen Eingangspin, jede 1 für einen
Ausgangspin:

   0b00000001

Bit  76543210

Also ist Bit 0 auf Ausgang, alle andern (Bit 1 bis Bit 7) sind
auf Eingang

  0b00100100

Bit 76543210

Bit 2 und Bit 5 sind auf Ausgang, Bit 0, 1, 3, 4, 6, und 7 sind
auf Eingang

> bis Port B.7 Eingänge sind. hmmm... heißt das, dass DDRB ohne Nummer das
> Pin B.0 anspricht???

Nein.
Die Festlegung mittels DDRx gilt für alle Bits des betreffenden
Ports. Jedes Bit in der Maske, die an DDRx zugewiesen wird,
schaltet das zugehörige Port-Bit in den jeweiligen Modus.

> und alle Ports automatisch immer zuerst als
> Eingänge konfiguriert sind??

das stimmt allerdings. Die DDRx Bits sind per default auf 0.

>
> Wie kann ich z.B. nur Port B.1 oder B.5 ansprechen?? Geht dass dann über
> DDRB1 DDRB3??

Die Frage sollte sich jetzt erübrigt haben.

von Stefan (Gast)


Lesenswert?

Ich weiss nicht wo du das Beispiel her hast. Wenn wir über eine 
gemeinsame Diskussiongrundlage reden sollen, schlage ich 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen 
vor...

Also den Port DDRB kannst du nicht direkt mit einer Konstante 
(0b00000001) belegen, daher der Umweg über das Register (hier) r16. 
Zuerst Register mit Konstante laden (ldi), dann Register in Port 
schreiben (out).

Der Wert der Konstante schaltet einzelne Pins am Port auf Ausgang (1) 
oder Eingang (0). Hier Bit0 auf 1 gesetzt, d.h. Pin0 an Port B ist 
Ausgang. Bit1-Bit7 auf 0 gesetzt, d.h. Pin1-Pin7 an Port B sind Eingang.

Zugriff auf einzelne Bits findest du bei
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Zugriff_auf_einzelne_Bits

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
Noch kein Account? Hier anmelden.