zu 3)
Das hab ich nicht verstanden. Sowohl vor dem Tauschen der Pins (in der Software, nicht am Arduino), als auch nach dem Tauschen funktioniert der Select nicht?
zu 4)
Nun vielleicht liegt es daran. Es sind keine Widerstände notwendig.
Der Taster sollte so beschaltet sein, wie hier der Pin 10 (S2, links vom ATMEGA):
Sozusagen, einfach den Pin gegen Masse kurzschließen. Hintergrund ist auch, dass M2tklib den internen Pull-Up-Widerstand des ATMEGA aktiviert. Möglicherweise kollidiert dieser mit der Schaltung deiner Taster.
Vielleicht kannst Du mir die Beschaltung mit deinen Tastern aufzeichnen. Oder aber Du probierst es mal völlig ohne Widerstände, so wie in dem Schaltplan oben: Der Taster schließt den Pin nach Masse kurz.
olikraus:
zu 3)
Das hab ich nicht verstanden. Sowohl vor dem Tauschen der Pins (in der Software, nicht am Arduino), als auch nach dem Tauschen funktioniert der Select nicht?
Wenn ich den Pin am MC vertausche..funktioniert das Selecten nur mit dem Taster, der nun umgesteckt wurde. Next'en kann man mit dem umgesteckten Taster nicht.
Wenn ich in der Software den Pin vertausche geht auch nur der Select Taster..der Next Taster zeigt sich unbeeindruckt und funktioniert nicht.
olikraus:
zu 4)
Nun vielleicht liegt es daran. Es sind keine Widerstände notwendig.
Der Taster sollte so beschaltet sein, wie hier der Pin 10 (S2, links vom ATMEGA):
Sozusagen, einfach den Pin gegen Masse kurzschließen. Hintergrund ist auch, dass M2tklib den internen Pull-Up-Widerstand des ATMEGA aktiviert. Möglicherweise kollidiert dieser mit der Schaltung deiner Taster.
Vielleicht kannst Du mir die Beschaltung mit deinen Tastern aufzeichnen. Oder aber Du probierst es mal völlig ohne Widerstände, so wie in dem Schaltplan oben: Der Taster schließt den Pin nach Masse kurz.
Oliver
Ich habs ungefähr so wie im Video gemacht:
Aber ich kanns auch mal ohne Widerstände versuchen.
Hast Du es genau so gemacht, wie im Video? Also 100k gegen 0Volt und Taster schaltet nach 5V kurz?
Wenn ja, dann wird es tatsächlich nicht funktionieren, denn der Atmel Controller hat ebenfalls einen Widerstand eingebaut, jedoch genau umgekehrt: ca. 100k gegen 5V. Tatsächlich kollidiert dann deine Schaltung mit der des Microcontrollers.
Es sieht in etwa so aus (Bild vom Englischen Wiki). Der Widerstand ist jedoch eingebaut.
Man braucht nur einen Taster nach Masse schalten, fertig.
Ich halte das Video für recht unglücklich. Hätte der Autor das so beschaltet wie im Bild oben, dann hätte es auch mit M2tklib funktioniert. Anders gesagt: Zwei parallele Widerstände (ein interner und ein externen) hätten nichts ausgemacht.
Meine Empfehlung wäre eine Beschaltung des Tasters, wie im obigen Bild. Wie gesagt: Widerstand bitte weglassen, der ist im Uno eingebaut.
Ich verstehe was Du meinst, aber wenn ich ein Programm schreiben würde, wüsste ich jetzt nicht, wann und warum und wie, bzw. in welcher Schreibweise ich das einsetzten müsste.
Die M2_XXXXX Variablen sind vorgegeben, oder wo wurden die definiert?
Man legt hier also fest, wie der "Scroll-Block" aussehen soll, oder?
Oder wird hier das ganze Layout definiert?
Kannst Du mir den gesamten Block und dessen Variablen erläutern? - Ich bin damit sehr überfordert und denke das dieses Element sehr wichtig ist / sein wird :~
Was bewirkt "NULL" ?
In Moment zappt man ziemlich schnell durch die Auswahlmöglichkeiten, wenn man einen Taster drückt.
Oft wird sogar ein Menüpunkt übersprungen..ich wollte ein delay(50) oder (100) einbauen..aber ich habe jetzt keine Ahnung wo.
Wahrscheinlich in der void loop.
Aber wo da?
Gute Neuigkeiten - der Taster funktioniert nun und wir sind somit ein großes Stück weiter.
Na, da bin ich aber auch erleichtert.
In Moment zappt man ziemlich schnell durch die Auswahlmöglichkeiten, wenn man einen Taster drückt.
Oft wird sogar ein Menüpunkt übersprungen..ich wollte ein delay(50) oder (100) einbauen..aber ich habe jetzt keine Ahnung wo.
Das kann mehrere Ursachen haben. Zunächst mal betone ich, dass der Schalter am einen Ende mit Masse (0Volt) verbunden sein muss (siehe Bild weiter oben). Andernfalls ist die Polarität umgedreht und der debounce Alogorithmus könnte nicht mehr funktionieren.
Wenn das nichts hilft, könntest Du den debounce-Algorithmus etwas anpassen: Im Verzeichnis utility liegt die datei m2_key.c. Ändere dort den Wert des defines M2_DEBOUNCE_CNT von 3 auf 5 oder 7:
#define M2_DEBOUNCE_CNT 3
Noch eine Daumenregel: Verwende NIEMALS delay(). Es gibt hier im Forum viele Diskussionen in denen es darum geht Verzögerungen ohne dalay() zu implementieren. Anstelle des delay()'s könnte man auch Zustandsautomaten erstellen, wie sie beispielsweise hier auch von mir beschrieben sind: http://code.google.com/p/m2tklib/wiki/t05
Du schreibst ja, "Definitionen"..heißt das, man braucht für jeden "Scroll-Block" so eine Definition?
Nein. So eine Definition verbessert nur die Lesbarkeit deines Programms. Du darfst gerne auch direkt mit den Zahlen 0 bis irgendwas arbeiten. Auf der anderen Seite (wie wir gerade bei Daumenregeln sind): Verwende niemals "magic numbers" in deinem Code.
Es ist doch besser zu schreiben
if ( bw == BW_135 )
als
if ( bw == 2 )
oder? BW_135 läßt sich viel besser merken als 2. Beides ist aber gleich, weil der Compiler einfach BW_135 durch 2 ersetzt.
Das wird vor allem deshalb benötigt damit der C/C++ Compiler zufrieden ist. Der beschwert sich nämlich wenn etwas unbekannt ist. Folgendes Beispiel:
Menü A: Hat einen Button der zu Menü B springt
Menü B: Hat einen Button der zu Menü A springt.
Wenn ich Menü A definiere, muss ich eigentlich Menü B schon kennen. Das geht aber nicht, weil Menü B erst später kommt. Auch das Vertauschen von Menü A und B nützt nichts, dann hab ich das Problem halt mit dem anderen Button.
Die Lösung sieht so aus:
Wir sagen dem Compiler, dass Menü B erst später definiert wird (M2_EXTERN...)
Menü A: Hat einen Button der zu Menü B springt
Menü B: Hat einen Button der zu Menü A springt.
Das wird ein character gebildet..oder? Wie und waum bildet man diesen?
Es muss ein pointer auf einen String zurückgegeben werden. Das ist Standard C/C++
Wie und waum bildet man diesen? Was passiert da genau? Hab noch nie mit characters gearbeitet.
Also, im Prinzip setze ich ein paar C/C++ Gundlagen voraus. Auf der anderen Seite, könnte man sich das auch aus den Beispielen erschießen, die ich in der M2tklib Referenz angeben haben. Speziell für die STRLIST: Google Code Archive - Long-term storage for Google Code Project Hosting.. Anders ausgedrückt: Entweder gar nicht darüber nachdenken und das Beispiel aus der Referenz übernehmen oder aber ein gutes C (Betonung liegt auf C und nicht auf C++) Lernbuch zur Hand nehmen und dort nachlesen.
Ich hab' mal nach "c tutorial" gegoogled und u.a.folgendes gefunden
Was passiert da genau?
Die Frage bezog sich ja auf das STRLIST element. Um es etwas allgemeiner zu formulieren. Das STRLIST Element sorgt für die Darstellung einer Liste von Strings. Damit man das wiederverwenden kann, muss die STRLIST einige Informationen kennen:
Wie viele Elemente gibt es denn insgesamt?
Wie viele Elemente sollen denn sichtbar sein?
Welches ist das erste sichtbare element? (wird teilweise automatisch berechnet)
Wie lauten denn die einzelnen Zeilen?
Punkt 4 ist wie folgt gelöst. STRLIST benutzt eine sogenannte Callback-Procedure (Rückruf oder Hilfs-Funktion). Die muss vom Benutzer der Lib (sprich von Dir) bereitgestellt werden und ermöglicht es der Lib zu einer gegebenen Zeilennummer den String zu ermitteln.
Diese Callback-Procedure wird aber für einen zweiten Zweck benutzt, deshalb schickt STRLIST eine Nachricht (erster Parameter der Callback-Procedure) über die STRLIST der CB-Procedure mitteilt, was es denn genau haben will.
Ist msg == M2_STRLIST_MSG_GET_STR, dann hält der zweite Parameter die Nummer der Zeile, zu der STRLIST gerne den String hätte. Siehe auch das Referenz-Handbuch: http://code.google.com/p/m2tklib/wiki/elref#STRLIST
Welches ist das erste sichtbare element?
angegeben. Beides sind Variablen im Hauptspeicher, die sich jederzeit manuell ändern lassen bzw von STRLIST auch selbst aktualisiert werden. Man kann so beispielsweise in el_bw_first immer nachlesen welches das erste sichtbare Element ist (Achtung: Das ist nicht das Element, auf dem gerade der Cursor steht!). Man kann durch Änderung von el_bw_cnt auch die Liste dynamisch vergrößern (das ist aber nur selten sinnvoll...)
Sowas muss man also immer bei Eingaben und die dazugehörige Speicherung der Eingabe machen, oder? Sonst kommt diese ewige Schleife..richtig?
Zunächst mal: Das ist die zweite Aufgabe der Callback-Funktion: Die bekommt mitgeteilt, dass der Benutzer eine bestimmte Zeile angeklickt hat. In diesem Falle enthält der zweite Parameter die Nummer der angeklickten Zeile (beginnend mit 0, die erste Zeile hat also die Nummer 0).
Wenn Du die Nachricht von STRLIST ignorierst, passiert gar nichts. Aber in diesem Falle speichern wir einfach die vom Benutzer ausgewählte Brennweite ab.
Diese Variablen sind die sogenannten Elemente von M2tk. Die sind (wie auch die Funktionen) in M2tk.h (bzw m2.h) definiert. Alle Elemente sind hier: http://code.google.com/p/m2tklib/wiki/elref
definiert. Meist auch mit einem Beispiel
Es wird hier das gesamte Layout und das Verhalten des Menüs definiert.
Zunächste einmal: Es gibt Listen und Elemente.
Alles was "M2_LIST" heisst, sind Listen, alles andere sind Elemente.
Die ersten beiden Argumente der Elemente sind immer gleich:
Name des Elementes
Ein Format String
Über den Namen kann das Element später referenziert werden. Achtung: Elemente werden immer über &Name referenziert. (Bei Listen ist es nur der Name!)
Der Format String enthält zusätzliche Angaben in der Form "Buchstabe" + "Zahl"
Beispielsweise bedeutet
"w1": Breite (Width) von einem Zeichen
"l4": Anzahl der Zeilen (Lines) von 4
"r1": Read-Only
Die genaue Bedeutung steht jeweils bei der Elementbeschreibung
Hier nochmals die Beschreibung des STRLIST Elements: http://code.google.com/p/m2tklib/wiki/elref#STRLIST
Dort steht beispielsweise, dass der "l" Parameter notwendig (required) ist. Man muss das also angeben. Klar, sonst weiss nämlich m2tklib nicht, wie viele Zeilen dargestellt werden sollen.
Er ist 4 Zeichen hoch ("l4") ein Zeichen breit ("w1") und soll nicht veränderbar durch den User sein ("r1").
Über die beiden folgenden Parameter drei und vier kommuniziert die VSB mit der STRLIST. Sozusagen ist die Scrollbar über diese beiden Variablen mit der Liste verknüpft und die VSB zeigt den passenden Ausschnitt am Display an.
Links neben der VSB befindet sich eine leere Spalte. Diese wurde mit M2_SPACE erzeugt. SPACE bekommt nur die bekannten zwei parameter. Wiederum definiert der Format-String "w1h1" die Größe des Leerraums.
Über "w1" ist also festgelegt, dass eine Spalte belegt ist.
Ganz links ist die STRLIST, die hier den größten Raum beansprucht. Auf meinem 16x4 Display sind das 14 Spalten.
Die Breitenangabe "w12" gibt übrigens die Netto-Breite an, also ohne den Platz für den Cursor (die eckigen Klammern). Die Breite der STRLIST ist also tatsächlich 12+2= 14 Spalten. An dritter und vierter Parameterstelle folgen wieder die beiden Variablen, über die die STRLIST mit der VSB kommuniziert (wenn denn eine VSB da ist. Wenn keine VSB da ist, braucht die STRLIST aber die Parameter trotzdem) Auch hier wird über & die Adresse der Variablen übergeben und nicht der Inhalt der Variablen. Als fünfter und letzter Parameter wird dann die Callback-Prozedur übergeben (siehe oben).
Jetzt müssen noch diese drei Elemente gelayoutet werden. Dazu bietet M2tk diverse Kontainer-Elemente an. Dies sind derzeit:
XYLIST --> Manuelles Plazieren der Elemente per (x,y) Koordinate
VLIST --> Automatisches Plazieren vertikal
HLIST --> Automatisches Plazieren horizontal
GRIDLIST --> Automatisches Plazieren als Matrix
Damit die Kontainer arbeiten können, muss ihnen eine Liste der Elemente übergeben werden. Das ist die angesprochene M2_LIST.
M2_LIST klammert mehrere Elemente
Die Reihenfolge der Elemente in der M2_LIST kann wichtig sein (für VLIST, HLIST und GRIDLIST)
Die Liste bekommt einen Namen "list_bw". Die Elemente stehen (wie in C üblich) zwischen { und }. Die Elemente werden über den & Operator referenziert. Da später die HLIST verwendet wird, ist die Reihenfolge wichtig: Zuerst (ganz links) die STRLIST (el_bw), dann das SPACE und am Schluß die VSB.
Schließlich wird am Schluss das Kontainer-Element selbst definiert: Eine HLIST ordnet das ganze horizontal (von links nach rechts) an. Einen Format-String bekommt die HLIST nicht, deshalb wird NULL übergeben, was soviel heisst wie: "Es gibt keinen Format String". Als dritter Parameter muss die Liste angegeben werden: Achtung: KEIN & für die Listen.
So, das war mein Versuch Deine Fragen zu beantworten. Wer auch immer es bisher mit dem Lesen geschafft hat: Vielen Dank und viel Spass mit M2tklib
Ich finds sehr kompliziert..ich habs versucht nachzuvollziehen, aber es fällt mir sehr schwer.
Andere Möglichkeiten gibt es nicht - oder?
Mh... Tut mir Leid das ich so "schwer vom Begriff" bin - aber glaub mir, ich habs versucht es zu verstehen und habe auch lange zum verstehen gebraucht - aber es hat nichts genützt.
Ich versteh einigermaßen was du programmiert hast, könnte es aber nicht nachprogrammieren. :~