I/O-Register ansprechen

Gast #540396
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
#540451
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.
Gast #540453
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

Antwort schreiben

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