Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem PullUp PullDown


von Pappnase (Gast)


Lesenswert?

Bin mir nicht sicher, ob ich es richtig verstanden habe, drum frag ich 
zur Sicherheit mal nach:

Atmega88, PortC.
1
DDRC |= (1<<PINC0)    // PinC0 = Eingang
2
PORTC |= (1<<PINC0)   // interner PullUp an

Verbinde ich nun PinC0 mit Masse (Taster), dann ist die if-Abfrage True 
und der Code in der Klammer wird ausgeführt:
1
if (PINC & (1<<PINC0)) {
2
    // Tu was
3
}

Also das Bit0 in PinC ist gesetzt, wenn Schalter mit Masse verbunden 
ist.

Will ich aber meinen Schalter nicht mit Masse verbinden sondern mit Vcc, 
dann muss ich umgedreht denken:
1
DDRC |= (1<<PINC0)    // PinC0 = Eingang
2
PORTC &= ~(1<<PINC0)  // interner PullUp aus

Da ich keinen internen PullDown-Widerstand habe, muss ich einen 
PullDown-Widerstand zwischen PinC und Masse setzen.

Wird nun PinC mit Vcc verbunden, dann muss die if-Bedingung zur 
Auswertung so aussehen:
1
if (PINC & ~(1<<PINC0)) {
2
   // Tu was...
3
}

bzw.
1
if (! (PINC & (1<<PINC0)) ) {
2
   // Tu was...
3
}

Ich würd mich sehr freuen, wenn mir jemand kurz helfen kann und mir 
sagt, ob ich es richtig verstanden hab oder ob wo was falsch ist. Viele 
Dank im Voraus.

von Werner P. (Gast)


Lesenswert?

Pappnase schrieb:
> Bin mir nicht sicher, ob ich es richtig verstanden habe, drum frag ich
> zur Sicherheit mal nach:
>
> Atmega88, PortC.
>
>
1
> DDRC |= (1<<PINC0)    // PinC0 = Eingang
2
>
>

Mit
1
DDRC |= (1<<PINC0)    // PinC0 = Eingang

ist der doch als Ausgang geschaltet. Richtig wäre:
1
DDRC &= ~(1 << PINC0);

von Pappnase (Gast)


Lesenswert?

Werner P. schrieb:
> ist der doch als Ausgang geschaltet. Richtig wäre:
> DDRC &= ~(1 << PINC0);

Vielen Dank fuer Deine Antwort, steht ja auch so in dem Script

         ldi r16, 0x00
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 
ins
                           ; Richtungsregister DDRD als Eingang 
konfigurieren

hab es falsch herum gelesen, aber Danke, dass Du mich drauf hingewiesen 
hast.

Aber der Rest mit den if-Abragen und der Beschaltung von PinC0 mit dem 
PullDown-Widerstand, wenn ich den Schalter gegen Vcc legen will und 
nicht gegen Masse - dass ist so richtig?

von Karl H. (kbuchegg)


Lesenswert?

Pappnase schrieb:

> Aber der Rest mit den if-Abragen und der Beschaltung von PinC0 mit dem
> PullDown-Widerstand, wenn ich den Schalter gegen Vcc legen will und
> nicht gegen Masse - dass ist so richtig?

Nein.
Es ist genau anders rum


> DDRC |= (1<<PINC0)    // PinC0 = Eingang
> PORTC |= (1<<PINC0)   // interner PullUp an

soweit, so gut.
D.h. wenn der Taster nicht gedrückt ist, dann zieht der Pullup den 
Eingangspin auf Vcc.

Ein Eingangspin, an dem Vcc anliegt, hat aber den logischen Wert 1. Und 
nicht 0

> Verbinde ich nun PinC0 mit Masse (Taster), dann ist die if-Abfrage True
> und der Code in der Klammer wird ausgeführt:
> if (PINC & (1<<PINC0)) {
>     // Tu was
> }

D.h. die Abfrage, ob der PINC0 auf 1 ist, liefert genau dann TRUE, wenn 
der Taster nicht gedrückt ist.

von Werner P. (Gast)


Lesenswert?

Da ist es doch sehr gut beschrieben:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
1
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
2
3
if ( PINC & (1<<PINC1) ) {
4
  /* Aktion */
5
}
6
 
7
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */
8
9
if ( !(PINB & (1<<PINB2)) ) {
10
  /* Aktion */
11
}

Das geht soweit ich weiss gar nicht.
1
if (PINC & ~(1<<PINC0)) {
2
   // Tu was...
3
}

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.