Forum: Mikrocontroller und Digitale Elektronik Snake Projekt: Steuerung


von Jan S. (spongebob)


Lesenswert?

Moin!
Ich habe ma wieder ein Problem mit meinem Snakeprojekt.
Also die ansteuerung der Matrix läuft ja jetzt sauber, wie aus meinen 
vorigen Beiträgen zu sehen ist.
Jetzt geht es darum die Bedienung zu realisieren. Ich habe da jetzt 
schon ne Menge dran rumgespielt.
Zum Steuern habe ich mir ein altes Sega Megadrive Gamepad ausgegraben. 
Das finde ich echt optimal. Der Anschluss lässt sich einfach über einen 
D-Sub stecker realisieren, die ganze Geschichte läuft bei 5V, um 
entprellen oder so was braucht man sich keine Sorgen machen und das 
Tasten auslesen läuft Parallel, also keine Serielle Datenverarbeitung 
mit Protokoll ausdenken oder so.
Ich hab zum detektieren der Tasten einen Timer interrupt vorgesehen, bei 
dem in bestimmten Zeitabständen abgefragt wird ob irgend ne Taste 
gedrückt wurde.
Um das Spiel zu starten habe ich mir so etwas wie eine Menüstruktur 
überlegt und dank einiger kompetenter Menschen hier konnte ich teile von 
vorgestelltem Code einfach für mich umbauen.

Ich wäre froh wenn ihr mal über den Code drüberkucken könntet, um mir 
notfalls zu sagen ob ich auf dem Holzweg bin und mir lieber etwas neues 
überlegen soll, oder ob ich so weiter machen kann.
Das Projekt hatte ich ehrlich gesagt etwas unterschätzt...
Hier der Code zur Snakesteuerung:
1
#include <stdint.h>
2
#include "snake.h"
3
#include "SegaGamepad.h"
4
#include "matrix8x16.h"
5
6
typedef void (*MenuFunc)(int8_t);
7
8
int8_t active = 0;
9
10
struct MenuEntry
11
{
12
  int8_t up;
13
  int8_t down;
14
  int8_t left;
15
  int8_t right;
16
  int8_t b;
17
  int8_t c;
18
  MenuFunc Function;
19
};
20
21
struct MenuEntry Menu[] = 
22
{
23
  {0, 0, 0, 0, 1, 0, ShowSnake  },  //snakepicture  (0)
24
  {1, 1, 1, 1, 2, 0, SetSpeed    },  //speedoption  (1)
25
  {4, 4, 4, 4, 3, 1 /*run the snake*/    },  //play game    (2)
26
  {3, 3, 3, 3, 2, 1 /*stop snake*/    }  //pause game  (3)  
27
};
28
29
30
void GetButton(int8_t ThisButton)
31
{
32
  switch(ThisButton)
33
  {
34
    case BUTTON_UP:
35
      active = Menu[active].up;
36
      //Menu[active].funktion();
37
      break;
38
      
39
    case BUTTON_DOWN:
40
      active = Menu[active].down;
41
      break;
42
      
43
    case BUTTON_LEFT:
44
      active = Menu[active].left;
45
      break;
46
      
47
    case BUTTON_RIGHT:
48
      active = Menu[active].right;
49
      break;
50
      
51
    case BUTTON_B:
52
      active = Menu[active].b;
53
      Menu[active].Function(active);
54
      break;
55
      
56
    case BUTTON_C:
57
      active = Menu[active].c;
58
      break;
59
      
60
    default:
61
      break;
62
  }
63
  
64
  ClearButton();
65
}
66
67
void SetSpeed(int8_t direction)
68
{
69
  ClearMatrix();
70
}

Naja, jetzt entlich zu dem Problem.
Ich bekomme die Fehlermeldung:
'ShowSnake' undeclared here (not in a function).
Mit SetSpeed funktionierts komischerweise.
Ich habe die Vermutung das eine Funktion die in einem anderen .c-File 
liegt ( wie ShowSnake() ) nicht mit diesem Funktionspointer genutzt 
werden kann.
Kann das sein? Wenn ja, welche Möglichkeit gibts dann? Irgendwie muss 
das doch gehen.

Naja, ich hoffe Ihr könnt mir helfen.

Grüße Jan

von Fabian O. (xfr)


Lesenswert?

Du musst die Funktion deklarieren, bevor Du darauf verweisen kannst:
1
void ShowSnake(int8_t x);

Die Deklaration gehört normalerweise in die h-Datei, die zu der c-Datei 
gehört, in der die Funktion definiert wird. Wenn ShowSnake() also in 
snake.c definiert wird, gehört die Deklaration in snake.h. snake.h hast 
Du ja schon ins Hauptprogamm inkludiert, damit ist die Funktion dann 
dort bekannt.

von Jan S. (spongebob)


Lesenswert?

Oh man, is mir das peinlich. Ich habe gestern abend wohl etwas hektisch 
rumgesucht und nicht beachtet das ich die ShowSnake() die ich gerade neu 
gebastelt hatte ja auch im Header einbinden muss.
Das Problem is damit wohl gegessen...
Vom Aufbau her is das aber ok, wies aussieht.

Danke für den Tipp.

Grüße Jan

von Karl H. (kbuchegg)


Lesenswert?

So ein universelles Menüsystem kann man machen.
Weil bei dir halt die Menüfunktion nicht sehr umfangreich ist.

Aber im Grunde ist es overkill für 3 Menuüpunkte. Eine ordentliche 
Tastenentprellung und die Tastenabfrage in den Funktionen würde es in 
deinem Fall auch tun.

von Jan S. (spongebob)


Lesenswert?

Ich habe zusätzlich noch den Fehler gefunden, das durch diese ganze 
Umstrukturierung in einer Header-Datei ein #ifndef Falscher Dateiname 
stand. deshalb wurden Funktionen nicht gefunden. Ich habe gestern auch 
festgestellt, das wohl mit den Tasterroutinen irgendwas nicht stimmt, 
oder das Gamepad prellt doch. Habe jedoch leider keine Möglichkeit das 
mal eben mit nem Oszi zu messen, aber ich denke ich werde das einfach 
mal programmtechnisch abfragen und an den Tasterroutinen noch ein 
bisschen rumfeilen.
Sonst bekomme ich irgendwann gar nicht mehr raus wo die Fehler 
herkommen.
Vielleicht bau ich dann doch auf sone Switch-Case geschichte um, ich hab 
nur immer angst das das dann irgendwann alles zu unübersichtlich wird.

Naja, ich hab dann wohl erstma wieder zu tun.

Grüße Jan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.