- LiTime Speicher und Akkus         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 44

Thema: Uno R3 mit 128x64 Pixel Display und Dreh-Encoder grafische Anzeigeprobleme

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Anzeige

    Powerstation Test
    Ich will nicht einen neuen Thread aufmachen, da die Frage jetzt nichts mehr mit dem Titel gemein hat.
    Also, ich habe eine "Funktion" in meinem Sketch, die, wenn aufgerufen solo läuft. as klappt auch alles.
    Dazu habe ich in der Main loop die Abfrage nach dem Taster, der das Umschalten bewirkt und eine Variable, die den Zustand anzeigt.

    Sinngemäß so:
    Wenn ((Taster 1 == HIGH)&&( X==0)) dann X=1;
    while X==1 Funktion();

    In der Funktion frage ich den Taster dann wieder ab, um wieder zurück zur Main loop zu kommen:

    Wenn ((Taster 1 ==HIGH)&&(X==1) dann X=0;

    Was mich stört ist, dass wenn man den Taster festhält, es immer rein und raus und rein und raus geht. Man darf also immer nur kurz drücken. Klar, so steht es ja auch im Sketch...
    Ich grübele, wie ich das verbessern kann, dass der Zustand für jedes Umschalten nur einmal läuft.
    Mir fehlt da wieder eine Gehirnwindung. Helft mir mal auf die Sprünge. Wie macht man das richtig?

  2. #22
    HaWe
    Gast
    du könntest meine Button Class verwenden, die abfragt, ob ein Button KURZ gedrückt wurde
    (Rückgabewert: short press=1):

    https://github.com/dsyleixa/Arduino/...er/ButtonClass

    Alternative Rückgabewerte:
    2 (double click)
    3 (long press)
    0 (no press)

    ____
    ( PS: ich schließe mich Searcher an, dass bei neuen, anderen Problemen auch ein neues Topic aufgemacht werden sollte)
    Geändert von HaWe (14.02.2019 um 21:35 Uhr)

  3. #23
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von Wolle62 Beitrag anzeigen
    Ich will nicht einen neuen Thread aufmachen, da die Frage jetzt nichts mehr mit dem Titel gemein hat.
    Neuer thread wär kein Problem und fänd ich auch besser.

    Sinngemäß so:
    Wenn ((Taster 1 == HIGH)&&( X==0)) dann X=1;
    while X==1 Funktion();

    In der Funktion frage ich den Taster dann wieder ab, um wieder zurück zur Main loop zu kommen:

    Wenn ((Taster 1 ==HIGH)&&(X==1) dann X=0;

    Was mich stört ist, dass wenn man den Taster festhält, es immer rein und raus und rein und raus geht. Man darf also immer nur kurz drücken.
    So ganz klar ist mir der gewollte Ablauf nicht. Wenn Du in der Funktion nicht auf Taster HIGH abfragst sondern auf Taster==LOW, dann muß der Taster erst losgelassen werden damit X zu 0 wird. In der Folge wird in der main das X nicht mehr zu 1, es sei denn Taster wird erneut zu HIGH.

    Also in der Funktion "Wenn ((Taster 1 ==LOW)&&(X==1) dann X=0;"

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #24
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.052
    Das geht relativ einfach. Wird in der SPS-Programmierung häufig verwendet. Man findet einiges wenn man nach Flankenauswertung sucht.
    Aber prinzipiell geht es so:
    Man benötigt eine Hilfsvariable, um den vorhergehende Zustand zu kennen und je nach Zustand muss man reagieren.
    Die Hilfsvariable nenne ich "taste_alt", die Taste selbst nenne ich "taste". Das Programm reagiert auf pos. Flanke.
    Code:
    wenn ((taste == 1) && (taste_alt == 0))
    {
    x ^= x
    }
    
    taste_alt = taste
    MfG Hannes

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    x ^= x
    das verstehe ich nicht. Was für ein Operator ist das "^="?
    Ist das die Auswertung auf eine ansteigende Flanke?
    So etwas hatte ich gesucht, aber nicht gefunden.

    Ich habe es nun so gelöst:
    Code:
    void loop(){
    
    tasterstatus3=digitalRead(taster3);                                                     //Der Taster fürs Einstellmenü
    if ((tasterstatus3==LOW)&&(Einstellmenu==2))Einstellmenu=0;
    if ((tasterstatus3==HIGH)&&(Einstellmenu==0))Einstellmenu=3;
    
    
    while ((Einstellmenu==3)||(Einstellmenu==1))einstell(); 
    
    }
    
    void einstell(){                                                                                    //Das Menü zu Einstellen des Timer
    
    tasterstatus3=digitalRead(taster3);       //damit man wieder rauskommt 
    if ((tasterstatus3==LOW)&&(Einstellmenu==3))Einstellmenu=1;
    if ((tasterstatus3==HIGH)&&(Einstellmenu==1))Einstellmenu=2;
    
    }
    Wie gesagt, die Funktion läuft solo, wenn gesetzt(while..). Daher muss der Ausstieg in der Funktion selbst erfolgen.
    Nun ist sicher, dass der Taster erst wieder losgelassen werden muss, bevor man mit dem nächsten Druck aus der Funktion zurück in die Loop kommt.
    Umständlich, aber geht.
    Der Tipp mit einer zusätzlichen Variablen war genau richtig! Danke!!!

    Das nächste Problem dann in einem neuen Thread, verstanden!
    Geändert von Wolle62 (15.02.2019 um 13:58 Uhr)

  6. #26
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.052
    Die Zeile "x ^= x" ist falsch, da x immer 0 bleiben würde. Das sollte eigentlich "x ^= 0xff;" heißen. Diese Zeile ist gleichbedeutend mit "x = x ^ 0xff;", das Zeichen "^" bedeutet in der Sprache C "bitweises XOR". Die Wahrheitstabelle eines XOR ist (A & B sind Eingänge, Q ist der Ausgang):
    A B Q
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    Sprich wenn A und B unterschiedlich sind, ist der Ausgang 1, sonst 0.

    Das kann man z.B. zum Invertieren einer Led nutzen. Z.B. "PORTB ^= (1<<PB0);" ändert jedes mal den Ausgang PB0.

    Das mit dem XOR habe ich geschrieben, weil du oben geschrieben hast ".....(x == Low) dann x = high" und dann "...(x == high) dann x = low", das wäre eine einfache Invertierung.

    MfG Hannes

  7. #27
    HaWe
    Gast
    verständlicher wäre
    x= !x;
    wenn man wechselweise von 1 auf 0 switchen will und wieder zurück

  8. #28
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Oha, da habt ihr Opa aber eine Denksportaufgabe gegeben. Beschäftige ich mich gern mit.
    Ich will ja auch lernen, meinen Code besser zu gestalten, und nicht , wie zur Zeit noch, alles mit
    Wenn, dann zu verarbeiten.
    Aber klar ist schon, dass es hier nicht um das schalten von 1 auf 0 und zurück allein geht.
    Es ging um die Tatsache, dass die Bedingung Taster ==HIGH und der Zustand der Variable
    beim hin- und herschalten immer gültig sind!

    Also
    1. "Taster==HIGH und Zustand==0" > Setze Zustand auf "1". Ist gültig und ich fliege aus der Loop in die Funktion
    2. In der Funktion dann " Taster==HIGH und Zustand==1" > Setze Zustand wieder auf "0" ist auch gültig.

    Halte ich den Taster also dauerhaft fest, geht es immer hin und her. Das loslassen des Tasters vor dem Wechsel
    des Zustandes ist gefragt. Wobei "Taster==LOW" nicht geht, da das im Normalzustand ja immer zutrifft.
    Ich versuche Eure Vorschläge mal zu verstehen und in einem Test umzusetzen.

  9. #29
    HaWe
    Gast
    Zitat Zitat von Wolle62 Beitrag anzeigen
    Oha, da habt ihr Opa aber eine Denksportaufgabe gegeben. Beschäftige ich mich gern mit.
    Ich will ja auch lernen, meinen Code besser zu gestalten, und nicht , wie zur Zeit noch, alles mit
    Wenn, dann zu verarbeiten.
    Aber klar ist schon, dass es hier nicht um das schalten von 1 auf 0 und zurück allein geht.
    Es ging um die Tatsache, dass die Bedingung Taster ==HIGH und der Zustand der Variable
    beim hin- und herschalten immer gültig sind!

    Also
    1. "Taster==HIGH und Zustand==0" > Setze Zustand auf "1". Ist gültig und ich fliege aus der Loop in die Funktion
    2. In der Funktion dann " Taster==HIGH und Zustand==1" > Setze Zustand wieder auf "0" ist auch gültig.

    Halte ich den Taster also dauerhaft fest, geht es immer hin und her. Das loslassen des Tasters vor dem Wechsel
    des Zustandes ist gefragt. Wobei "Taster==LOW" nicht geht, da das im Normalzustand ja immer zutrifft.
    Ich versuche Eure Vorschläge mal zu verstehen und in einem Test umzusetzen.
    daher empfahl ich oben meine ButtonClass.

  10. #30
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.052
    Hast du den Pseudocode aus meinem Post (#24) verstanden und weißt wie er funktioniert?

    Du benötigst 2 Flankenauswertungen, eine zum Einsteigen und eine zum Verlassen der Funktion:
    Code:
    wenn ((Taste == 1) && (Taste_alt == 0)) x=1;
    Taste_alt = Taste;
    
    while (x == 1)
    {
    wenn ((Taste == 1) && (Taste_alt == 0)) x=0;
    Taste_alt = Taste;
    ...
    ...
    ...
    }
    Wenn die Funktion so ist, invertierst du ja "x" einfach, so wie ich es oben geschrieben habe.

    MfG Hannes

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Ähnliche Themen

  1. Dreh-Encoder gibt "Rückschlag-Impuls" ab - wieso nur?
    Von t0bias im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 03.03.2014, 17:08
  2. Dreh-Encoder und Tasten gleichzeitig abfragen
    Von DerSchatten im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 13.05.2011, 21:16
  3. LCD-Display 128x64 mit dem Controler T6963c
    Von heri im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 05.06.2007, 23:04
  4. Funktioniert der Pollin-Dreh-Encoder mit BASCOM?
    Von felack im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 27.06.2006, 18:52
  5. Hyundai 128x64 LC-Display
    Von ShadowPhoenix im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 01.12.2005, 22:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus