Forum: Mikrocontroller und Digitale Elektronik Taster an Ports


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe die 8Pins des PORTA des uC mit einem DIP-Schalter 
verbunden. Leider auf direktem Wege, also 5V->Schalter->Pin
(siehe Bild im Anhang) und den Pull-Up Widerstand vergessen.

Ich habe PORTA als Ausgang declariert
DDRA=0x00;  //Eingang DIP-Schalter
und dachte, ich könne den Status des Pins einfach über

if(PORTA |= (1>>PA1))  //Schalter geschlossen, 5V liegen an
....

abfragen. Aber geht anscheinend nicht? Es liegen immer 5V am Pin, auch 
wenn der Schalter geöffnet ist!
Benötigt man wirklich den Pull-Up Widerstand?

von Justus S. (jussa)


Lesenswert?

Markus schrieb:
> Aber geht anscheinend nicht?

abgesehen von allem anderen: Eingänge werden mit PINX abgefragt...

von spess53 (Gast)


Lesenswert?

Hi

>Benötigt man wirklich den Pull-Up Widerstand?

In deinem Fall Pull-Down-Widerstände.

MfG Spess

von Falk B. (falk)


Lesenswert?

@  Markus (Gast)

>Hallo, ich habe die 8Pins des PORTA des uC mit einem DIP-Schalter
>verbunden. Leider auf direktem Wege,

Das ist OK.

>also 5V->Schalter->Pin
>(siehe Bild im Anhang) und den Pull-Up Widerstand vergessen.

Das ist kein Problem, der AVR hat intern zuschaltbare.

>Ich habe PORTA als Ausgang declariert

Was mal Unsinn ist, Eingang wäre deutlich sinnvoller.

>DDRA=0x00;  //Eingang DIP-Schalter

Das sind Eingänge.

>und dachte, ich könne den Status des Pins einfach über

>if(PORTA |= (1>>PA1))  //Schalter geschlossen, 5V liegen an
>....

>abfragen.

Nicht "denken", WISSEN!

Den Zustand der PINs fragt man mit PINA ab. Wer hätte das gedacht. Und 
die internen Pull-Ups schaltet man mit

PORTA = 0xFF;

ein.

Allerdings müssen dein DIP-Schalter dann gegen GND schalten und nicht 
wie bei dir gegen +5V. Tja, Pech gehabt, beim nächsten mal vorher 
informieren.

MfG
Falk

von LinuxMint_User (Gast)


Lesenswert?

Du solltest nicht an Widerständen sparen, gerade in der Bastelphase in 
der du bist.
Wenn du den Port zufällig als Ausgang definierst und auf low setzt geht 
dein AVR in Rauch und wohlgefallen auf.

Zum anderen nutzt man die Widerstände auch zum Entprellung der Eingänge.

Du kannst 1-8 von deinem Dip-Switch auf GND legen und die internen 
PullUps ziehen. (PORTA = 0xFF;)
Probiere dann if ( PINA | (1<<PA1) ) // Schalter offen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

LinuxMint_User schrieb:
> Wenn du den Port zufällig als Ausgang definierst und auf low setzt geht
> dein AVR in Rauch und wohlgefallen auf.
Das tut er nicht. Schon oft probiert und nichts hat geraucht...

> Zum anderen nutzt man die Widerstände auch zum Entprellung der Eingänge.
Das ist dann eine längere Schreibweise für "Murks".

Unglücklich an dieser Konstellation ist lediglich, dass dei Schalter 
nach Vcc schalten. So liegen die internen PullUps des Ports nutzlos 
herum. Das ist einer der beliebtesten Anfängerfehler...  ;-)

von Markus (Gast)


Lesenswert?

LinuxMint_User schrieb:
> Du kannst 1-8 von deinem Dip-Switch auf GND legen und die internen
>
> PullUps ziehen. (PORTA = 0xFF;)
>
> Probiere dann if ( PINA | (1<<PA1) ) // Schalter offen

Okay, so werde ich es probieren. Die Leiterbahn werde ich schon 
irgendwie durchtrennen können. und ein dünnes Drähtchen an GNG legen.
Tja, wirklich dumm gelaufen...
Danke an alle.

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.