PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zwei Taster in C Programm als XOR



Woftschik
14.04.2009, 19:34
Hallo Leute!!!

Habe mich schon mit Bücher und googel rumgeschlagen, aber ich finde leider nichts, oder ich bin zu blöd.

Folgedes Problemm habe ich...

Ich möchte gerne zwei Taster als XOR Funktion einbinden.
Der Taster zwei an PIND2 soll die Variable um eins addieren (+ 1),
der Taster drei an PIND3 soll die Variable um eins subtrahieren (-1).

Hier das Programm das ich geschrieben habe, leider ohne funktion (wird nur 10 angezeigt)



int variable = 10;


if (PIND & (1 << PIND2))
{
variable + 1;
lcd_clrscr();
itoa (variable, buffer, 10);
lcd_puts( buffer);
delay_ms (500);
}

else if (PIND & (1 << PIND3))

variable - 1;
lcd_clrscr();
itoa (variable, buffer, 10);
lcd_puts( buffer);
delay_ms (500);


Ich benuzte die LCD library von Peter Fleury

Kann mir jemand helfen???

Jaecko
14.04.2009, 19:43
Naja, eigentlich klar.
Was macht denn das hier:


variable + 1;


Er zählt zwar 1 zu variable dazu... nur wo speichert er das Ergebnis? Nirgendwo.
Es sollte eine der folgenden Varianten sein:


variable++;
variable = variable + 1;
variable += 1;


Für Minus genau so.

Woftschik
14.04.2009, 19:53
Oh ja Danke!
durch das wilde rumexperemenietren habe ich dort was vergessen.

Trotzdem funktioniert das nicht, die Taster werden irgendwie nicht erkannt oder so, auf jeden fall ändert sich nichts.

Jaecko
14.04.2009, 20:09
Was mir noch auffällt: um den unteren Textblock (im Else If) fehlen die { }, es wird also bei dem Else If NUR das Variable -1 durchgeführt.
Der andere Teil wird immer ausgeführt:


lcd_clrscr();
itoa (variable, buffer, 10);
lcd_puts( buffer);
delay_ms (500);

Woftschik
14.04.2009, 20:35
@Jaecko

Jaecko schrieb
es wird also bei dem Else If NUR das Variable -1 durchgeführt.

Ok ich weiß zwar nicht wieso das so ist aber ich habe die Klammer jetzt mit reingenommen.
Leider habe ich immer noch nicht die gewünschte Funktion.
Wenn ich den Taster an PIND2 betätige zeigt mir das Display eine 9 an??????? :-k :-k


Danke das du dir Zeit nimmst um mir zu helfen!

Jaecko
14.04.2009, 21:13
Das mit den Klammern muss deshalb rein, da u.a. bei if... else... nur immer die nachfolgende Anweisung ausgeführt wird.

Also hier wird F1 nur dann ausgeführt, wenn die Bedingung wahr ist. F2 wird immer ausgeführt, unabhängig von der Bedingung.

if (Bedingung)
F1();
F2();

Setzt man das ganze in Klammern { }, wird der gesamte Block ausgeführt:
if (Bedingung)
{
F1();
F2();
}

Hier werden beide Anweisungen ausgeführt, wenn die Bedingung wahr ist.

Wie hast du denn die Taster angeschlossen? Also welchen Pegel hat der Pin im Ruhezustand und welchen, wenn er gedrückt wird?

Schreib auch mal den jetzigen Zustand des Programms rein.

Woftschik
14.04.2009, 21:37
Hi

Ok bin dann was schlauer geworden, DANKE!! :cheesy:

Die Taster führen Null signal!
Lass dich von den # Zeichen nicht irretieren, sind nur da um die Zeichnung vernünftig darzustellen.

Masse (0 V)
# |
# |
|-\
# |------- Widerstand ------ +5V
# |
# ° PIND2


genauso auch bei PIND3

Der aktuelle stand des Programmes




int variable = 10;


if (PIND & (1 << PIND2))
{
variable++;
lcd_clrscr();
itoa (variable, buffer, 10);
lcd_puts( buffer);
delay_ms (500);
}

else if (PIND & (1 << PIND3))
{
variable--;
lcd_clrscr();
itoa (variable, buffer, 10);
lcd_puts( buffer);
delay_ms (500);
}

Jaecko
14.04.2009, 22:47
D.h. im "Leerlauf" liegen 5V an, beim Drücken des Tasters wird der Pin auf Masse gezogen.
Im Programm ist die Abfrage aber genau andersrum:
if (PIND & (1 << PIND3)) ist dann wahr, wenn der auf 5V liegt; bei dir also, wenn der Taster _nicht_ gedrückt ist.

Du müsstest also abfragen, ob der Pin 0 ist. Auch hier gibts wieder 2 Möglichkeiten:



if (!(PIND & (1 << PIND3)))
if ((PIND & (1 << PIND3)) == 0)

Woftschik
14.04.2009, 23:21
@Jaecko

Super, DANKE für deine Hilfe, es funktioniert jetzt!! :P