-         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 35

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

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    36
    Anzeige

    Super, nun habe ich noch einen EEPROM 24C16P in der Bastelkiste gefunden,
    der jetzt die Werte des Drehencoders beim Drücken der Taste übernimmt.
    Beim Einschalten werden die dann wieder ausgelesen und in die Variablen gesteckt.

    So macht das Spass!

    Nun die Frage dazu:
    Die Speicherzellen des EEPROMs sollte man ja wohl "Im Kreis" nutzen, damit der länger hält.
    Ist ein Siemens:
    – Endurance 10"hoch"6 cycles1)
    – Data retention 40 years1)
    – ESD protection 4000 V on all pins

    Ich werde den nicht ruinieren können. Ich weiß, eine SD-Card mit integriertem Controller nehmen...
    Aber es geht hier ja ums lernen!

    Deshalb trotzdem an die Profis, wie mache ich das mit der Speicherzellenausnutzung?

    -Die Variable für die Adresse hochzählen?
    -Aber wie lese ich dann am Start die Daten ab der "richtigen" (zuletzt gewählten) Zelle aus??

    Da bin ich mit meinem Wissen am Ende.

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.501
    Blog-Einträge
    127
    Zitat Zitat von Wolle62 Beitrag anzeigen
    Deshalb trotzdem an die Profis, wie mache ich das mit der Speicherzellenausnutzung?
    Hallo Wolle62,
    ich hatte die gleiche Frage und gute Antworten darauf bekommen.
    https://www.roboternetz.de/community...-Flashspeicher

    Für mich hat ein ganz einfacher Algorithmus gereicht. Nach Schreiben eine page die folgende komplette page mit einem Muster (hex ff durch Löschen) belegt. Und dann vor dem nächten Schreiben diese von Adresse Null aus gesucht, mit meinen Daten überschrieben und die nächste gelöscht. Also reihum alle Seiten nacheinander beschrieben.

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

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    36
    Ja klar, man schreibt eine "Kennung" in die EEPROM Zelle vor den Nutz-Werten und findet die beim Start. Sollte auch gehen oder?
    Das mit dem Uhrenmodul ist auch nicht schlecht.

    Mein Uno sagt mir jetzt schon, dass der RAM knapp ist, da wird die Suchroutine hoffentlich noch mit laufen.
    Auf die Dauer muss da deshalb noch ein Mega her.
    Ich habe auch gerade ein 480x272 TFT in meiner Bastelkiste gefunden. Das geht mit dem Uno auf keinen Fall mehr.

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    36
    Ich brauche Hilfe beim Zählen! Ehrlich jetzt!!
    Ich erhalte meine Zahlenwerte ja aus der ISR mit dem Drehencoder erzeugt.

    Variable:
    volatile int Encoderwert;

    setup:
    attachInterrupt(digitalPinToInterrupt(2),Encoderre ad,CHANGE);

    ISR:
    Code:
    void Encoderread(){
    
      if(digitalRead(2)!= digitalRead(3))
      Encoderwert++;
      
     
      
     else Encoderwert--;
    Was da rauskommt ist nun DEZIMAL.
    Ich möchte aber eine Zeit im 10 Minuten Takt hoch und runter zählen lassen.
    Statt 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, usw.
    Also 10, 20, 30, 40, 50, 1:00, 1:10, 1:20, usw bis 23:50 vor- und rückwärts.
    (Den Doppelpunkt und die letzte Null kann ich vor der Ausgabe im Display hinzufügen. Also 110, 120, 130, geht)

    Kann ich das in der ISR direkt umrechnen lassen?
    So etwas wie "if (Encoderwert==6) Encoderwert=10" geht nicht...

    Im Netz gibt es haufenweise Online Rechner "dezimal<>senär" , aber es gibt immer nur die schriftliche Umrechnung in der
    Schulversion davon. Wie macht man das beim Arduino am besten?
    Geht das direkt in der ISR überhaupt?
    Muss die Variable dann "nur "int" sein und nicht noch "volatile"?

    Ich habe echt das Brett vorm Kopf. Ich denke auch (laut Mister Spok) nur zweidimensional, habe ich so den Verdacht.
    Meine Sketche leben immer nur von "wenn, "dann". Auch wenn alles bis auf das zählen perfekt funktioniert.

    Da fehlt mir die Grundausbildung auf dem Gebiet.

  5. #15
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.501
    Blog-Einträge
    127
    Hallo Wolle62,
    Zitat Zitat von Wolle62 Beitrag anzeigen
    Was da rauskommt ist nun DEZIMAL.
    Ich möchte aber eine Zeit im 10 Minuten Takt hoch und runter zählen lassen.
    Statt 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, usw.
    Also 10, 20, 30, 40, 50, 1:00, 1:10, 1:20, usw bis 23:50 vor- und rückwärts.
    (Den Doppelpunkt und die letzte Null kann ich vor der Ausgabe im Display hinzufügen. Also 110, 120, 130, geht)
    bin nicht sicher, ob ich Dich richtig verstehe. Aber angenommen, die Dezimalzahlen 50, 60, 70 ... werden als Minuten angenommen, die in eine Stunden- und Minutenangabe umgerechnet werden sollen, würde ich es zunächst mit Division und der Modulo Funktion versuchen:

    Stunden = Minuten / 60 (da eine Stunde 60 Minuten hat, zeigt der ganzzahlige Anteil vom Ergebnis die Stunden)
    Restminuten = Minuten % 60 (In Restminuten landet durch "modulo" der ganzahlige Rest der Division von Minuten/60)

    Das Ergebnis in Stunden kann Nachkommastellen enthalten. Manche Programmiersprachen lassen da eine Ganzzahl zu, bei der automatisch die Nachkommastellen der Division abgeschnitten werden. Also gleich die ganzzahlige Stundenzeit enthält.

    Dann Ausgabe mit "Stunden : Restminuten"

    Kann ich das in der ISR direkt umrechnen lassen?
    So etwas wie "if (Encoderwert==6) Encoderwert=10" geht nicht...
    Die Rechnnung oben läßt sich in der ISR machen. Duch die Divisionen aber rechenintensiv und könnte zu zeitaufwendig sein. Müßtest Du ausprobieren. Ich bin weder C noch Arduino sprachig aber Variable, die in einer ISR benutzt werden, sollten wohl mit volatile deklariert werden? Schaden tut es nicht.

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

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    36
    Ich will mir eine Aquarium-Beleuchtungssteuerung mit Wochentimer bauen.
    Nun habe ich mit dem Sketch dafür angefangen. Bei der Konzeption habe ich überlegt, wie ich die Timerzeiten
    eingeben will. Dafür fand ich den Drehencoder sinnvoll. Nun war die Frage, wie genau muss das überhaupt sein?
    (Man will ja nicht am nächsten Tag Muskelkater im Finger haben, weil man den Encoder 1000mal drehen muss.)

    Also entschied ich mich für den 10 Minutentakt. Da dann alle Zeiten hinten eine Null haben, habe ich mit nur 3 Stellen im Sketch gearbeitet.
    Also für 19:10 > 191. für 20:30 > 203 und 08:10 > 81 usw.. Für die Anzeige auf dem Display habe ich die Einerstelle abgezwickt und mit 10 multipliziert.
    Das Display zeigt dann diese Werte als Zeit an.

    Im Eingabemenü der Timerwerte muss ich nur aufpassen, dass ich nicht 19:70. (197) eindrehe, da es dafür ja keinen Vergleichswert gibt, der vom RTC Modul kommt.
    Das gibt ja nur normale Zeitwerte aus und keine Industriezeit, logisch...

    In meiner Unkenntnis dachte ich mir: So eine Kleinigkeit wie das senäre Zählen kannst Du ja zum Schluss korrigieren.
    Ein Schönheitsfehler nur, denn sonst läuft alles genau wie es soll.

    Ich will also nicht die Werte in Zeit umrechnen, sondern die Zählweise des Drehencoders so beeinflussen, dass er senär hoch und runter zählt.

  7. #17
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.501
    Blog-Einträge
    127
    Im senären Zahlensystem kommen Ziffern größer 5 nicht vor. Also 19:10 bzw 191 ist wegen der 9 nicht möglich.

    Um nur gültige Uhrzeiten mit den 3-stelligen Dezimalzahlen darzustellen, könnte man nach Encoderwert++ die letzte Ziffer in Encoderwert mit der modulo Funktion abfragen und falls sie größer 5 ist, zur 3-stelligen Zahl nochmals 4 addieren. Bzw nach Encoderwert-- eine 4 subtrahieren.

    Pseudocode falls die dreistellige Zahl in Encoderwert steht:
    Code:
    void Encoderread(){
    
     if(digitalRead(2)!= digitalRead(3))
      Encoderwert++;
      Rest = Encoderwert % 10                 
      if Rest > 5 then Encoderwert = Encoderwert + 4
     
      
     else Encoderwert--;
      Rest = Encoderwert % 10                 
      if Rest > 5 then Encoderwert = Encoderwert - 4
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    36
    Vielen Dank!!! Der Code macht das, was ich mir vorstelle !!!
    Ich habe die Modulo Operation falsch interpretiert. Ich muss den Rest vergleichen lassen und nicht den Wert !!! Ich Dummbatz...

    Damit habe ich schon experimentiert, aber es lief immer nur von Null bis 5 und dann wieder zurück auf Null bis 5.
    Die nächste Zehner-Stelle mit der Eins kam nicht, weil ich den "Encoderwert" verglichen habe.

    Dank Deiner Hilfe habe ich den Modulo halbwegs verstanden, aber noch nicht ganz.

    Warum "Encoderwert%10" ? Weil das Zählen doch im Dezimal System bleibt, weil ich ja Zahlen über 5 bis 9 verarbeite?
    "Rest>5" bedeutet also nach der 5. Operation?
    Weshalb wird beim runterzählen auch auf "Rest>5" geprüft?

    Code:
    void Encoderread(){
    
      if(digitalRead(2)!= digitalRead(3)){
      Encoderwert=Encoderwert+1;
      
      Rest = Encoderwert % 10;                 
      if (Rest > 5) Encoderwert = Encoderwert + 4;
      
    }
      
     else Encoderwert=Encoderwert-1;
    
     Rest = Encoderwert % 10;                 
      if (Rest > 5) Encoderwert = Encoderwert - 4;
    
      Encoderwert=constrain (Encoderwert,0,240);     //Wert des Encoders begrenzen auf 240
    }

    So und mit "volatile int Rest;" als Variable geht es nun perfekt.
    Wieder was gelernt!!
    Ich bin froh, das es doch so geht, wie ich mir das vorgestellt habe. Schwein gehabt.

  9. #19
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.501
    Blog-Einträge
    127
    Astrein
    Zitat Zitat von Wolle62 Beitrag anzeigen
    Warum "Encoderwert%10" ? Weil das Zählen doch im Dezimal System bleibt, weil ich ja Zahlen über 5 bis 9 verarbeite?
    "Rest>5" bedeutet also nach der 5. Operation?
    Weshalb wird beim runterzählen auch auf "Rest>5" geprüft?
    Liegt an Deiner Vorarbeit. Du hattest für die Uhrzeit die (maximal) 3-stellige Zahl vorgegeben bei denen die letzte Stelle das 10-Minuten Intervall angibt, das nur von 0 bis 5 gehen soll/darf. Wird nach oben gezählt, muß nach der 5 wieder die 0 kommen. Beim Nachuntenzählen muß nach der 0 die 5 folgen.

    Die ersten beiden Stellen der 3-stelligen Zahl zählen aber "normal" im Dezimal System nach oben bzw unten.

    Man muß also für Deine gewünschte Zählweise nur die letzte Ziffer für das 10-Minuten Intervall im Encoderwert überprüfen und gegebenenfalls korrigieren.

    Die Modulo Funktion ist eine Division, bei der die Nachkommastellen nicht ausgerechnet werden, sondern als Ergebnis sozusagen nur die Nachkommastellen mit einer ganzen Zahl, eben dem Rest liefert. (Eigener Definitionsversuch - andere, sicher bessere sind im Inet zu findnen)

    zB 195 % 10 = 5
    195 geteilt durch 10 ist gleich 19 Rest 5
    (10 * 19 = 190, 195 - 190 = 5)
    Die 5 ist das Ergebnis der Modulo Funktion

    oder zB 223 % 7 = 6
    223 geteilt durch 7 ist gleich 31 Rest 6
    (7 * 31 = 217, 223 - 217 = 6)
    Die 6 ist das Egebnis der Modulo Funktion

    Wenn man nun bei einer Dezimalzahl die letzte Ziffer "isolieren" möchte, bietet sich eben das Modulo mit 10 an, da ja bei einer Division durch 10 als Rest immer die Einerstelle bleibt. (Möchte man zB die letzten beiden Ziffern isolieren, nimmt man Modulo 100).

    Jetzt hat man also die Einerstelle, die sich einfach auf den erlaubten Wertebereich überprüfen läßt.

    Hat der Encoder nach oben gezählt und der Rest größer (Kurzzeichen >) 5 ist, wird 4 zum Encoderwert addiert. Aus der 6, 7, 8, 9 wird eine 0, 1, 2, 3 und es wird auch die nächste Stelle im Encoderwert durch den Überlauf (6 + 4 ist 10) hochgezählt. Möglicherweise reicht der Vergleich auf =6, da ja nach der Addition von 4 die 7, 8, 9 beim nächsten Encoderpuls nicht mehr in Frage kommen. So ist es jedenfalls sicher falls durch zB Kontaktprellen vielleicht doch irgendwie eine andere "verbotene" Zahl auftaucht.

    Hat der Encoder nach unten gezählt, müssen die gleichen Ziffern (6, 7, 8, 9) abgefangen werden. Deshalb auch wieder der Vergleich auf größer 5, aber nun muß entsprechend der Encoderdrehrichtung die 4 abgezogen werden. Hier tritt auch wieder bei der 0 minus 4 ein Unterlauf aus, der die nächst höhere Stelle in der 3-stelligen Zahl decrementiert.

    Bestimmt gibt es auch andere Möglichkeiten die Zählung zu implementieren; diese fiel mir halt als erste ein und hoffe Dich jetzt nicht zu viel zugeschwallt zu haben und hoffentlich keinen Unsinn erzählt zu haben.

    Schwein gehabt.

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

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    36
    Wenn man nun bei einer Dezimalzahl die letzte Ziffer "isolieren" möchte, bietet sich eben das Modulo mit 10 an, da ja bei einer Division durch 10 als Rest immer die Einerstelle bleibt. (Möchte man zB die letzten beiden Ziffern isolieren, nimmt man Modulo 100).
    Danke, genau so habe ich das nun auch gemacht, um die 3-stellige Zahl in 2-stellig / 1-stellig zu transformieren, die dann mit Doppelpunkt zwischen angezeigt werden können, so das es nach Uhrzeit aussieht.

    Der Uno ist nun voll (100% Programmspeicher, ich bin schockiert), ich habe daraufhin alle "int" auf "byte" gesetzt,da ich keine Werte über 255 habe.
    Sonst hätten mir nur ein paar Bytes zur Fertigstellung gefehlt. (nun 98%)
    Ich habe mir heute erstmal noch einen Mega R3 bestellt. Das nächste Projekt ist ja ein Farb-LCD 480x272 mit Touchscreen...
    Alle Teile übrigens, außer dem Uno und dem Breadboard, sind vom Schrott. Ich bin so der Resteverwerter beim Basteln.

    Ich wollte eigentlich noch die Displaybeleuchtungssteuerung ins Menü bekommen, aber durch meine unzureichende Kenntnisse ist der Code bestimmt
    sehr ineffizient und dadurch so groß geworden. Ist ja auch mein allererstes Projekt auf dem Arduino... Ein Wunder dass das überhaupt läuft.
    Die digitalen und PWM Ports sind auch alle belegt, deshalb der Mega.

    Ich stelle den fertigen Sketch in Kürze hier ins Forum bei Projekte ein.Wer dann ganz viel Langeweile hat, kann sich den ja ansehen.
    Den meisten Platz belegt die U8G2 Lib. Da sind es schon 76% Auslastung. Ich habe bislang keine anfängerfreundliche Alternative dafür gefunden,
    die sehr viel ressourcenschonender ist.


    Vielen Dank an Euch nochmals, ich kümmere mich jetzt um den LED Treiber mit PWM Eingang...

Seite 2 von 4 ErsteErste 1234 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
  •