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; } } }
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.
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
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 ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.