Pages: 1 [2] 3   Go Down
Author Topic: Einsteiger benötigt Hilfe  (Read 1974 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Eisebaer
Hi. Also, das habe ich in meiner allerersten Auseinandersetzung mit dem Arduino und dieser Aufgabenstellung bereits erledigt. Das reine Lesen von (bei mir waren es) 12 Tasten ist möglich und funktioniert absolut reibungslos. Auch ohne Goto befehle und der Abfrage der 4 "speziellen" Tasten und das hier war quasi mein Versuch, die Abfrage der 4 "speziellen" Tasten mit einzubinden smiley-wink
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Außerdem werden Rücksprungadressen in den Stack geschrieben, die bei einem Herausspringen aus einer Schleife mittels goto nicht gelöscht werden und so den Stack zum Überlauf bringen. Das macht den Sketch instabil.

Kinder, Uwe ist ein toller Moderator, aber alles darf man ihm auch nicht glauben.

Mit einem goto kann man nicht aus einer Funktion herausspringen (oder hinein) und so den Stack "zum Überlauf bringen". So einen Mist würde der avrgcc Compiler nicht zulassen. Wo goto syntaktisch zulässig ist, funktioniert es auch. Und es funktioniert auch 1000 Mal, d.h. nach einer halben Sekunde noch.

Aber außer den Sonderfällen continue; break; return; sollte man wirklich ohne Sprünge auskommen und eher an Funktionen denken, wenn man die gleiche Aktion an verschiedenen Stellen im Code braucht.

Falls das missverständlich war: Natürlich kann man Code schreiben, der den RAM zum Überlauf bringt, ohne dass der Compiler es merken kann.
Z.B. ein String Objekt verwenden smiley-wink
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ups

ich hoffe aber bei 99,5% der Fälle liege ich aber richtig  smiley-wink smiley-wink smiley-wink
Grüße Uwe
« Last Edit: February 05, 2013, 06:29:08 pm by uwefed » Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

habe mitgeschrieben, uwe, 99,63267%, ein insgesamt tragbares ergebnis...
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Stefan, da bin ich ja beruhigt.  smiley-roll-sweat smiley-roll-sweat  smiley-wink smiley-wink
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, das war auch mein intuitives Gefühl:
   99,5 % Treffer ist zu wenig bei Uwe.

Und Danke, dass ich hier den Rechthaber spielen darf. Zuhause gibt's immer Streit, wer der größere Rechthaber ist
 smiley-roll

Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

und wir vertrauen jedem Post von dir, Uwe!
Wir bauen auf dich!

Dirk
Logged

using arduino leonardo
--
tomorrow today will only be yesterday, so live your life today!

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also, ich habe jetzt ein wenig rum probiert und folgendes kam dabei heraus:

Code:
int fin[]  = {0,1,2,3,4,5,6,7,8,9,10,11};
int chan[] = {A0, A1, A2, A3};
int led    = 13;

void setup()
{
  for(int i = 0 ; i <=11 ; i++)
  {
    pinMode(fin[i], INPUT_PULLUP);
    pinMode(chan[i], INPUT_PULLUP);
  }
  pinMode(led, OUTPUT);
  Keyboard.begin();
  Serial.begin(9600);
}

#define CHARBUTTONS 12
#define MODIFIERBUTTONS 4

char charTable[MODIFIERBUTTONS+1][CHARBUTTONS]={
    {'a','b','c','d','e','f','g','h','i','j','k','l'},
    {'m','n','o','p','q','r','s','t','u','v','w','x'},
    {'y','z','!','%','&','/','(',')','=','?','.',','},
    {'1','2','3','4','5','6','7','8','9','0','+','-'}
    };


int readCharButton()
{
  for(int j = 0 ; j<=11 ; j++)
  {
    if(digitalRead(fin[j]) == LOW)
    {
      return j;
    }
    else
    {
      return -1;
    }
  }
}


int readModifierButton()
{
  for(int i = 0 ; i <= 3 ; i++)
  {
    if(digitalRead(chan[i]) == LOW)
    {
      return i;
    }
    else
    {
      return 0;
    }
  }
}

   
void fireButton(int charBtn, int modifierBtn)
{
  Keyboard.press(charTable[modifierBtn][charBtn]);
  Serial.println(charTable[modifierBtn][charBtn]);
}

void loop()
{
  int charButton,modifierButton;
  charButton=readCharButton();
  if (charButton>=0)
  {
    modifierButton=readModifierButton();
    fireButton(charButton,modifierButton);
  }
  else
  {
    Keyboard.releaseAll();
  }
}

Mir selbst fallen am laufenden Band Fehler auf und ich weiß, es ist nicht sonderlich gut. Ich habe da nur ein Problem: die einzige belegte "Taste", scheint der Pin 0 zu sein, denn egal was ich sonst ground'e, es passiert nichts. Auch nicht bei den ModifierTasten. Es ist grade ca. 23.20 und mir fällt einfach nicht auf wo der Fehler ist. Ist es ein einfacher, fast schon doofer Fehler, der einem quasi mit Neonroter Farbe in Gesicht springt? Mir fällt der Fehler einfach nicht auf..
Und sorry, das ich die ganze Zeit Nerve   smiley-sweat
« Last Edit: February 06, 2013, 05:42:57 pm by Thorben » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
int readCharButton()
{
  for(int j = 0 ; j<=11 ; j++)
  {
    if(digitalRead(fin[j]) == LOW)
    {
      return j;
    }
    else
    {
      return -1;
    }
  }}
Du kontrollierst das erste Pin und springst dann auf jeden Fall mit 0 oder -1 heraus. Die for Schleife wird nicht durchlaufen.
Du mußt die ganze for Schleife durchlaufen lassen und nur im Fall, daß keine Taste gedrückt ist, mit -1 zurückspringen.

Diese Code findet bei mehreren gedrückten Tasten nur die am niedrigrsten Pin angeschlossenen.
Code:
int readCharButton()
{
  for(int j = 0 ; j<=11 ; j++)
  {
    if(digitalRead(fin[j]) == LOW)
    {
      return j;
    }
  }
return -1;
}

Grüße Uwe
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bei der Funktion int readModifierButton() hast Du das gleiche Problem. Bei solchen Fehlern hilft es meistens, wenn man versucht Schritt für Schritt die problematische Funktion durchzugehen und alle einzelnen Programmschritte nachzuvollziehen, dann merkt man häufig shon, wo der Fehler liegt.

Code:
int readModifierButton()
{
  for(int i = 0 ; i <= 3 ; i++)
  {
    if(digitalRead(chan[i]) == LOW)
    {
      return i;
    }
    else
    {
      return 0;
    }
  }
}


Code:
int readModifierButton()
{
  for(int i = 0 ; i <= 3 ; i++)
  {
    if(digitalRead(chan[i]) == LOW)
    {
      return i;
    }
  }
  return 0;

}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah, also, ich muss glaube ich noch mal einmal kurz sagen, wie die ModifierButton funktionieren sollen smiley-grin Also, drückt man einmal drauf, werden andere Buchstaben geschrieben, ABER mann muss die Tasten nicht festhalten, sondern einmaliges Drücken genügt ^^
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist doch kein Problem. Du verwendest einfach eine Variable "chan_state". Jedesmal wenn einer der "chan"-Button erkannt wurde, dann setzt Du den Wert entsprechend des erkannten Buttons. chan_state = 1 für den ersten, chan_state=2 für den 2. usw.
Wenn Du nun eine gedrückte "normale" Taste erkannt hast, verwendest Du einfach den aktuellen Wert von chan_state als Index für das Array char charTable um die entsprechende Zeile mit den Zeichen auszuwählen.
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2448
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah, also, ich muss glaube ich noch mal einmal kurz sagen, wie die ModifierButton funktionieren sollen smiley-grin Also, drückt man einmal drauf, werden andere Buchstaben geschrieben, ABER mann muss die Tasten nicht festhalten, sondern einmaliges Drücken genügt ^^

Also die Funktion Deiner Modifier-Buttons soll mehr so funktionieren wie die Großbuchstaben-Feststelltaste (CapsLock) auf einer Tastatur und nicht so wie die Großbuchstaben-Umschalttaste (Shift): Einmal drücken: Modifier-Funktion einschalten. Nochmal drücken: Modifier-Funktion ausschalten?

Dann mußt Du Dir einfach merken, ob einer der Modifier-Buttons eine gerade oder eine ungerade Anzahl von malen gedrückt wurde.

Und welcher der Modifier-Buttons soll dann gelten? Alle gleichzeitig?

Mit vier Modifier-Buttons gibt es 24 Möglichkeiten, wie die Schaltzustände sein können, d.h. ein Buchstabe könnte damit auf 16 Arten modifiziert werden. Soll das so sein?

Oder soll nur mittels der zuletzt bewegten Taste modifiziert werden? Dann müßtest Du Dir nicht nur merken, welche Taste gerade gesetzt oder nicht gesetzt ist, sondern auch, welcher Modifier-Button als letztes betätigt wurde.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also, kurze Erklärung. Man muss sich das wie folgt vorstellen: An dem Daumen befindet sich eine Kupferplatte, ebenso wie drei weitere an jedem anderem Finger. Eine Jeweils an den Spitzen vom Zeige- bis zum Kleinem Finger. Berührt man mit einer Kupferplatte, die Daumen-Kupferplatte, so schreibt man einen Buchstaben. So kann man 12 Buchstaben schreiben oder Tasten drücken oder was auch immer.die Aufgabenstellung sagt allerdings klar das es 20 oder mehr Tasten sein müssen. Dazu habe ich mir gedacht, an jedem der Finger eine weiter Kupferplatte zu basteln die, sobald man sie drückt, werden auf den 12 Platten andere Tasten gedrückt. Berührt man z.B: also direkt nach dem Start mit den Fingerspitzen den Daumen, so drückt man a, b, c und d. Drückt man jetzt die chan-Taste A1 z.B. so schreibt man mit den gleichen Fingern e, f, g und h. So kann man damit bis zu 48 Tasten drücken oder Buchstaben drücken oder sonst was tuhen. Das drücken von shift oder Strg oder sonstigen Sondertasten ist in den 12-"Normalen"-Fingertasten beinhaltet (oh gott, das klingt komisch..). So soll das funktionieren.

@mkl0815
Exakt diese Idee kam mir auch heute smiley-grin
Das kommt davon wenn man versucht um 23.00 Uhr einen Programmcode zu schreiben  smiley-sad-blue smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, ich habe jetzt einen funktionierende Programmcode smiley

Code:
int fin[]  = {0,1,2,3,4,5,6,7,8,9,10,11};
int chan[] = {A0, A1, A2, A3};
int led    = 13;
int chan_state = 0;

void setup()
{
  for(int i = 0 ; i <=11 ; i++)
  {
    pinMode(fin[i], INPUT_PULLUP);
    pinMode(chan[i], INPUT_PULLUP);
  }
  pinMode(led, OUTPUT);
  Keyboard.begin();
  Serial.begin(9600);
}

#define CHARBUTTONS 12
#define MODIFIERBUTTONS 4


char charTable[MODIFIERBUTTONS+1][CHARBUTTONS]={
    {'a','b','c','d','e','f','g','h','i','j','k','l'},
    {'m','n','o','p','q','r','s','t','u','v','w','x'},
    {'y','z','!','%','&','/','(',')','=','?','.',','},
    {'1','2','3','4','5','6','7','8','9','0','+','-'}
    };


int readCharButton()
{
  for(int j = 0 ; j<=11 ; j++)
  {
    if(digitalRead(fin[j]) == LOW)
    {
      return j;
    }
  }
  return -1;
}


int readModifierButton()
{
  for(int i = 0 ; i <= 3 ; i++)
  {
    if(digitalRead(chan[i]) == LOW)
    {
      chan_state = i;
    }
  }
  return chan_state;
}

   
void fireButton(int charBtn, int modifierBtn)
{
  Keyboard.press(charTable[modifierBtn][charBtn]);
  Serial.println(charTable[modifierBtn][charBtn]);
}

void loop()
{
  int charButton,modifierButton;
  charButton=readCharButton();
  modifierButton=readModifierButton();
  if (charButton>=0)
  {
    fireButton(charButton,modifierButton);
  }
  else
  {
    Keyboard.releaseAll();
  }
}

vielen Dank für eure Hilfe!
Logged

Pages: 1 [2] 3   Go Up
Jump to: