Drehgeber mit Interrupt, Komme nicht aus schleißen

Hallo alle zusammen,

folgendes Problem:

Ich habe 2 Funktionen (ausgabe1 & ausgabe2).
Ziel dieser Funktion ist:
ausgabe1 : Mir die aktuelle Temperatur & Luftfeuchtigkeit anzeigen zulassen
ausgabe2: Mir die Maximalwerte anzeigen zulassen.

Durch ein Tast-druck soll ich zwischen den beiden Funktionen (Fenstern) hin un her schalten können,
was nicht möglich ist, denn wie ihr auf dem Bild sehen könnte, ist in der ausgabe1 aber auch in ausgabe 2 eine while-Schleife drin, aus dem ich nicht wieder raus komme.

ich habe es deshalb mit einem Interrupt versucht. Kriege das aber vergebens nicht hin & bin deshalb völlig aufgeschmissen…

! Ziel der Aufgabe !

ich soll mit dem Encoder durch drehen zwischen den Fenster hin und her switchen können, deshalb kann theoretisch der Taster weg & direkt mit dem Encoder rumprobiert werden.

Bild1.PNG

Teil_4_Taster_Encoder.ino (4.21 KB)

Mephisto123: st in der ausgabe1 aber auch in ausgabe 2 eine while-Schleife drin, aus dem ich nicht wieder raus komme.

Dann schmeiß die doch raus. Wozu soll die denn gut sein? Sowas gehört in ein Programm nicht rein. loop() ist doch schon eine Schleife.

Ich brauch die schleife aber um die Zahlen zu refreshen, sonst aktualisiert er die nicht.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Doch das geht auch ohne while.

Gruß Tommy

Mephisto123: ...Komme nicht aus schleißen...

Kann mir das wer übersetzen?

P_Extruder:
Kann mir das wer übersetzen?

Vermutlich sollte es analog zur Problembeschreibung heißen: “Komme nicht aus Schleife”. Hat bei mir aber auch 'ne Weile gedauert.

Mephisto123:
Ich brauch die schleife aber um die Zahlen zu refreshen, sonst aktualisiert er die nicht.

Aber wie schon gesagt wurde, bist du mit der while()-Anweisung dauerhaft gefangen. Das ist ein sehr schlechter Programmierstil. In dieser Richtung wird dir niemand weiterhelfen (wollen).

sth77:
Vermutlich sollte es analog zur Problembeschreibung heißen: “Komme nicht aus Schleife”. Hat bei mir aber auch 'ne Weile gedauert.
Aber wie schon gesagt wurde, bist du mit der while()-Anweisung dauerhaft gefangen. Das ist ein sehr schlechter Programmierstil. In dieser Richtung wird dir niemand weiterhelfen (wollen).

Und wiedermal frage ich mich, warum ein TO zu faul ist, seinen eigenen Beitrag nochmals zu lesen und evtl. zu korrigieren.

HotSystems: Und wiedermal frage ich mich, warum ein TO zu faul ist, seinen eigenen Beitrag nochmals zu lesen und evtl. zu korrigieren.

Er ist nicht zu faul, er kann das nicht.

Gruß

Gregor

Mephisto123: Ich brauch die schleife aber um die Zahlen zu refreshen, sonst aktualisiert er die nicht.

Nein, die brauchst Du nicht. loop() ist eine Schleife - [u]die[/u] musst Du nutzen und nicht blockieren.

gregorss: Er ist nicht zu faul, er kann das nicht.

Gruß

Gregor

Wie....nicht lesen ? Einfach vor dem absenden nochmal lesen, ist das zu schwer ?

HotSystems: Wie....nicht lesen ? Einfach vor dem absenden nochmal lesen, ist das zu schwer ?

Nein, ich meinte das ironisch. Aber vielleicht ist ihm eine Straßenbahn über die Hände gefahren :-)

Gruß

Gregor

Hallo,

ich denke mit Deiner Programstruktur gerätst du in eine Sackgasse, vermutlich bist Du ja auch schon drin. :) Ich mach Dir mal einen Vorschlag.

zunächst schaust Du mal das Du mit dem Encoder beim drehen einen counter von 0-3 und wieder zurück hinbekommst. Dazu gibts Beispiele.

Dann liest du die Messwerte ein und machst alle Berechnungen und Auswertungen. Meinetwegen in einer eigenen Funktion dann wird es schön übersichtlich.

Dann nimmst Du deine drei Anzeige Functionen die du ja im Wesentlichen schon hast, aber ohne die Berechnungen und die Schleifen, die wollen wir ja rausbekommen. Die gesamte Struktur sieht dan grob in etwa so aus. Dabei wird alles abgearbeitet und je nach Zustand des Encoders die zugehörige Anzeige aufgerufen.

code so nicht lauffähig 
loop
encoder auswerten (position steht in counter)

Messwerte lesen
Messwerte auswerten

if counter =1 anzeige1
if counter =2 anzeige2
if counter =3 anzeige3 

loop ende

anzeige1 {
hier alles was zur anzeige 1 gehört ohne Berechnung ohne eine Schleife 

}


anzeige2{

}


anzeige3{

}

Du kanst natürlich auch mit else if oder select case arbeiten. Die Beispiele für die Encoder arbeiten manchmal mit interrupt. Lass dich dadurch nicht verwirren, eigendlich brauchst Du das aber nicht. So schnell kannst du an dem Encoder nicht drehen das das erforderlich währe. Wenn es aber in einem Beispiel drin ist dann lass es einfach so.

Heinz

Du könntest Dich auch mal dran gewöhnen, Deine Codefragmente in Codetags zu setzen.

Gruß Tommy

Hallo

@Tommy das stimmen, nur dann kommt noch jemand auf die Idee das als Gerüst zu nehmen und bekommt es nicht zum Laufen, mach ich werde dann einen Vermekr dran machen "nicht lauffähing"

Gruß Heinz

Hi

Ok, wir haben erfahren, daß 'Ausbrechen aus einer WHILE-Schleife per Interrupt' eine doofe Idee ist. Aber warum?? Weil ein Interrupt die While-Schleife (eigentlich ALLES, wo der µC halt gerade rumackert) UNTERBRICHT, Seinen Interrupt-Kram abarbeitet und dann GENAU DAHIN ZURÜCK springt, wo Er zuvor unterbrochen hatte. Genau DAS ist der Sinn eines Interrupt, schnell Zeug erledigen und dann das Programm weiter laufen lassen. Das ist aber auch die Gefahr - da der Interrupt IMMER zuschlagen kann, kann auch viel Müll dabei passieren. Für's Erste: vergiss Interrupts - Die sind hier definitiv KEINE Lösung

Du möchtest Deinen Encoder abfargen und je nach 'Wahl' eben das eine oder das andere 'Programm' ausführen - Das wiederum macht man in einer State-Maschine - einem IF-Konstrukt oder per switch/case.

Vll. wäre Mal wieder ein Wort des TO hier 'ganz nett'?

MfG