Forum: Mikrocontroller und Digitale Elektronik C Anfängerproblem


von Micha (Gast)


Lesenswert?

Hallo ich fange grad mit C an und habe da ein Verständnisproblem.

Die Aufgabe ist:
Taster an PB0
LED an PB1
Wenn PB0 1, dann PB1 auf 1

wie so muss bei
    PORTB = 0b00000011;
binär 3 stehen ??
es müsste doch 2 stehen ?
PORTB = 0b00000010;
"schalte PB1 auf 1" ??

Die 0x01 ist doch schon gegeben ??

Grüße Michael

PS. hier der Code




#define F_CPU 3686400
#include <avr\io.h>


main()
{
    /*Programm / Funktion ...
  */
  DDRB = 0b00000010; // PortB.0 als InputPortB.1 als Output
        PORTB = 0b00000001; // PullUp
        while(true)
        {
        // CASE: Taste?
          if((!(PINB&0b00000001))   )
                {
                // LED on
                    PORTB = 0b00000011;
                    }else
                {
                // LED off
                    PORTB = 0b00000000;
                    }
                }

}

von Karl H. (kbuchegg)


Lesenswert?

Micha schrieb:

> wie so muss bei
>     PORTB = 0b00000011;
> binär 3 stehen ??
> es müsste doch 2 stehen ?
> PORTB = 0b00000010;
> "schalte PB1 auf 1" ??

Schon.
Aber du hast eine Nebenbedingung


>   DDRB = 0b00000010; // PortB.0 als InputPortB.1 als Output
>         PORTB = 0b00000001; // PullUp

den Pullup.
Wenn du in weiterer Folge an PORTB eine 0b00000010 ausgibst, schaltest 
du den Pullup wieder ab, denn das Bit 0 ist ja 0. Und das willst du 
nicht, denn dann funktioniert deine Tastenauswertung nicht richtig.


Und genau aus dem Grund macht man das auch nicht so, dass man dem Port 
als Ganzes ohne Rücksicht auf Verluste was zuweist, sondern man setzt 
nur das 1 Bit

  PORTB |= ( 1 << PB1 );

denn dann werden diese Nebenbedingungen automatisch berücksichtigt.


  PORTB |= ( 1 << PB1 );     // auf 1 setzen
  PORTB &= ~( 1 << PB1 );    // auf 0 setzen



Edit:
Und genau hier
>                {
>                // LED off
>                    PORTB = 0b00000000;
>                    }

ist es dann passiert. Das schaltet nicht nur die LED aus, sondern auch 
den Pullup. Bye bye Taster - ab sofort ist zufällig, was der Taster 
liefert.

von xfr (Gast)


Lesenswert?

Weil Du durch die Zuweisung immer alle 8 Bits auf einmal setzt. Wenn 
PORTB vorher 0b00000001 war und Du dann 0b00000010 zuweist, dann hat er 
danach eben den Wert 0b00000010 und nicht 0b00000011.

Wenn Du nur einzelne Bits ändern willst, musst Du in C zuerst den alten 
Wert lesen, das Bit mit einer Maske ändern und den ganzen Wert wieder 
zurückschreiben:
http://www.mikrocontroller.net/articles/Bitmanipulation

von Micha (Gast)


Lesenswert?

Danke Karl Heinz ;-)

das mit diesen ganzen (Profi)kürzeln muss ich erst noch lernen :)

Aber da stellt sich mir jetzt gleich noch ne Frage:

Wenn ich dann PORTB 0x03 setze, hätte ich mir doch das Pullup setzen 
oben am Anfang sparen können ?
Oder sehe ich da was falsch ?

von Karl H. (kbuchegg)


Lesenswert?

Micha schrieb:
> Danke Karl Heinz ;-)
>
> das mit diesen ganzen (Profi)kürzeln muss ich erst noch lernen :)
>
> Aber da stellt sich mir jetzt gleich noch ne Frage:
>
> Wenn ich dann PORTB 0x03 setze, hätte ich mir doch das Pullup setzen
> oben am Anfang sparen können ?

Und wer garantiert dir, dass dann bei der allerersten Pin Abfrage das 
korrekte Ergebnis rauskommt, wenn der Pullup erst als Folge dieser 
allerersten Abfrage eingschaltet wird?

> Oder sehe ich da was falsch ?

Du bellst den falschen Baum an.
Mach es "richtig", dann brauchst du keine derartigen Was-wäre-wenn 
Spielchen.

von Micha (Gast)


Lesenswert?

Danke, xfr, damit wäre die 2. Frage auch beantwortet ;-)

von Micha (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du bellst den falschen Baum an.
>
> Mach es "richtig", dann brauchst du keine derartigen Was-wäre-wenn
>
> Spielchen.

Das sagt sich leicht................
Ich habe mir hier das Tutorial gedruckt und einige Bücher gekauft und 
mache nun meine ersten "Gehversuche".
Die "Fragespielchen" helfen aber gut beim verstehen von Sachen welche 
für einen der das schon ne Weile macht, vollkommen logisch sind....

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.