Also ich habe folgende frage. Wen ich den Wert eines Eingangs auslesen will mach ich das ja über das Register PINx. Bin aber über etwas gestolpert: Wen ich die Abfrage so schreibe dan funktioniert das. if ((PINC&0x04)==0) So leider nicht. if ((PINC&0x04)==1) Pullups sind eingeschaltet. Taster ligt an Eingang und ist and GND angeschlossen. Wieso hat er mit ==1 ein Problem? switch(PINC&0x04) { case 0: LED_1_on; case 1: LED_1_off; } Funktioniert wiederum. Also sind och beide Werte vorhanden. Was hab ich da bei der IF abfrage nicht gescheckt? Da PINC&0x04 ==> 1 oder 0 ist (1 oder 0) == 1 Das muss doch in einem Fall true sein. Danke für eure Hilfe. Seh grad vor lauter Bäumen den Wald nicht mehr.
PINC&0x04 ergibt 0 und 4 und nicht 0 und 1 !!! versuche mal das hier: if ((PINC&0x04)==0x04) ...
gast hat es schon gesagt. Anscheind hast Du die Operation an sich nicht verstanden. & = bitweise und verknüpfung Port c (z.b.) 00101100 & Maske 00000100 = 00000100 oder 0000000 In der Regel funktioniert auch folgendes: if (PINC&0x04) { } Da alles ungleich 0 wahr ist.
Sven H. wrote: > In der Regel funktioniert auch folgendes: > > if (PINC&0x04) > { > > } Nicht nur "in der Regel". Es sollte in solchen Fällen grundsätzlich die "erzwungene" Auswertung als Wahrheitswert benutzt werden. Erstens erspart das Schreib- und Nachdenkarbeit, zweitens ist damit auch gewährleistet, dass es keine Schwulitäten mit der integer promotion gibt.
> switch(PINC&0x04) > { > case 0: > LED_1_on; > > case 1: > LED_1_off; > } Kann mir nicht vorstellen, dass das so funktioniert. Mal abgesehen davon dass LED1_on/off hier keine Funktionen sondern Makros sind, sollte die LED mit diesem Code immer aus sein. Jeder case-Zweig muss mit einer 'break'-Anweisung beendet werden, sonst rauscht dein Controller ungebremst in den nächsten Case-Zweig.
Hmm... wrote:
> Kann mir nicht vorstellen, dass das so funktioniert.
Stimmt, das kann so nicht funktionieren.
Also da hab ich was schönes angerichtet. Der Grund für meine frgae oben war: Ha ca. 1 jahr nix mehr programmiert. Und dan wollte das irgendwie nicht. Ihr habt natürlich recht. Switch-case ist schrott so. Nun hab ich das Problem auch gefunden. Hab da aber noch ne frage: Ich hab das mit schönen Macros programmiert. Wie macht ihr das? // LED 1 #define LED_1_port PORTC #define LED_1_ddr DDRC #define LED_1_bit 0 // Taster 1 #define taster_1_port PORTC #define taster_1_pin PINC #define taster_1_ddr DDRC #define taster_1_bit 2 #define LED_1_on LED_1_port &= ~_BV(LED_1_bit) #define LED_1_off LED_1_port |= _BV(LED_1_bit) #define taster_1_get (taster_1_pin & _BV(taster_1_bit)) Mit meiner Tasterabfrage erhalte ich einfach 0 oder 1,2,4,8,16. Solange man das weis. Wusst ich leider nicht mehr. :)
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.