Guten Tag, ich habe ein kleines Problem, da ich noch sehr im Anfangsstadium des Arduino bin. In dem angehängten Sketch nur kurz zur Klarstellung der Variablen und Co ein paar erklärende Worte. altpos1 = Gibt mir die alte Position des 1. Einganges. neupos1 = Gibt mir die aktuell eingelesene Position des 1. Einganges altpos2 = Gibt mir die alte Position des 2. Einganges. neupos2 = Gibt mir die aktuell eingelesene Position des 2. Einganges pos1 Ist der 1. Eingang, der wiederum am Pin 11 des Unos angeschlossen ist. pos2 Ist der 2. Eingang, der wiederum am Pin 10 des Unos angeschlossen ist. positionsmotor Soll die Variable sein, die mir angibt, welche Taster bzw. welche Position nun angefahren werden muss. Dabei sollen die Positionen 1bis 8 später angefahren werden. (Vorerst allerdings nur 1bis4) anders1 und anders2 Geben mir an, ob sich der Wert geändert hat an den jeweiligen Eingängen 1, sowie 2. Mein derzeitiges problem ist es, dass wenn Taster1(Pin11) 1 auf 2 geschaltet wurde =korrekte Ausgabe 2 und danach der Taster2(Pin10) sich geändert hat von Beispielweise 3 auf 4 geschaltet wurde =korrekte Ausgabe 4 Nun erfolgt der Fehler wenn jetzt der Taster 1 wieder auf Position 2 gestellt wurde, dann kommt es nicht zur Ausgabe 2, sondern es passiert keine Ausgabe. logischerweise natürlich, da sich der 1. Taster ja auch nicht geändert hat... Leider stehe ich aktuell irgendwie auf der Leitung, sodass ich euch um Hilfe bitte. Vllt kann mir der ein oder andere einen Tipp geben, wie ich dies lösen kann. Vielen Dank Michael
Hallo, diese if ... else ... Konstruktionen sind nicht übersichtlich eingerückt. Ist das beim Arduino so üblich? mfg Klaus
Hallo Klaus, natürlich ist es nicht üblich. Wie gesagt bin noch ein frühzeitiger Arduino Fan. Im Anhang ist aber nun eine eingerückte Version. Sodass die IF.. Else... besser und übersichtlicher zu erkennen sind. Danke Michael
Klaus R. schrieb: > diese if ... else ... Konstruktionen sind nicht übersichtlich > eingerückt. Ist das beim Arduino so üblich? Nein. Der TO ist neu bei der Arduino-IDE und hat Ctrl-T (= Autoformat) noch nicht entdeckt. Zur Sache: sucht der TO ev. Drehgeber - da gibt's jede Menge Info dazu. leo
Klaus R. schrieb: > Ist das beim Arduino so üblich? Nein, man kann einfach in der IDE <ctrl>-T drücken (AUtomatische Formatierung), dann sieht es anders aus. Gefällt dir das besser?
außer dass die Formatierung grausam ist:
1 | if (neupos1>altpos1&anders1==0) |
willst du hier wirklich ein bitwise AND haben? Außerdem ist in C die Operator precedence ">" vor "==" vor "&", das kommt mir auch etwas ungewollt vor. Da Fehler ein paar Klammern damit das funktioniert wie ich denke dass es soll. Verbesser das mal und die Formatierung und meld dich dann nochmal falls du immer noch Fehler hast. https://en.cppreference.com/w/c/language/operator_precedence https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence EDIT: ist es gewollt dass das
1 | if (neupos2 > altpos2 & anders2 == 0) |
im else Zweig von
1 | if (neupos1 > altpos1 & anders1 == 0) |
steht?
:
Bearbeitet durch User
> ist es gewollt dass das >
1 | > if (neupos2 > altpos2 & anders2 == 0) |
2 | >
|
> im else Zweig von >
1 | > if (neupos1 > altpos1 & anders1 == 0) |
2 | >
|
steht? Hallo und vorab schonmal vielen Dank für die Antworten hier. Meine Idee bzw mein Vorhaben an der Geschichte ist, dass die Position ausgegeben werden soll, welche Position gedrückt wurde. ich habe derzeit 2 Taster. der 1. Taster macht Position 1 =bei Pin 11=Low Position 2 =bei Pin 11=High der 2. Taster macht Position 3 =bei Pin10=Low Position 4 =bei Pin10=High Das klappt an sich ja auch schon fast, nur ist das Problem, dass wenn Taster 1 beispielsweise Position 1 angetastet wurde und nun Taster 2 die Position 4 getastet wurde, dass jetzt nicht wieder die Position 1 angetastet werden kann mit dem 1. Taster, da dieser ja noch die Merkedrin hat, dass sich dieser Taster nicht geändert hat. Und somit die Position 1 nicht erneut ausgegeben wird. Hoffe konnte mein Anliegen einw enig klarer verfassen. Bezüglich deiner Aussage bitweise AND Ich verstehe deine Aussage dazu nicht so ganz. Mit dieser Zeile versuchte ich (neupos1 > altpos1) und (anders1 == 0) dass es nur angewendet wird, wenn die neue Position größer als die alte Position ist UND es eine Änderung im Schaltkanal gibt. Denn nur wenn der Eingang sich geändert hat, dass soll ja der Ausgang geändert werden. Meine Idee dahinter war es, dass es nur einen einmaligen Ausgang gibt, und kein ständiges Senden.
Nachdem ich den Quelltext mal gelesen habe, würde ich dir anraten mal nen Stift und Papier zu nehmen und ein Flussdiagram zu erstellen von dem was du erreichen willst. denn bis jetzt kannst du z.b. wenn du zuletzt Pos2 gändert hast nicht direkt zu dem jetzigen Wert von Pos1 wechseln, damit sich irgendetwas ändert muss sich Pos1 ändern: Angenommen Pos1 == 2, danach ändert sich Pos2 zu 4: 4 -> 3 Möglich 4 -> 2 Nicht möglich 4 -> 1 Möglich Michael K. schrieb: > Nun erfolgt der Fehler > wenn jetzt der Taster 1 wieder auf Position 2 gestellt wurde, dann kommt > es nicht zur Ausgabe 2, sondern es passiert keine Ausgabe. Da hast du einen Denkfehler, der Taster wird nicht wieder auf Position 2 gestellt, er wird nicht im geringsten verändert. dein Programm soll also ohne Eingabe erkennen dass du etwas ändern willst? Man kann Gehirnströme ableiten und auswerten aber das ist hier glaube ich nicht Sinn der Sache. Überdenk das Eingabe Konzept, das kann so nicht funktionieren, außer du Spendierst noch einen extra Taster um den jetzigen Wert von Pos1 bzw. Pos2 zu übernehmen. kann man machen, wird dann aber scheiße. dann lieber einen Knopf pro position, das ist wesentlich einfacher sowohl zu programmieren als auch zu verstehen. Oder einen Knopf / Drehgeber für Pos +/- 1 und dann ein Knopf um die Position zu übernehmen.
Michael K. schrieb: > Mit dieser Zeile versuchte ich > (neupos1 > altpos1) und (anders1 == 0) > dass es nur angewendet wird, wenn die neue Position größer als die alte > Position ist UND es eine Änderung im Schaltkanal gibt. tut es aber nicht & heißt eine AND Verknüpfung auf jedes einzelne Bit && heißt eine logische AND Verknüpfung, das was du suchst. Die Reihenfolge sollte aber tatsächlich stimmen, und du hast Glück dass TRUE == 1 ist (meistens) daher ist auch 1 bitwise_AND 1 dassselbe wie mit logischem AND lies dir unbedingt einen Artikel zu Operatoren durch, wenn du nicht den Unterschied zwischen logic und bitwise sowie Operator precedence kennst. Klingt jetzt vllt. nicht nett, aber das braucht man halt dringend. Im Zweifelsfall macht ne Klammer mehr (im gewissen Rahmen) das Konstrukt nur verständlicher, den Kompiler stören auch 2000 Klammern nicht. hier dachte ich zuerst das sdu was anderes erreichen willst.
:
Bearbeitet durch User
Vielen Dank für die Hilfe. Ich werde jetzt wirklich mal Zettel und Stift nehmen. Einen weiteren Schalter zu nehmen geht leider nicht. Da die Schalter wenn die Steuerung funktioniert ersetzt durch Befehle einer Steuerung. Melde mich wieder sofern ich ein Konzept auf Papier gemacht habe wieder. Vielleicht finde ich ja auch so die Lösung meines Problems. Aller Anfang ist halt schwer. Bezüglich der Operatoren Gibt es da eine gute internet Seite? Oder noch besser vllt. Ein wirklich brauchbares Buch ? Michael
Michael K. schrieb: > Dabei sollen die Positionen 1bis 8 später angefahren werden. > (Vorerst allerdings nur 1bis4) Mit 2 Eingängen kannst Du 4 Positionen kodieren, für 8 Positionen brauchst Du 3 Eingänge. Was Dein riesen Code bewirken soll, ist mir völlig unklar. Du mußt doch nur die 2 bzw. 3 Eingänge binär bewerten und schon hast Du die Zahl 0..3.
1 | uint8_t get_pos(bool in0, bool in1) |
2 | {
|
3 | uint8_t wert = 0; |
4 | if (in0 == true) |
5 | wert += 1<<0; |
6 | if (in1 == true) |
7 | wert += 1<<1; |
8 | return wert; |
9 | }
|
Michael K. schrieb: > wenn Taster 1 beispielsweise Position 1 angetastet wurde > und nun Taster 2 die Position 4 getastet wurde, > dass jetzt nicht wieder die Position 1 angetastet werden kann mit dem 1. > Taster, da dieser ja noch die Merkedrin hat, dass sich dieser Taster > nicht geändert hat. > Und somit die Position 1 nicht erneut ausgegeben wird. Ich verstehe nur Bahnhof. Die Beschreibung kommt dem uC wohl auch unlogisch vor.
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.