- Modernes Energiemessgeraet    Werbung      
Ergebnis 1 bis 10 von 44

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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 12:58 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    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

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

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

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

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    38
    Beiträge
    5.098
    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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Hast du den Pseudocode aus meinem Post (#24) verstanden und weißt wie er funktioniert?
    Der Code funktioniert auch genau wie gewünscht! Danke für die Hilfe.

    So ganz genau verstehe ich es noch nicht.
    wenn ((Taste == 1) && (Taste_alt == 0)) x=1;
    das ist noch klar:
    Wenn "Taste" gedrückt und "Taste_alt" Variable gleich 0, dann setze "x" auf 1.


    Taste_alt = Taste;
    Diese Zuweisung ist dann aber nicht von der "if" Bedingung abhängig?
    Somit kommt man nach dem ersten Click mit "taste_alt==1" in der "while" an.
    Da die "if" hier nun nicht gültig ist, da "Taste_alt" ja nun "1" ist,bleibt man in der "while" und "Taste_alt" wird erst beim loslassen wieder auf "0" gesetzt?
    Nach dem drücken in der "while" wird "Taste_alt!" wieder "1". Dadurch ist dann die "if" in der "loop" ungültig.
    Auch hier wird "Taste_alt" erst nach dem loslassen des Tasters wieder auf "0" gesetzt??

    Habe ich das so richtig verstanden? Der Code, wie im Post 24 läuft nur wenn man nicht in einer "while" feststeckt, oder?
    Dann wird "x" bei jedem erneuten Tastendruck invertiert?

    Ich denke noch nicht wie mein Arduino es kann. Sehr nett, dass man hier Hilfe von Profis hat.
    So lernt man auch etwas richtig.
    Danke!!

Ä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, 16:08
  2. Dreh-Encoder und Tasten gleichzeitig abfragen
    Von DerSchatten im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 13.05.2011, 20:16
  3. LCD-Display 128x64 mit dem Controler T6963c
    Von heri im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 05.06.2007, 22:04
  4. Funktioniert der Pollin-Dreh-Encoder mit BASCOM?
    Von felack im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 27.06.2006, 17:52
  5. Hyundai 128x64 LC-Display
    Von ShadowPhoenix im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 01.12.2005, 21:16

Berechtigungen

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

    Werbung      LiFePO4 Speicher Test