Loading...
  Show Posts
Pages: 1 ... 36 37 [38] 39 40 ... 56
556  International / Deutsch / Re: Etwas genau eine Minute Programieren on: April 05, 2012, 05:33:15 pm
Das war ein Wortwitz mit dem Titel dieses Threads: Jemand sollte etwas genau eine Minute programmieren (mit kleinem p). Ich habe aber 90 Sekunden gebraucht um das Codefragment zu programmieren (hab' s gestoppt)  smiley-wink

Tatsächlich hatte ich den Titel falsch verstanden. Ich hab mich nämlich gefragt, wieso hier jemand gesucht wird, der eine Minute lang programmiert.

Oliver

557  Using Arduino / Programming Questions / Re: Simultaneous SPI Devices on: April 05, 2012, 03:07:52 pm
When I recently attached two SPI devices (SD Card and LCD) i noticed, that the chip select is not the only problem. Both devices (i mean their libs) did use a different and incompatible SPI setup. And both libs did this setup only during their lib startup phase. This forces me to save the SPI state of both libs and restore the settings, depending which device i want to access next.

Oliver
558  International / Deutsch / Re: UNO per Linux und bash mit Sketch versorgen on: April 05, 2012, 02:47:59 pm
Ich verwende praktisch ausschließlich Makefiles für meinen "Uno".
Mit make -n ausgegeben lauten bei mir das Upload Kommando:

stty -F /dev/ttyACM0 hupcl
avrdude -V -F -C /home/kraus/prg/arduino-0022//hardware/tools/avrdude.conf  -p atmega328p -P /dev/ttyACM0 -c stk500v1  -b 115200 -U flash:w:tmp/HelloWorld.hex

ok, ob das jetzt ttyACM0 oder ACM1 heisst, hängt von der Anzahl der angeschlossenen UNO's ab. Manchmal kommt Linux auch durcheinander, wenn die Arduino IDE noch aktiv ist.

Was mir aber noch aufgefallen ist: Du verwendest das conf file unter /etc. Ich hab mir angewöhnt das conf file aus der Arduini IDE zu benutzen. Auf jedenfall falsch ist das baud-raten Kommando (-b). Der Uno erwartet die Daten wesentlich schneller. Grundsätzlich sollte das Makefile das boards.txt auslesen.

Meine Makefiles für Uno mit 0022 bzw Uno mit 1.00 liegen u.a. hier:
http://code.google.com/p/u8glib/source/browse/#hg%2Fsys%2Farduino%2FHelloWorld

Sehr empfehlen kann ich auch das Makefile hier:
http://arduino.cc/forum/index.php/topic,88989.0.html
Vor allem die Idee mit dem screen Befehl ist sehr nett (simuliert den Serial Monitor der Arduino IDE)

Oliver

Edit: Wollte noch anmerken, dass es bei dem eingangs genannten Fehler zuweilen notwendig ist, den Uno zu reseten und unmittelbar danach den Upload zu starten. Das hilft oft.
559  International / Deutsch / Re: Etwas genau eine Minute Programieren on: April 05, 2012, 02:31:50 pm
Also, es spricht nichts dagegen, dieses Code-Fragment irgendwo mitten im Code zu benutzen. Das mit dem "flushen" hab ich aber nicht verstanden.

Das "L" ist an sich in diesem Fall nicht notwendig. Es handelt sich hier um den Zahlen-Anhängsel, der aus der Zahl eine "long" Zahl macht. Aber genauer müsste es eigentlich "UL" für unsigned long heissen:

Code:
unsigned long ziel_zeit;
ziel_zeit = millis() + 1000UL*60UL;
while( ziel_zeit >= millis() )
{
  // frage sensor ab
}

Mit anderen worten "1000" wäre eine vorzeichenbehaftete 16 Bit Zahl, jedoch "1000UL" ist eine vorzeichenlose 32 Bit Zahl. Es ist an sich sicherer alle Terme eines Ausdrucks vom selben Datentyp zu haben. Da "millis()" einen unsigned long zurückgibt, sollte man auch einen unsigned long dazuaddieren.

Quelle: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
Abschnitt 6.4.4.1 (Seite 54, bzw 66 im PDF)

Oliver
560  International / Deutsch / Re: Etwas genau eine Minute Programieren on: April 05, 2012, 12:09:04 pm
Code:
unsigned long ziel_zeit;
ziel_zeit = millis() + 1000L*60L;
while( ziel_zeit >= millis() )
{
  // frage sensor ab
}

das code Fragmet oben zu schreiben dauerte leider 1 1/2 Minuten. Somit habe ich leider etwas länger als eine Minute programmiert. Ich hoffe das macht nichts.  smiley-wink

Oliver
561  Using Arduino / Displays / Re: MENWIZ: yet another character lcd menu wizard library on: April 05, 2012, 11:09:21 am
Quote
MENWIZ requires LiquidCrystal_I2C
Will there be support for the standard Arduino LiquidCrytal lib?

Oliver
562  Using Arduino / Displays / Re: MENWIZ: yet another character lcd menu wizard library on: April 04, 2012, 05:18:41 pm
Hi liudr and brunialti

Very interessting discussion. I have learned a lot today. I never thought of a dynamic menu system. Indeed, i never thought it could be possible. My own menu system (m2tklib) uses a complete static approch...

It would be interesseting to analyse these differences more closely. Something like this: Define a task which could be implemented by any of the menu libs and compare the results. Occupied flash, ram. Execution  speed. Lib maintenance, usability, learning curve.

Unfortunately, github seems to be down at the moment... so its just a thought...

Oliver


 



 
563  International / Deutsch / Re: projekt | arduino game controller on: April 03, 2012, 05:23:32 pm
Hi
Ich glaube die c't hatte da mal einen Artikel über einen 3D Controller:
http://www.heise.de/ct/projekte/machmit/processing/wiki/AufbauArduino

Der verwendete Sensor ADXL330 auf einem Adapterboard wird einzeln und im Bausatz angeboten.

Über 3D Darstellung denke ich selbst schon seit längerem nach, aber ich befürchte, dass die Rechenleistung nicht so wirklich ausreicht. 2D wäre am Anfang sicher erfolgversprechender. Wie soll denn die Ausgabe erfolgen? Auf ein Graphik-Display?

Realistisch für Echtzeitanwendungen sind Monochrome Graphik-Displays bis ca. 128x64. Ausserdem sollte es eine passende Lib geben (d.h. der Display-Controller sollte unterstützt werden). Übersicht beispielsweise hier:
http://code.google.com/p/u8glib/wiki/device

Oliver
564  Using Arduino / Displays / Re: Select option from LCD screen on: April 03, 2012, 06:51:45 am
Similar discussion seems to be here:
http://arduino.cc/forum/index.php/topic,98875.15.html
565  Using Arduino / Displays / Re: 2.4 TFT Color LCD with Arduino Uno Rev 3 on: April 03, 2012, 06:44:32 am
At least the Controller is supported by this lib:
http://henningkarlsen.com/electronics/library.php

Oliver
566  International / Deutsch / Re: Bouncer-Problem on: April 02, 2012, 12:19:42 pm
Ich glaube eine Frage bezüglich dieses Codes war noch offen.
Code:
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);

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:
1. Name des Elementes
2. 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.

Der Format-String selbst, ist hier beschrieben:
http://code.google.com/p/m2tklib/wiki/elref#Element_Format_String

Betrachten wir nochmal kurz das Ergebnis:


Ganz rechts ist eine Spalte mit dem Scrollbalken. Das Ding heisst VSB (vertical scroll bar) und ist hier dokumentiert:
http://code.google.com/p/m2tklib/wiki/elref#VSB

Die ersten beiden Parameter sind die üblichen:
Code:
M2_VSB(el_bw_vsb, "l4w1r1", &el_bw_first, &el_bw_cnt);
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.
Code:
M2_STRLIST(el_bw, "l4w12", &el_bw_first, &el_bw_cnt, el_bw_getstr);
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)
- M2_LIST selbst ist KEIN Element.

Nochmal der Code:
Code:
M2_LIST(list_bw) = { &el_bw, &el_space, &el_bw_vsb };
M2_HLIST(el_bw_hlist, NULL, list_bw);

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

Oliver


567  International / Deutsch / Re: Bouncer-Problem on: April 02, 2012, 05:38:59 am
Quote
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:
http://code.google.com/p/m2tklib/wiki/elref#STRLIST. 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
http://www.c-howto.de/tutorial-strings-zeichenketten.html

Quote
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:
1. Wie viele Elemente gibt es denn insgesamt?
2. Wie viele Elemente sollen denn sichtbar sein?
3. Welches ist das erste sichtbare element? (wird teilweise automatisch berechnet)
4. 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

Code:
uint8_t el_bw_first = 0;
uint8_t el_bw_cnt = BW_TOTAL;

Darüber werden die Informationen
1. Wie viele Elemente gibt es denn insgesamt?
3. 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...)

Code:
if ( msg == M2_STRLIST_MSG_SELECT ) {
    brennweite = idx; (...)
Quote
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.

Code:
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);

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.

Hier ist das entsprechende Tutorial:
http://code.google.com/p/m2tklib/wiki/t02lc


Grüße,
Oliver
568  International / Deutsch / Re: Bouncer-Problem on: April 02, 2012, 04:52:43 am
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:
#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:
if ( bw == BW_135 )
als
Code:
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:
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:
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
569  International / Deutsch / Re: Bouncer-Problem on: April 01, 2012, 03:42:26 pm
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
570  International / Deutsch / Re: Bouncer-Problem on: March 31, 2012, 10:06:11 am
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
Pages: 1 ... 36 37 [38] 39 40 ... 56