Forum: Mikrocontroller und Digitale Elektronik Flankenauswertung für 2 Eingänge


von Michael K. (sirmkay)


Angehängte Dateien:

Lesenswert?

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

von Klaus R. (klara)


Lesenswert?

Hallo,
diese if ... else ... Konstruktionen sind nicht übersichtlich 
eingerückt. Ist das beim Arduino so üblich?
mfg Klaus

von Michael K. (sirmkay)


Angehängte Dateien:

Lesenswert?

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

von leo (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

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?

von K. S. (the_yrr)


Lesenswert?

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
von Michael K. (sirmkay)


Lesenswert?

> 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.

von K. S. (the_yrr)


Lesenswert?

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.

von K. S. (the_yrr)


Lesenswert?

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
von Klaus R. (klara)


Lesenswert?

Wolfgang schrieb:
> Gefällt dir das besser?

Ja, jetzt sehe ich klar!
mfg Klaus

von Michael K. (sirmkay)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
}

von MaWin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.