Forum: Mikrocontroller und Digitale Elektronik Pull up Widerstand


von Mike (Gast)


Lesenswert?

Hi,
Wenn ich im Code hinschreibien
1
DDRB &= ~(1<<PB0);
2
  PORTB |= (1<<PB0);
dann habe ich doch den Pin PB0 als Eingang deklariert und den inneren 
Pullup-Widerstand aktiviert oder?
Das heisst, ich muss den Pin mit GND verbinden um ihn zu schalten. Im 
Code schreibe ich dann
1
if(!(PINB&(1<<PINB0))){}
Jetzt habe ich das ganze auf einem STeckbrett aufgebaut um es zu testen. 
Als Signal soll nur eine LED angehen, wenn PB0 mit GND verbunden ist.
Jetzt habe ich das aufgebaut und PB0 kann ich mit einem "Steckkabel"? 
mit GND verbinden.
Allerdings hat er das dann trotzdem nicht gemacht. Erst als ich einen 
Widerstand (10k) zwischen VCC und PB0 gesetzt habe macht er das.
Meine Frage ist jetzt warum ich einen Widerstand einsetzen muss? 
eigentlich habe ich doch oben gesagt, dass er den inneren Widerstand 
nehmen soll.

von Max H. (hartl192)


Lesenswert?

Der Fehler liegt in Zeile 5.

von Wolfgang (Gast)


Lesenswert?

Mike schrieb:
> Wenn ich im Code hinschreibien
>   DDRB &= ~(1<<PB0);
>   PORTB |= (1<<PB0);
> dann habe ich doch den Pin PB0 als Eingang deklariert und den inneren
> Pullup-Widerstand aktiviert oder?

Das kommt drauf an, auf was für einem Prozessor dein Code laufen soll.
Bei (vielen?) ATmega mußt du noch das PUD-Bit löschen.

von Mike (Gast)


Lesenswert?

???
Meintest, dass du der ganze Code fehlt? Dann bitte sagen.
1
#define F_CPU 1000000UL
2
#inclue <avr/io.h>
3
4
5
6
int main(void) {
7
  DDRB &= ~(1<<PB0);    // PB4 -> Eingang
8
  PORTB |= (1<<PB0);  // PB4 -> interner Pullupwiderstand
9
  DDRB |= (1<<PB1);  //PB0 -> Ausgang  
10
  PORTB &= ~(1<<PB1);  // PB0 -> low 
11
12
  while(1){
13
    if(!(PINB&(1<<PINB0))){
14
       PORTB |= (1<<PB1); 
15
    }
16
    else{
17
      PORTB &= ~(1<<PB1);
18
    }
19
  }
20
}

von Mike (Gast)


Lesenswert?

Ah,
das ganze möchte ich auf einen ATTINY85 machen.

von Wolfgang (Gast)


Lesenswert?

Mike schrieb:
> #inclue <avr/io.h>

So kann das nichts werden. Dein Compiler wird dich mit Fehlermeldungen 
zugeschmissen haben, weil er die prozessorspezifischen Register nicht 
kennt.

von Mike (Gast)


Lesenswert?

1
#include <avr/io.h>
war nur ein abschreibefehler. Fehler gibt es keine.

von Asf (Gast)


Lesenswert?

Mit PORTB &= ~(1<<PB1); schaltest Du den Pullup ja wieder aus

von Helfer (Gast)


Lesenswert?

Abgesehen von der etwas verwirrenden Kommentierung ist der Code in der 
Simulation im AVR Studio lauffähig. Dort kann man ja das Bit PINB0 per 
Hand setzen und die Reaktion des PORTB1 beobachten. Ist die 
Hardwarebeschaltung ok?
Gruß Toralf

von Rolf Magnus (Gast)


Lesenswert?

Mike schrieb:
> #include <avr/io.h>war nur ein abschreibefehler. Fehler gibt es keine.

Hmm, Abschreibfehler? Kannst du nicht einfach den Originalcode schicken 
statt irgendwas abgeschriebenes?

Asf schrieb:
> Mit PORTB &= ~(1<<PB1); schaltest Du den Pullup ja wieder aus

Warum sollte das den Pullup von PB0 ausschalten?

von Susan (Gast)


Lesenswert?

Ich musste es abschreiben, da der Code auf einem Computer war, mit dem 
ich nicht ins Internet gehen kann. Daher habe ich das auf einem anderen 
Computer abgeschrieben.

von F. F. (foldi)


Lesenswert?

Mike schrieb:
> ???
> Meintest, dass du der ganze Code fehlt? Dann bitte sagen.
>
>
1
> #define F_CPU 1000000UL
2
> #inclue <avr/io.h>
3
> 
4
> 
5
> 
6
> int main(void) {
7
>   DDRB &= ~(1<<PB0);    // PB4 -> Eingang
8
>   PORTB |= (1<<PB0);  // PB4 -> interner Pullupwiderstand
9
>   DDRB |= (1<<PB1);  //PB0 -> Ausgang
10
>   PORTB &= ~(1<<PB1);  // PB0 -> low
11
> 
12
>   while(1){
13
>     if(!(PINB&(1<<PINB0))){
14
>        PORTB |= (1<<PB1);
15
>     }
16
>     else{
17
>       PORTB &= ~(1<<PB1);
18
>     }
19
>   }
20
> }
21
>

Der Code ist völlig richtig (oder ich habe Tomaten auf den Augen und 
sehe etwas nicht) und steht so in jedem Anfängerbuch beschrieben.
Es wird dein Steckbrett sein, was dir einen Streich spielt.
Kommt schon öfter vor und man legt sich immer wieder damit rein.
Kleiner Tipp: Löte dir für so einen Tiny doch was auf Lochraster 
zusammen.

: Bearbeitet durch User
von T.roll (Gast)


Lesenswert?

Mike schrieb:
> DDRB &= ~(1<<PB0);    // PB4 -> Eingang
>   PORTB |= (1<<PB0);  // PB4 -> interner Pullupwiderstand

Die magische Kugel sagt mir: Du benutzt PB0 hast die LED aber an PB4.
Überprüfe deinen Hardwareaufbau nochmal ganz genau. Wenn im Code schon 
verschiedene Pins beschrieben werden, ist in der Hardware auch gerne ein 
Fehler drin.

von F. F. (foldi)


Lesenswert?

T.roll schrieb:
> Mike schrieb:
>> DDRB &= ~(1<<PB0);    // PB4 -> Eingang
>>   PORTB |= (1<<PB0);  // PB4 -> interner Pullupwiderstand
>
> Die magische Kugel sagt mir: Du benutzt PB0 hast die LED aber an PB4.
> Überprüfe deinen Hardwareaufbau nochmal ganz genau. Wenn im Code schon
> verschiedene Pins beschrieben werden, ist in der Hardware auch gerne ein
> Fehler drin.

Guck mal, doch Tomaten auf den Augen. :-)
Hatte den Kommentar gar nicht gelesen/übersehen, dass der anders war.

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.