Forum: Compiler & IDEs PIN, PORT und DDR Verständnis


von Elias 1. (alajas)


Lesenswert?

Hallo Leute,

Ich möchte einen Eingang schaffen der auf einen 5V anstieg reagiert.
ich fasse kurz zusammen was ich aus dem Tutorial verstanden habe.
1
DDRA |= (1<<DDA1); //setzt den Port A1 auf Ausgang
2
DDRA &= ~(1<<DDA1); //setzt den Port A1 auf Eingang
3
4
PORTA |= (1<<PDA1); //schaltet den Pull Up Widerstand ein
5
PORTA &= ~(1<<PDA1); //schaltet den Pull Up Widerstand aus
6
7
if(PINA & (1<<PINA1)) // überprüft ob der PIN high (5V) ist.
8
{}
9
10
jetzt habe ich:
11
12
DDRA &= ~(1<<DDA1); 
13
while (1)
14
15
{
16
if(PINA & (1<<PINA1))
17
{
18
print("1111\n");
19
}
20
21
}
Und die Ausgabe zeigt immer die Ausgabe an, obwohl der PINA1 nicht 
belegt ist.
Theoretisch müsste der Eingang 0 sein, warum ist er das nicht?
Wozu benötige ich eig. den Pull Up?
MfG Elias

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

Elias 1234 schrieb:
> DDRA |= (1<<DDA1);

Probiers mal mit DDRA &= ~(1<<1)

Gruß Chris

von Chris (Gast)


Lesenswert?

Sorry hinten ; nicht vergessen

von Elias 1. (alajas)


Lesenswert?

Nö geht auch nicht, hab auch schon den Pull Up ein/ausgeschaltet hilft 
auch nichts =/

MfG Elias

von Axel S. (a-za-z0-9)


Lesenswert?

Elias 1234 schrieb:

> Ich möchte einen Eingang schaffen der auf einen 5V anstieg reagiert.

> ich fasse kurz zusammen was ich aus dem Tutorial verstanden habe.
>
> DDRA |= (1<<DDA1); //setzt den Port A1 auf Ausgang
> DDRA &= ~(1<<DDA1); //setzt den Port A1 auf Eingang

Das ist schon viel zu speziell. Eine 1 im DDRx Register schaltet den 
entsprechenden Pin an Port X auf Ausgang, eine 0 schaltet ihn auf 
Eingang. Wie genau du die 1 oder 0 dahin schreibst, ist ein Detail.

Du kannst auch durchaus
1
DDRA = 0xFF;
schreiben um einfach alle Pins von Port A auf Ausgang zu schalten.

> PORTA |= (1<<PDA1); //schaltet den Pull Up Widerstand ein
> PORTA &= ~(1<<PDA1); //schaltet den Pull Up Widerstand aus

Dito.

> if(PINA & (1<<PINA1)) // überprüft ob der PIN high (5V) ist.

Und wieder ganz allgemein. Beim Lesen von PINx bekommst eine 0 in allen 
Bits deren zugehörige Pins einen L-Pegel sehen und eine 1 für H-Pegel. 
Und dafür ist es unerheblich ob der Pin als Ausgang geschaltet ist
(dann siehst du normalerweise den Pegel den du durch das Schreiben ins 
PORTx Register selber gesetzt hast) oder als Eingang.

> jetzt habe ich:
>
> DDRA &= ~(1<<DDA1);

Warum setzt du den Pin auf Ausgang, wenn du ihn doch als Eingang 
verwenden willst? Ist dir auch klar, daß DDRA nach dem Reset einen 
Defaultwert enthält? Und daß der Default 0x00 ist (= alle Pins sind 
Eingänge) ?

> while (1)
>
> {
> if(PINA & (1<<PINA1))
> {
> print("1111\n");
> }
>
> }

Mal abgesehen davon, daß deine Codeformatierung saugt und daß die 
Ausgabe saublöd ist ... besser wäre

1
while (1) {
2
    if(PINA & (1<<PINA1)) {
3
        print("H");
4
    } else {
5
        print("L");
6
    }
7
}

> Und die Ausgabe zeigt immer die Ausgabe an, obwohl der PINA1 nicht
> belegt ist.

... was meinst du mit "nicht belegt"? Du hast nichts angeschlossen?

> Theoretisch müsste der Eingang 0 sein

Wie kommst du darauf?

Ein CMOS-Logikeingang (und das ist ein als Eingang geschalteter Pin) hat 
erstmal keinen Normalzustand. Er ist hochohmig, fängt sich also 
Störungen aus der Umgebung ein. Der bloße Hautwiderstand reicht, daß er 
beim Berühren auf den Pegel springt den du noch berührst.

> Wozu benötige ich eig. den Pull Up?

Der Pull-up bringt den Eingang auf einen definierten Normalpegel (und 
zwar H-Pegel) auch wenn sonst nichts angeschlossen ist.

Siehe AVR-Tutorial: IO-Grundlagen: Pullup-Widerstand


XL

von Michael (Gast)


Lesenswert?

Elias 1234 schrieb:
> Theoretisch müsste der Eingang 0 sein, warum ist er das nicht?
Weil ein offener Eingang einen Kondensator darstellt, der irgendwie 
aufgeladen ist. Dank der Eingangsschutzbeschaltung wird der 
Spannungsbereich auf die zulässigen Maximal-/Minimalwerte eingeengt.

Die Beschaltung muss dafür sorgen, dass ein definierter Pegel anliegt 
und der zulässige Maximalstrom der Schutzdioden nie überschritten wird.

von Rolf Magnus (Gast)


Lesenswert?

Elias 1234 schrieb:
> Und die Ausgabe zeigt immer die Ausgabe an, obwohl der PINA1 nicht
> belegt ist.
> Theoretisch müsste der Eingang 0 sein, warum ist er das nicht?

Wie kommst du darauf? Wenn er nicht belegt ist, hat er irgendeinen 
undefinierten Pegel.

> Wozu benötige ich eig. den Pull Up?

Eben damit er einen definierten Pegel hat.

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.