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
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