Forum: Mikrocontroller und Digitale Elektronik C++ if-Bedienung


von laurentdm (Gast)


Angehängte Dateien:

Lesenswert?

Guten Mittag liebe Leute.

Ich habe ein Tastenfeld 4x4 sowie einen STM32F407 Mikrocontroller, 
welcher über Eclipse in c++ programmiert wird.

Nun habe ich eine if-Bediegnung erstellt, welche abfragt in welcher 
Reihenfolge die Taster gedrückt wurde (in diesem Fall zuerst 1 danach 
2).
Wenn nur zwei Bedienungen wahr sein müssen funktioniert dies perfekt
1
if((var_tast1 == 2) && (var_tast2 == 1))

Sobal die if-Bedingung jedoch mehr als 2 Variabeln abfragen muss, wird 
die if-Bedienung nie ausgeführt.

1
if((var_tast1 == 3) && (var_tast2 == 2) && (var_tast3 == 1))

Könnte mir jemand helfen woran, dass dies liegt?

PS: Mein Code befindet sich im Anhang

von Peter II (Gast)


Lesenswert?

laurentdm schrieb:
> Sobal die if-Bedingung jedoch mehr als 2 Variabeln abfragen muss, wird
> die if-Bedienung nie ausgeführt.
>
> if((var_tast1 == 3) && (var_tast2 == 2) && (var_tast3 == 1))

doch, das muss funktionieren. Vermutlich steht in var_test1 - var_test3 
nicht das drin was du erwartest.

von Ralf G. (ralg)


Lesenswert?

Welchen Wert die Variablen haben, wenn 'var_taste == 0' überblicke ich 
gerade nicht. Wenn 'var_taste > 0' und damit die Verschiebung der Werte 
eingeleitet wird, dann ist die nachfolgende Abfrage niemals erfüllt.

Soll das so sein?
Gibt es überhaupt die Möglichkeit, dass die Variablen alle die 
aufgezählten Werte annehmen können? Und zwar alle zugleich spätestens in 
dem Moment, wenn der 'programcounter' dort an der Abfrage vorbeikommt?

von laurentdm (Gast)


Lesenswert?

Peter II schrieb:
> doch, das muss funktionieren. Vermutlich steht in var_test1 - var_test3
> nicht das drin was du erwartest.

Bin bereits einige Male Step-by-Step durch das Programm gegangen. Jedes 
mal konnte ich die If-Bediengung ausführen. Doch sobald ich das Programm 
laufen lasse komme ich nicht in die If-Bediengung.

Habe ebenfalls beim Step-by-Step die Werte der Variabeln var_test1 bis 
var_test3 fortlaufend verglichen und diese waren alle korrekt.
Weiss langsam echt nicht mehr was ich noch probieren soll :S

von laurentdm (Gast)


Lesenswert?

Ralf G. schrieb:
> Welchen Wert die Variablen haben, wenn 'var_taste == 0' überblicke
> ich
> gerade nicht. Wenn 'var_taste > 0' und damit die Verschiebung der Werte
> eingeleitet wird, dann ist die nachfolgende Abfrage niemals erfüllt.
>
> Soll das so sein?
> Gibt es überhaupt die Möglichkeit, dass die Variablen alle die
> aufgezählten Werte annehmen können? Und zwar alle zugleich spätestens in
> dem Moment, wenn der 'programcounter' dort an der Abfrage vorbeikommt?

Wie meinst du, dass die nachfolgende Abfrage wird niemals erfüllt?

Ja die Variabeln var_Tast1 - var_Tast9 können (& haben bereits | wurde 
getestet) die Werte 1-16 annehmen. Das sollte kein Problem sein.

von Ralf G. (ralg)


Lesenswert?

laurentdm schrieb:
> Wie meinst du, dass die nachfolgende Abfrage wird niemals erfüllt?

Könnte doch. Ich hab' mich von der gleichmäßigen Zahlenfolge ('var_tast1 
== 9' ... 'var_tast9 == 1') irritieren lassen...

von Peter II (Gast)


Lesenswert?

laurentdm schrieb:
> Weiss langsam echt nicht mehr was ich noch probieren soll :S

dann musst du dir eine Möglichkeit der Diagnose schaffen, dein Programm 
ist recht undurchschaubar für fremde.

Ich würde vermuten das es kurzeitig zur erkennen einer anderen Taste 
kommt.

von grundschüler (Gast)


Lesenswert?

mit lcd den Inhalt der variablen anzeigen lassen, dann klärt sich das 
schnell. Alles andere ist un ökonomisch.

lcd_int(var_tast1);lcd_int(var_tast2);lcd_int(var_tast3);...
if((var_tast1 == 3) && (var_tast2 == 2) && (var_tast3 == 1))

von Peter D. (peda)


Lesenswert?

Versuch mal, statt einem undurchdringlichen Codeknäuel, das Programm in 
einzelne Funktionsmodule zu zerlegen.
Z.B.:
- Taste einlesen
- eingelesenen Tastecode entprellen
- Flanke gedrückt erkennen
- Tastendrücke in Puffer einlesen
- Puffer vergleichen
usw.

Und dann sag Deinem Editor, Tabs durch Leerzeichen ersetzen.
Und dann poste Quelltexte als *.c bzw *.cpp.

von rmu (Gast)


Lesenswert?

An dem Code ist einiges Wirr. Das Zeug nach der Endlosschleife wird 
sicher nicht ausgeführt. Das nach der zweiten Endlosschleife auch nicht.

Factories haben auf einem µC normalerweise keine Berechtigung, das 
Problem, das eine Factory löst, hat man dort nicht.

Die Delay-Routine wird vermutlich zu gar nichts compiliert, der NOP 
Kommentar sollte durch ein reales nop ersetzt werden.

Falls das Taster in einer Art Matrix abfragt, sollte man eine 
Entprellung  (in die SW) einbauen.

Anstatt so eine komplizierte Geschichte mit den vielen var_tast würde 
ich ein array / string verwenden, in den der Reihe nach alle gedrückten 
Tasten abspeichern, und dann im Fall des Falles den String / das Array 
mit dem abgespeicherten vergleichen.

Und oder einen Schlüssel an den String anhängen, das ganze dann durch 
SHA256 durchnudeln, und mit dem abgespeicherten "Geheimnis" vergleichen. 
kann man beliebig hirnrissig machen.

von Peter II (Gast)


Lesenswert?

und entferne das delay das funktioniert so eh nicht.

von Cyborg (Gast)


Lesenswert?

laurentdm schrieb:
> Eclipse

Warum belästigst du rechtschaffende hart arbeitende Leute mit deinen
Algorythmenproblemen, wenn du die Werkzeuge haben und bedienen müsstest,
um den Fehler selbst zu finden? Gewöhnlich kann man das mit dem Debugger
erledigen, aber andere Leute fragen, macht ja weniger Mühe.
Übrigens sieht mir dein Script mehr nach C und nicht nach C++ aus, aber
da kann ich mich auch irren. Ansonsten scheinst du ja zu wissen, was
du tust.
Beim Tasten einlesen hat man manchmal das Problem, das die Tasten
prellen und das muss man dann per sinnvoller Routine kompensieren.
Ist aber nichts neues, eher ein alter Hut.

von Dirk B. (dirkb2)


Lesenswert?

Bei Variablennamen, die sich nur durch eine laufende Nummer 
unterscheiden, läuft etwas verkehrt.

Mach Arrays daraus.

von Peter II (Gast)


Lesenswert?

Cyborg schrieb:
> Übrigens sieht mir dein Script mehr nach C und nicht nach C++ aus, aber
> da kann ich mich auch irren.

hast du überhaupt den Quelltext angeschaut?
1
using namespace QP;
2
BSP_init();      // Initialize board specific stuff
3
QF::init();      // Initialize execution framework
4
factory.build();

von häää (Gast)


Lesenswert?

> Bei Variablennamen, die sich nur durch eine laufende Nummer
> unterscheiden, läuft etwas verkehrt.

Das ist doch ein Schwachsinn.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

häää schrieb:
>> Bei Variablennamen, die sich nur durch eine laufende Nummer
>> unterscheiden, läuft etwas verkehrt.
>
> Das ist doch ein Schwachsinn.

 Mit Sicherheit nicht.

Dirk B. schrieb:
> Mach Arrays daraus.

 Das macht schon eher Sinn.

von Cyborg (Gast)


Lesenswert?

häää schrieb:
> Das ist doch ein Schwachsinn.

Der Satz oder der Sachverhalt?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Cyborg schrieb:
> häää schrieb:
>> Das ist doch ein Schwachsinn.
>
> Der Satz oder der Sachverhalt?

 Weder noch, wird wohl eher der sein, den du zitiert hast.

von nicht"Gast" (Gast)


Lesenswert?

laurentdm schrieb:
> Peter II schrieb:
>> doch, das muss funktionieren. Vermutlich steht in var_test1 - var_test3
>> nicht das drin was du erwartest.
>
> Bin bereits einige Male Step-by-Step durch das Programm gegangen. Jedes
> mal konnte ich die If-Bediengung ausführen. Doch sobald ich das Programm
> laufen lasse komme ich nicht in die If-Bediengung.
>
> Habe ebenfalls beim Step-by-Step die Werte der Variabeln var_test1 bis
> var_test3 fortlaufend verglichen und diese waren alle korrekt.
> Weiss langsam echt nicht mehr was ich noch probieren soll :S

Spendiere deinem if noch einen else Zweig und setzte dort den 
Breakpoint. Dann kannst du in Ruhe nachschauen, wie die Werte sind.

von nicht"Gast" (Gast)


Lesenswert?

Dir ist aufgefallen, dass du direkt nach einer endlos while Schleife 
eine endlos do/while Schleife hast?
1
while (true)
2
  {
3
    do
4
    {
5
                     ... zu viel code
6
                }
7
    while(1);
8
  }

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.