Forum: Mikrocontroller und Digitale Elektronik Eingang hat immer 5 V Atmega 32


von Hans (Gast)


Lesenswert?

Hallo Ich möchte den Eingang PB0 meines Atmega 32 benutzen.
Leider gibt mir liegen dort direkt 5 V an ohne in zu beschalten.

DDRB &= ~(1 << PB0);  // damit ist dann PB0 ein Eingang
DDRB = 0x01;           // Kompletten Port B als Eingang definieren 
(DDB0....DDB7)
PORTB = 0xfe;          // Pull-up Widerstand einschalten (Interner 
Widerstand von PB0....PB7)

Sollte doch eigentlich richtig sein oder ?

von Georg G. (df2au)


Lesenswert?

Hans schrieb:
> DDRB &= ~(1 << PB0);  // damit ist dann PB0 ein Eingang
> DDRB = 0x01;           // Kompletten Port B als Eingang definieren
Denk doch bitte noch einmal über diese beiden Zeilen nach.

Und, ein offener Eingang, der den Pullup aktiv hat, wird Vcc (meist 5V) 
anzeigen. Das ist der Sinn des Pullup.

von Zweifler (Gast)


Lesenswert?

Hans schrieb:
> Leider gibt mir liegen dort direkt 5 V an ohne in zu beschalten.
>
> DDRB &= ~(1 << PB0);  // damit ist dann PB0 ein Eingang

Was erwartest Du denn an diesem Eingang? Bedenke, Du hast einen 
pullup-Widerstand nach 5V geschaltet.

von S. Landolt (Gast)


Lesenswert?

> Eingang, der den Pullup aktiv hat
>  hast einen pullup-Widerstand nach 5V geschaltet.
Pardon, hatte erst zwei Tassen Kaffee, wo wird hier dieser Pullup auf B0 
eingeschaltet?
 Ich sehe B0 als Ausgang und auf GND, kann mir also das beschriebene 
Verhalten nicht erklären.

von Georg G. (df2au)


Lesenswert?

Mal die Kommentare etwas berichtigt:

Hans schrieb:
> DDRB &= ~(1 << PB0);  // damit ist dann PB0 ein Eingang
Stimmt.

> DDRB = 0x01;           // Kompletten Port B als Eingang definieren
Falsch, damit werden DB7...DB1 Eingänge, DB0 wird Ausgang.

> PORTB = 0xfe;          // Pull-up Widerstand einschalten (Interner
Fast richtig. Die Pullups für DB7...DB1 werden eingeschaltet, DB0 geht 
auf LOW.

von HildeK (Gast)


Lesenswert?

S. Landolt schrieb:
> Ich sehe B0 als Ausgang und auf GND, kann mir also das beschriebene
> Verhalten nicht erklären.

Ich auch, aber die Erklärung sitzt vor dem Bildschirm :-).

von Hans (Gast)


Lesenswert?

DDRB &= ~( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3)| (1<<PB4)| (1<<PB5)| 
(1<<PB6)| (1<<PB7));
PORTB |= ( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3)| (1<<PB4)| (1<<PB5)| 
(1<<PB6)| (1<<PB7) );


so wäre es besser?

von Georg G. (df2au)


Lesenswert?

Hans schrieb:
> DDRB &= ~( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3)| (1<<PB4)| (1<<PB5)|
> (1<<PB6)| (1<<PB7));
Setzt alle Portbits auf Ausgang.

> PORTB |= ( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3)| (1<<PB4)| (1<<PB5)|
> (1<<PB6)| (1<<PB7) );
Setzt alle Portbits auf HIGH

> so wäre es besser?
Gute Frage. Was willst du erreichen?

von Hans (Gast)


Lesenswert?

Port B als Eingang und Pullup Widerstand aktiv

von Georg G. (df2au)


Lesenswert?

Hans schrieb:
> Port B als Eingang und Pullup Widerstand aktiv

DDRB = 0; alle Pins sind Eingang
PORTB = 0xff; alle Pins haben Pullup

von Hans (Gast)


Lesenswert?

Hat dieser Anweisung noch Auswirkung auf andere Ports ?

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


Lesenswert?

Georg G. schrieb:
> Gute Frage. Was willst du erreichen?
Genau das frage ich mich auch...

Hans schrieb:
> Hallo Ich möchte den Eingang PB0 meines Atmega 32 benutzen.
> Leider gibt mir liegen dort direkt 5 V an ohne in zu beschalten.
Was würdest du dir denn sonst wünschen? Der Portpin kann ja nur 1 oder 
0 nach innen geben. Und es ist eben eine enorm schlechte Idee, einen 
CMOS Eingang unbeschaltet zu lassen.

Hans schrieb:
> Hat dieser Anweisung noch Auswirkung auf andere Ports ?
Nein, nur auf den Port B.

von HildeK (Gast)


Lesenswert?

Georg G. schrieb:
> Hans schrieb:
>> DDRB &= ~( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3)| (1<<PB4)| (1<<PB5)|
>> (1<<PB6)| (1<<PB7));
> Setzt alle Portbits auf Ausgang.
Ähh, sicher? Das ist doch das selbe wie DDRB = 0; und bewirkt damit: 
setze alle Portbits auf Eingang!
>
>> PORTB |= ( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3)| (1<<PB4)| (1<<PB5)|
>> (1<<PB6)| (1<<PB7) );
> Setzt alle Portbits auf HIGH
Weil oben auf Eingang gesetzt wurde, wird hier der Pullup aktiv.

Das ist dann schon das, was der TO wollte ...

von Kurt (Gast)


Lesenswert?

HildeK schrieb:

|
>>> (1<<PB6)| (1<<PB7) );
>> Setzt alle Portbits auf HIGH
> Weil oben auf Eingang gesetzt wurde, wird hier der Pullup aktiv.
>
> Das ist dann schon das, was der TO wollte ...

Er wundert sich aber wieso da 5V anliegen.

 Kurt

von HildeK (Gast)


Lesenswert?

Kurt schrieb:
> Er wundert sich aber wieso da 5V anliegen.

Ja, ich weiß, er wollte Eingang mit aktivem Pullup, hat das eingestellt 
und misst dann (hochohmig? - ich nehme nicht an, dass er den Ausgang 
belastet hat) am Eingang 5V und wundert sich über das korrekte Verhalten 
:-).

Aber, die Aussage von Georg G., es sei bei der Einstellung
1
DDRB &= ~( (1<<PB0) | (1<<PB1) | (1<<PB2)| (1<<PB3) | (1<<PB4) | (1<<PB5)| 1<<PB6) | (1<<PB7));
alles am PORTB auf Ausgang, die wollte ich korrigieren.

von Georg G. (df2au)


Lesenswert?

HildeK schrieb:
> Ähh, sicher?

Sorry, hatte das ~ übersehen.

von HildeK (Gast)


Lesenswert?

Georg G. schrieb:
> Sorry, hatte das ~ übersehen.

Ja, und auch das '&' - oder? :-)

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.