Go Down

Topic: Bouncer-Problem (Read 3 times) previous topic - next topic

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?

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

Sim0n


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.


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:
http://www.youtube.com/watch?v=ZOtfcejS21c

Aber ich kanns auch mal ohne Widerstände versuchen.

Danke für Deine Beteiligung und die Hilfe!

olikraus

Hi

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.

Oliver

Sim0n

#23
Apr 02, 2012, 09:58 am Last Edit: Apr 02, 2012, 10:02 am by Sim0n Reason: 1
Hey :)
Gute Neuigkeiten - der Taster funktioniert nun und wir sind somit ein großes Stück weiter.
Der Widerstand war das Problem  :smiley-zipper:

So jetzt bin ich dabei, den Quellcode zu verstehen..

Quote
#define BW_70           0
#define BW_100           1
#define BW_135           2
#define BW_200           3
#define BW_300           4
#define BW_TOTAL        5


Du schreibst ja, "Definitionen"..heißt das, man braucht für jeden "Scroll-Block" so eine Definition?

Quote
M2_EXTERN_VLIST(el_menu);


Quote
M2tk m2(&el_menu, m2_es_arduino, m2_eh_2bs, m2_gh_lc);


Setzt man das immer ein, oder inwiefern benutzt man das?

Quote
uint8_t el_bw_first = 0;
uint8_t el_bw_cnt = BW_TOTAL;


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.

Quote
const char *el_bw_getstr(uint8_t idx, uint8_t msg) {
 const char *s = "";


Das wird ein character gebildet..oder? Wie und waum bildet man diesen? Was passiert da genau? Hab noch nie mit characters gearbeitet.

Quote
if ( msg == M2_STRLIST_MSG_SELECT ) {
   brennweite = idx; (...)


Sowas muss man also immer bei Eingaben und die dazugehörige Speicherung der Eingabe machen, oder? Sonst kommt diese ewige Schleife..richtig?

Quote
M2_STRLIST(el_bw, "l4w12", &el_bw_first, &el_bw_cnt, el_bw_getstr);
M2_SPACE(el_space, "w1h1");
M2_VSB(el_bw_vsb, "l4w1r1", &el_bw_first, &el_bw_cnt);
M2_LIST(list_bw) = { &el_bw, &el_space, &el_bw_vsb };
M2_HLIST(el_bw_hlist, NULL, list_bw);


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?

Quote
void loop() {
  m2.checkKey();
  m2.checkKey();
  if ( m2.handleKey() )
    m2.draw();
  m2.checkKey();


im if, oder nach dem ersten checkKey?

Es wäre super toll, wenn Du mir da helfen könntest, deinen Quellcode zu verstehen!

olikraus

#24
Apr 02, 2012, 11:52 am Last Edit: Apr 02, 2012, 12:10 pm by olikraus Reason: 1
Quote
Gute Neuigkeiten - der Taster funktioniert nun und wir sind somit ein großes Stück weiter.


Na, da bin ich aber auch erleichtert.

Quote
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:

Code: [Select]

#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

Quote
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
Code: [Select]
if ( bw == BW_135 )
als
Code: [Select]
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.

Code: [Select]
M2tk m2(&el_menu, m2_es_arduino, m2_eh_2bs, m2_gh_lc);

Das ist der sogenannte C++ Constructor von M2tk lib. Der initalisiert die Lib. Damit werden auch ein  paar grundlegende Dinge festgelegt.

Die Beschreibung ist hier: http://code.google.com/p/m2tklib/wiki/fnref#M2tk
Als ersten parameter bekommt M2tklib das erste Menü das dargestellt werden soll.

Code: [Select]
M2_EXTERN_VLIST(el_menu);

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:

1. Wir sagen dem Compiler, dass Menü B erst später definiert wird (M2_EXTERN...)
2. Menü A: Hat einen Button der zu Menü B springt
3. Menü B: Hat einen Button der zu Menü A springt.

Quote
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++

Quote
Wie und waum bildet man diesen? Was passiert da genau? Hab noch nie mit characters gearbeitet.


Warum: Weil ich das so festgelegt habe und glaube, dass es ganz effizient ist.
Genaue Beschreibung ist hier:
http://code.google.com/p/m2tklib/wiki/elref#STRLIST

Muss leider mal unterbrechen, bis später...
Oliver

Go Up