Forum: Mikrocontroller und Digitale Elektronik PortB, DDRB, PinD


von A V R Fragender (Gast)


Lesenswert?

Ich versuche, mit AVr-Studio 4.0 zu lernen. Ich hab eine 
Verständnisfrage

DDRB: Damit bestimme ich die Richtung- ob Ein- oder Ausgang des Ports B
PORTB: Damit lese ich den Status des Registers aus oder setze den Wert 
auf 0/1
PINB: Damit lese ich einen einzelnen PIN aus, also einen der acht 
einzelnen Bits von PortB (0...7)?
Mein Problem, wie sage ich dem Programm, dass es z.B. bei PINB, das 
insgesamt 8 Bits breit sein kann, Bit 3 Verwenden soll (also Wert 2)?

Davon hab ich versucht, es zu verstehen von dieser Seite.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

von Hubert G. (hubertg)


Lesenswert?

Wenn du es in C wissen willst solltest du hier nachsehen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

von cskulkw (Gast)


Lesenswert?

Ganz einfach

/* Bit 2 ausmaskieren, dann könnten die anderen Pins als Ausgänge 
weiter*/
/* funktionieren. */

DDRB &= 0xFD (0b11111101)

/**/
if(PINB & 0x02)
/*Habe mal so etwas gesehen PINB.2 - aber selbst nicht ausprobiert*/
{
    /* Portpin gesetz */
}
else
{
    /* Portpin nicht gesetzt */
}

Hilft Dir das?

von Thomas E. (thomase)


Lesenswert?

cskulkw schrieb:
> Hilft Dir das?
Wird ihm wohl nicht helfen. Das ist ja Pin 1.

Zumal er selbst auch noch ein bisschen durcheinander ist.
A V R Fragender schrieb:
> Bit 3 Verwenden soll (also Wert 2)?
Bit 3 hat den Wert 8

Der erste Pin ist Pin0, der zweite Pin1 usw.. Entsprechend sind das dann 
die Bits 0, 1, 2...
Um Bit3 auszumaskieren: if (PINB & 0x08){}
Die übliche Schreibweise ist allerdings: if ((PINB &(1 << 3))){}
Mit Wert 2 wird dann das 3. Bit nicht Bit3 ausmaskiert:
if ((PINB &(1 << 2))){}
In dieser Schreibweise passt es auch mit der Bitnummer zusammen.

mfg.

von spess53 (Gast)


Lesenswert?

Hi

>DDRB: Damit bestimme ich die Richtung- ob Ein- oder Ausgang des Ports B
>PORTB: Damit lese ich den Status des Registers aus oder setze den Wert
>auf 0/1
>PINB: Damit lese ich einen einzelnen PIN aus, also einen der acht
>einzelnen Bits von PortB (0...7)?
>Mein Problem, wie sage ich dem Programm, dass es z.B. bei PINB, das
>insgesamt 8 Bits breit sein kann, Bit 3 Verwenden soll (also Wert 2)?

Nicht ganz:

DDRB richtig
PORTB : Wenn der Port Eingang ist schaltet ein gesetztes Bit den 
internen Pull-Up-Widerstand des Pins an. Als Ausgang setzt ein Bit den 
Zustand des Pins.
PINB: Die Bits spiegeln den Zustand der Portpins wieder.

>Mein Problem, wie sage ich dem Programm, dass es z.B. bei PINB, das
>insgesamt 8 Bits breit sein kann, Bit 3 Verwenden soll (also Wert 2)?

Z.B. mit sbi PortB,3 -> Pin setzen
         cbi PortB,3 -> Pin löschen

MfG Spess

von A V R Fragender (Gast)


Lesenswert?

danke für den Link zu dem C-Tutorial, ich glaub, jetzt hab ich es 
verstanden, mit PIN... lese ich nur den Status aus, mit Port... schreibe 
ich auf das Register.

Noch ne andere Frage - Port... macht ja nur Sinn, wenn ich vorher mit 
DDR... den Port als Ausgang gesetzt habe, also der Steuerbar ist. 
Angenommen, ich setze RegisterPortB so:

DDRB = 0b0000 1111, also die ersten vier Kontakte sind Eingänge, die 
restlichen Ausgänge.

Was passiert, wenn ich mit dem Befehl PortB auch auf die einzelnen Bits 
schreibe, die ich vorher als Eingang gesetzt habe, also die eigentlich 
von aussen auf ein Signal warten - werden die dann auch verändert?

Also angenommen, es liegen draußen an drei Kontakten keine Spannungen 
an, an einem schon, dann müsste mit PINB rauskommen: 1110 0000
Angenommen, ich schreibe nun mit PortB rein: PortB = 0b1100 1111

Liefert mir im nachfolgenden PINB 1110 111 oder 1100 1111,

Also die Frage, wenn ich mit DDRB vorher entsprechend Ein- und Ausgänge 
festgelegt hab, könnte dann PortB auch einen Eingang überschreiben oder 
wäre diese Operation dann wirkungslos???

von Thomas E. (thomase)


Lesenswert?

A V R Fragender schrieb:
> DDRB = 0b0000 1111, also die ersten vier Kontakte sind Eingänge, die
> restlichen Ausgänge.

Die ersten 4 sind Ausgänge. Gewöhn' dir diesen Scheiß ab. Es wird von 
rechts nach links mit 0 beginnend gezählt. Das ist zwar menschlich ein 
bisschen unlogisch, aber du bekommst einen Knoten im Kopf, wenn du dich 
nicht daran hälst. Mal abgesehen davon, daß man ständig aneinander 
vorbei redet.

Mit Schreiben auf einen Eingang werden die Pullups gesetzt. Das braucht 
man z.B. um Taster abzufragen.

A V R Fragender schrieb:
> Also die Frage, wenn ich mit DDRB vorher entsprechend Ein- und Ausgänge
> festgelegt hab, könnte dann PortB auch einen Eingang überschreiben oder
> wäre diese Operation dann wirkungslos???
Wie schon gesagt, man setzt damit einen Pullup.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

> Die ersten 4 sind Ausgänge. Gewöhn' dir diesen Scheiß ab. Es wird von
> rechts nach links mit 0 beginnend gezählt. Das ist zwar menschlich ein
> bisschen unlogisch,

@Fragender

Es wird ein bischen logischer, wenn man sich klarmacht, dass es sich 
auch nur um Zahlen handelt.

Welches ist bei der Dezimalzahl 378 die 0.te Stelle?
Ist es die 3 (also die Hunderter) oder ist es die 8 (also die Einer).

Entscheidet man sich für die Hunderter, dann war das keine sehr gute 
Wahl. Denn dann sind die Einer die 2. Stelle. Und bei der Zahl 78234 ist 
die Einerstelle dann plötzlich die 4.te Stelle.

Durchgängiger wird das ganze wenn man bei den Einern anfängt und die 
IMMER als die 0.te Stelle auffasst.

Daher:   von rechts nach links. Und das bei 0 zu zählen begonnen wird: 
Ist in C generell immer der Fall und ja, es gibt auch dafür gute Gründe.

> aber du bekommst einen Knoten im Kopf, wenn du dich
> nicht daran hälst. Mal abgesehen davon, daß man ständig aneinander
> vorbei redet.

Full Ack.
Es gibt nichts Schlimmeres, als wenn in einer Gruppe ein Einzelner eine 
abweichende Nomenklatur benutzt. Aus welchem Grund auch immer. Daher 
beginnen alle technischen Dokumente erst mal damit, den Begriffen eine 
Bedeutung zuzuweisen.

von A V R Fragender (Gast)


Lesenswert?

gut, will ich mir das fuer die Zukunft merken mit der Reihenfolge und 
der richtigen Angabe von Binär-und Hexadecimalwerten.

Was macht ein uC bei folgender Anweisung?

ldi r16, 0xFF
out PINB, r16

Nun schreibe ich auf PINB, aber nach der Definition ist PINB nur zum 
Lesen da. Ich habe probiert, es mit dem AVR-Studio 4.0 zu simulieren und 
es zeigt an, dass sich die Bits von PINB entsprechend in dem 
Anzeigefenster ändern, aber würde es auch im uC etwas ändern, weil doch 
PINB eigentlich nur zum Lesen dasein soll und wenn ich jetzt per 
Quellcode etwas an diese Speicherstelle reinschreiben würde, was 
passiert dann? Wird Real garnichts passieren oder würde ich so die Werte 
verändern?

von spess53 (Gast)


Lesenswert?

Hi

>Was macht ein uC bei folgender Anweisung?

Das ist eine Sonderfunktion neuerer AVRs. Das Beschreiben eines Bits im 
PIN-Register bewirkt (wenn Port Ausgang ist) ein togglen des zugehörigen 
Pins.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

A V R Fragender schrieb:
> Nun schreibe ich auf PINB, aber nach der Definition ist PINB nur zum
> Lesen da.

13.2.2 Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on 
the value of DDRxn. Note that the SBI instruction can be used to toggle 
one single bit in a port.

Geht ein bisschen schneller als Read-Modify-Write, also lesen, umdrehen, 
wieder ausgeben.


mfg.

von A V R Fragender (Gast)


Lesenswert?

hmm, das englische ist fuer mich leider ein großes problem, weil ich 
dieser sprache nicht gut mächtig bin :-(

von Cyblord -. (cyblord)


Lesenswert?

A V R Fragender schrieb:
> hmm, das englische ist fuer mich leider ein großes problem, weil ich
> dieser sprache nicht gut mächtig bin :-(

Was schon ein Problem darstellt. Du wirst nicht weiterkommen ohne 
Datenblätter lesen zu können, und diese sind meist auf Englisch. 
Allerdings durch Übung lernt man, also trotzdem die Datenblätter lesen 
und ggf. bei Leo nachschlagen.

PS: Deutsch scheint aber auch nicht dein Steckenpferd zu sein.

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.