C Anfängerproblem

Gast #2921525
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;
                    }
                }

}
#2921529
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.
Gast #2921534
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
Gast #2921546
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 ?
#2921549
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.
Gast #2921579
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....

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.