Forum: Mikrocontroller und Digitale Elektronik Ping-Pong über LED-Brett für Anfänger


von Loramor (Gast)


Lesenswert?

Hallo Leute,
habe seit 3 Monaten etwa Mikrocontroller im Unterricht und bin bei 
meinen recherchen auch auf das Ping-Pong Spiel gestoßen.

Ich habe da auch schon einige codes gesehen aber die versteh ich nicht 
und die sind mir leider noch zu komplex.

Wir haben gerade pwm durchgenommen und sind jetzt bei interrupts.

Ich wollte halt mal fragen ob man den Code auch vereinfachen kann?

So dass ich beispielsweise sage, bei knopf "hoch" geht immer eine LED 
aus und eine andere an damit das so aussieht als würden die balken sich 
bewegen?

dann wäre noch das Problem wie man es mit dem Ball einfacher realisieren 
kann?

Wäre cool wenn es da eine einfachere Lösung geben würde.

Mfg
Loramor

: Verschoben durch User
von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> ob man den Code auch vereinfachen kann?

welchen Code meinst du denn?

von Frank (Gast)


Lesenswert?

ohne code gibt das keinen

von Loramor (Gast)


Lesenswert?

ja dachte es würde so einen standard code geben.
hatte hier schon welche im forum gefunden.
ich guck mal ob ich den noch wieder finde

von Loramor (Gast)


Lesenswert?

hier ist mal ein code
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/signal.h>
4
5
#include "font.h"
6
7
int pong_mode;
8
9
/***************************************\
10
 * Ports:
11
 * A0-6: Dot matrix rows
12
 * D0-4: Dot matrix columns
13
 * B0:   Player 2 UP
14
 * B1:   Player 2 DOWN
15
 * B2:   Player 1 UP
16
 * B3:   Player 1 DOWN
17
 * B4:   Player 2 score LED
18
 * B5:   Player 1 score LED
19
 \***************************************/
20
21
/***************************************\
22
 * Framebuffer(5x7 dot matrix):
23
 * 6 x x x x O
24
 *   x x x x O <- p2_pos = 5
25
 *   x x x x x
26
 *   x x x x x
27
 *   x x x x x
28
 *   x x x x O
29
 * 0 x x x x O <- p2_pos = 0
30
 *   0       4
31
 \***************************************/
32
33
volatile unsigned char framebuffer[5];
34
volatile unsigned char framebuffer_pos = 0x00;
35
36
volatile char ball_x;
37
volatile char ball_y;
38
volatile char ball_dx;
39
volatile char ball_dy;
40
volatile char p1_pos; /* Position of player 1 paddle */
41
volatile char p2_pos; /* Position of player 2 paddle */
42
volatile char ballClock; /* Move ball only every to tick */
43
volatile char redraw_needed;
44
volatile char speed_counter; /* increase speed as game goes on */
45
const char speed_bumper = 10; /* increase speed after this many movement_timer ticks */
46
volatile char current_speed;
47
volatile char score; 
48
const unsigned char d1[] = {0x00, 0x10, 0x20, 0x7f, 0x00}; /* the number 1 */
49
const unsigned char d2[] = {0x47, 0x49, 0x49, 0x49, 0x31}; /* the number 2 */
50
51
52
#define BV(x) _BV(x)
53
#define outw(a, b) (a = (b))
54
#define outp(a, b) (b = (a))
55
#define inp(a) (a)
56
57
58
/* Draw paddles and ball */
59
void drawScene()
60
{
61
  framebuffer[0] = BV(p1_pos) | BV(p1_pos+1);
62
  framebuffer[1] = 0;
63
  framebuffer[2] = 0;
64
  framebuffer[3] = 0;
65
  framebuffer[4] = BV(p2_pos) | BV(p2_pos+1);
66
  framebuffer[(unsigned char)ball_x] |= BV(ball_y);
67
}
68
69
void variable_init(void)
70
{
71
  ball_x  = 2;
72
  ball_y  = 3;
73
  ball_dx = 1;
74
  ball_dy = 0;
75
  p1_pos = 2;
76
  p2_pos = 2;
77
  ballClock = 0;
78
  redraw_needed = 1;
79
  speed_counter = 0;
80
        current_speed = 3;
81
  outw(OCR1A,40000);
82
}
83
84
void ioinit(void)
85
{
86
  /* Set port C and B0-3, B6-7, to internal pullup, B4-5 output */
87
  outp(0x30, DDRB);
88
  outp(0x00, DDRC);
89
  outp(0xcf, PORTB);
90
  outp(0xff, PORTC);
91
92
  /* Set port A and D to output */
93
  outp(0xff, DDRA);
94
  outp(0xff, DDRD);
95
96
  /* Enable 8-bit counter1, running on clk speed */
97
  outp(BV(CS01), TCCR0);
98
99
  /* Set OCR1A as max value and Enable 16-bit counter,
100
   * running on clk/8 speed */
101
  outp(BV(WGM12)|BV(CS11), TCCR1B);
102
  
103
  /*  */
104
  outw(OCR1A,40000);
105
106
  /* Enable overlow when counter1 reaches OCR1A */
107
  /*outp(BV(TOV1), TIFR);*/
108
109
  /* Enable overflow interrupt for counter 0 and counter 1*/
110
  timer_enable_int(BV(TOIE0)|BV(OCIE1A));
111
112
  /* Enable interrupts */
113
  sei();
114
}
115
116
/* Switch leds to indicate who's leading */
117
void update_score_output(void) {
118
  if (score == 1) 
119
  {
120
    outp(0xef, PORTB); /* turn on led for player 1 */
121
  }
122
  else if(score == -1)
123
  {
124
    outp(0xdf, PORTB); /* turn on led for player 2 */
125
  }
126
  else
127
  {
128
    outp(0xcf, PORTB); /* turn off leds */
129
  }
130
}
131
132
void victory(void)
133
{
134
  unsigned char buttons;
135
  int i;
136
  int j;
137
  
138
  /* turn off counter */
139
  outp(0x00, TCCR1B);
140
  
141
  /* turn on both leds */
142
  /* outp(0xff, PORTB); */
143
144
  /* Display winner */
145
  if (score == 1) 
146
  {
147
    framebuffer[0] = d1[0];
148
    framebuffer[1] = d1[1];
149
    framebuffer[2] = d1[2];
150
    framebuffer[3] = d1[3];
151
    framebuffer[4] = d1[4];
152
  }
153
  else 
154
  {
155
    framebuffer[0] = d2[0];
156
    framebuffer[1] = d2[1];
157
    framebuffer[2] = d2[2];
158
    framebuffer[3] = d2[3];
159
    framebuffer[4] = d2[4];
160
  }
161
  sei();
162
163
        /* wait a little */
164
  for (i = 0; i < 5000; i++)
165
    for (j = 0; j < 1000; j++) j=j;
166
  /* wait for buttonpress to start again */
167
  buttons = ~inp(PINB);
168
  while( (buttons & 0x0f) == 0x00 ) {
169
    unsigned char wait_count;
170
    for (wait_count = 0; wait_count < 0xff; ++wait_count);
171
    buttons = ~inp(PINB);
172
  }
173
174
  cli();
175
176
  /* Reinit */
177
  variable_init();
178
  ioinit();
179
  score = 0;
180
        speed_counter = 0;
181
}
182
183
/* Movement */
184
void timer_movement(unsigned char portB)
185
{
186
  unsigned char p1_up; /* Player 1  up  button pressed */
187
  unsigned char p1_dn; /* Player 1 down button pressed */
188
  unsigned char p2_up; /* Player 2  up  button pressed */
189
  unsigned char p2_dn; /* Player 2 down button pressed */
190
  char pos;
191
  char loose;
192
  char paddle_bounce;
193
  int i;
194
  int j;
195
196
  /* Read buttons */
197
  p1_up = portB & 0x04; /* Pin B2 */
198
  p1_dn = portB & 0x08; /* Pin B3 */
199
  p2_up = portB & 0x01; /* Pin B0 */
200
  p2_dn = portB & 0x02; /* Pin B1 */
201
202
  /* Stop paddle movement at wall */
203
  p1_up = (p1_up && p1_pos < 5);
204
  p1_dn = (p1_dn && p1_pos > 0);
205
  p2_up = (p2_up && p2_pos < 5);
206
  p2_dn = (p2_dn && p2_pos > 0);
207
208
  /* Move paddles */
209
  if (p1_up) p1_pos++;
210
  if (p1_dn) p1_pos--;
211
  if (p2_up) p2_pos++;
212
  if (p2_dn) p2_pos--;
213
214
  /* Move ball only every two clock tick */
215
  if ((ballClock = !ballClock))
216
  {
217
    /* Bounce ball on wall */
218
    if (ball_y == 0) ball_dy = -ball_dy;
219
    if (ball_y == 6) ball_dy = -ball_dy;
220
221
    /* Bounce ball on paddle */
222
    loose = 0;
223
    paddle_bounce = 0;
224
    pos = (ball_x == 1)?p1_pos:p2_pos;
225
    if (ball_x == 1 || ball_x == 3)
226
    {
227
      loose = 1;
228
      if (ball_y == pos || ball_y == pos+1)
229
      {
230
        ball_dx = -ball_dx;
231
        loose = 0;
232
        paddle_bounce = 1;
233
      }
234
      else if (ball_y == pos-1 && ball_dy == 1)
235
      {
236
        ball_dx = -ball_dx;
237
        ball_dy = -ball_dy;
238
        loose = 0;
239
        paddle_bounce = 1;
240
      }
241
      else if (ball_y == pos+2 && ball_dy == -1)
242
      {
243
        ball_dx = -ball_dx;
244
        ball_dy = -ball_dy;
245
        loose = 0;
246
        paddle_bounce = 1;
247
      }
248
249
    }
250
    if (loose)
251
    {
252
      if (ball_x == 1)  /* player 2 won */
253
      {
254
        if (score == -1) /* total victory! */
255
        {
256
          victory();
257
          return;
258
        }
259
        else
260
        {
261
          score--;
262
          update_score_output();
263
264
          ball_x += ball_dx;
265
          ball_y += ball_dy;
266
          redraw_needed = 1;
267
268
          outp(0x00, TCCR1B); /* turn off counter */
269
          sei(); /* Re-enable interrupts */
270
          /* Wait a little */
271
          for (i = 0; i < 5000; i++)
272
            for (j = 0; j < 1000; j++) j=j;
273
          cli(); /* Disable interrupts again */
274
          outp(BV(WGM12)|BV(CS11), TCCR1B); /* turn on counter */
275
        }
276
      }
277
      else { /* player 1 won */
278
        if (score == 1) /* total victory! */
279
        {
280
          victory();
281
          return;
282
        }
283
        else
284
        {
285
          score++;
286
          update_score_output();
287
288
          ball_x += ball_dx;
289
          ball_y += ball_dy;
290
          redraw_needed = 1;
291
292
          outp(0x00, TCCR1B); /* turn off counter */
293
          sei(); /* Re-enable interrupts */
294
          /* Wait a little */
295
          for (i = 0; i < 5000; i++)
296
            for (j = 0; j < 1000; j++) j=j;
297
          cli(); /* Disable interrupts again */
298
          outp(BV(WGM12)|BV(CS11), TCCR1B); /* turn on counter */
299
        }
300
      }
301
      variable_init();
302
      update_score_output();
303
    }
304
305
    /* Change vertical speed of ball according to paddle speed */
306
    if (paddle_bounce)
307
    {
308
      if (ball_x == 1 && p1_up && ball_dy <  1) ball_dy++;
309
      if (ball_x == 1 && p1_dn && ball_dy > -1) ball_dy--;
310
      if (ball_x == 3 && p2_up && ball_dy <  1) ball_dy++;
311
      if (ball_x == 3 && p2_dn && ball_dy > -1) ball_dy--;
312
    }
313
314
    /* Wall bounce after paddle bounce */
315
    if (ball_y == 0 && ball_dy == -1) ball_dy = -ball_dy;
316
    if (ball_y == 6 && ball_dy ==  1) ball_dy = -ball_dy;
317
318
    /* Move ball */
319
    ball_x += ball_dx;
320
    ball_y += ball_dy;
321
  }
322
323
  redraw_needed = 1;
324
}
325
326
/* Framebuffer output to led matrix */
327
SIGNAL(SIG_OVERFLOW0)
328
{
329
  if (++framebuffer_pos > 4) framebuffer_pos = 0;
330
331
  /* Change output to dot matrix */
332
  outp(0xff, PORTA); /* Avoid ghosting */
333
  outp(BV(framebuffer_pos), PORTD);
334
  outp(~framebuffer[framebuffer_pos], PORTA);
335
336
  if (!pong_mode) return;
337
  /* Redraw scene during "vertical retrace" */
338
  if (framebuffer_pos == 4 && redraw_needed)
339
  {
340
    drawScene();
341
    redraw_needed = 0;
342
  }
343
}
344
345
/* Movement */
346
SIGNAL(SIG_OUTPUT_COMPARE1A)
347
{
348
  if (!pong_mode) return;
349
  if (++speed_counter == speed_bumper) {
350
    speed_counter = 0;
351
    outw(OCR1A, (40000 / ++current_speed) * 3);
352
    if (current_speed > 100) current_speed = 100;
353
  }
354
355
  timer_movement(~inp(PINB));
356
}
357
358
int main_pong(void)
359
{
360
  score = 0;
361
  variable_init();
362
  ioinit();
363
  for(;;);
364
}
365
366
int main_font(void)
367
{
368
  unsigned char portB;
369
  unsigned char nextPressed;
370
  unsigned char prevPressed;
371
  int cf; /* Current font */
372
373
  nextPressed = 0;
374
  prevPressed = 0;
375
  cf = 0;
376
  framebuffer[0] = font[cf][0];
377
  framebuffer[1] = font[cf][1];
378
  framebuffer[2] = font[cf][2];
379
  framebuffer[3] = font[cf][3];
380
  framebuffer[4] = font[cf][4];
381
382
  ioinit();
383
384
  for(;;)
385
  {
386
    portB = ~inp(PINB);
387
388
    /* Prev button */
389
    if (portB & 0x01)
390
    {
391
      if (!prevPressed)
392
      {
393
        cf--;
394
        if (cf < 0) cf = 0;
395
        framebuffer[0] = font[cf][0];
396
        framebuffer[1] = font[cf][1];
397
        framebuffer[2] = font[cf][2];
398
        framebuffer[3] = font[cf][3];
399
        framebuffer[4] = font[cf][4];
400
      }
401
      prevPressed = 1;
402
    }
403
    else
404
      prevPressed = 0;
405
406
    /* Next button */
407
    if (portB & 0x02)
408
    {
409
      if (!nextPressed)
410
      {
411
        cf++;
412
        if (cf >= font_count) cf = font_count - 1;
413
        framebuffer[0] = font[cf][0];
414
        framebuffer[1] = font[cf][1];
415
        framebuffer[2] = font[cf][2];
416
        framebuffer[3] = font[cf][3];
417
        framebuffer[4] = font[cf][4];
418
      }
419
      nextPressed = 1;
420
    }
421
    else
422
      nextPressed = 0;
423
  }
424
}
425
426
int main(void)
427
{
428
  unsigned char portB;
429
        
430
        framebuffer[0] = 0;
431
        framebuffer[1] = 0;
432
        framebuffer[2] = 0;
433
        framebuffer[3] = 0;
434
        framebuffer[4] = 0;
435
  pong_mode = 0;
436
        ioinit();
437
        
438
        for (;;)
439
        {
440
          portB = ~inp(PINB);
441
          if (portB & 0x01) {pong_mode = 1; main_pong();}
442
          if (portB & 0x02) {pong_mode = 0; main_font();}
443
        }
444
}

von Loramor (Gast)


Lesenswert?

aber ist halt nicht von mir sondern nur ne beispiel.

würde gerne selber sowas machen und dann am besten in einfach. ;)

von Loramor (Gast)


Lesenswert?

es gibt das ganze auch von conrad zu kaufen mit nem atmega8 vielleicht 
hat davon ja auch jemand den code und kann den hier mal posten 
vielleicht ist der ja schon einfacher.

von Peter II (Gast)


Lesenswert?

Loramor schrieb:
> vielleicht ist der ja schon einfacher.

glaubst du wirklich das sich jemand die mühe gemacht hat möglichst 
komplizierten code zu schreiben?
Wenn am ende die gleichen Funktionen bereitstehen soll, dann wird wohl 
fast die gleiche code menge enstehen.

Dann fang doch einfach mal selber an zu programmmiern, dann sieht du 
schon wie viel code man dafür braucht.

von Harald W. (wilhelms)


Lesenswert?

Loramor schrieb:
> Hallo Leute,
> habe seit 3 Monaten etwa Mikrocontroller im Unterricht und bin bei
> meinen recherchen auch auf das Ping-Pong Spiel gestoßen.

Ich nehme an, Du meinst dieses hier:
http://www.elo-web.de/elo/entwicklung-und-projekte/ping-pong
Da solltest Du mal auf den ELO-Seiten suchen. Es gibt da ne Menge Infos.

> Ich habe da auch schon einige codes gesehen aber die versteh ich nicht
> und die sind mir leider noch zu komplex.

Nun, Assemblercode ist auch anfänglich etwas unübersichtlich.
Je mehr man sich damit beschäftigt, desto klarer wird es aber.
Man sollte sich natürlich anfänglich nicht mit einem so kompli-
ziertem Programm wie dem PingPong beschäftigen. Es reicht, wenn
man eine einzelne LED zum Blinken kriegt. :-)

> Ich wollte halt mal fragen ob man den Code auch vereinfachen kann?

Eher nicht; denn dann würde man es auch von vornherein einfacher
schreiben.

> So dass ich beispielsweise sage, bei knopf "hoch" geht immer eine LED
> aus und eine andere an damit das so aussieht als würden die balken sich
> bewegen?

Nun grundsätzlich wird es in einer Hochsprache Wie "Basic" oder "C"
schon etwas einfacher. Solche Befehle, wie Du sie gerne hättest, sind
da aber auch nicht drin, denn eine Programmiersprache soll ja möglichst
universell sein.

> dann wäre noch das Problem wie man es mit dem Ball einfacher realisieren
> kann?
>
> Wäre cool wenn es da eine einfachere Lösung geben würde.

Man macht solche Sachen ja nicht, um es anderen besonders schwer
zu machen (Ausnahmen bestätigen die Regel), sondern weil für eine
bestimmte Problemlösung einfach ein gewisser Aufwand nötig ist.
Deshalb sucht man sich für den Anfang eher einfachere Probleme aus
und arbeitet sich langsam hoch. Oder habt Ihr im Mathematikunter-
richt als erstes die Differentialgleichungen gelernt, bevor ihr
zusammenzählen und abziehen konntet? :-)
Gruss
Harald

von dave_chappelle (Gast)


Lesenswert?

Also ich würd auch eher mal klein anfangen.. Wenn du nicht mal eine 
Vorstellung davon hast, wie du einen Balken per Knopfdruck auf und ab 
bewegen kannst, dann machst du lieber erst mal etwas einfacheres.

Wenn du ein Pong willst, wie das von Conrad, dann wird der Code min. so 
gross wie der von dir gepostete. Wenn nicht sogar grösser.

Aber nicht verzagen, beginn doch einfach mal mit den grundsätzlichen 
Sachen z.B. den Balken. Stichwort bit schieben (in C sind lautet der 
Befehl dafür << und >>)..

Und wenn du einen ungefähren Lösungsansatz hast, kannst du ja wieder 
fragen.

von Loramor (Gast)


Lesenswert?

alles klar!

danke euch!

ich fang dann mal mit den Balken an und poste meine Fortschritte hier 
mal.

Gruß
Loramor

von Loramor (Gast)


Lesenswert?

Hab das mir das jetzt so überlegt mit dem Balken.
Also die LEDs auf der rechten Seite sind von unten nach oben LED1...LED7
1
if (PIND & (1<<PD2){ //Taster für hoch
2
PORTD |= (1<<LED1);
3
PORTD |= (1<<LED2);
4
PORTD |= (1<<LED3);
5
_delay_ms(100);
6
PORTD |= (1<<LED2);
7
PORTD |= (1<<LED3);
8
PORTD |= (1<<LED4);
9
_delay_ms(100);
10
...
11
}
aber was ist denn wenn ich jetzt ne Taster für runter drücke?
Dann muss ich das ja irgendwie abfragen wo er gerade steht damit ich das 
gleiche dann in die andere Richtung machen kann.

Gruß
Loramor

von Peter II (Gast)


Lesenswert?

Loramor schrieb:
> Dann muss ich das ja irgendwie abfragen wo er gerade steht damit ich das
> gleiche dann in die andere Richtung machen kann.

Du musst bei dir die logik von der ausgabe trennen. Du brauchbt also 
eine Variable wo die Position gespeichert wird. Dann braucht du eine 
Ausgabefunktion die anhängig von der Position die ausgabe macht. Dann 
noch ein funktion die die Tasten übewacht und abhängig von der Taste die 
position ändert.

Außerdem gehen bei deinen code die LEDS nie aus.

von Loramor (Gast)


Lesenswert?

dann könnte ich das ja mit ner case funktion realisieren.

wenn ich die Taste drücke wird ne Variable hochgezählt und diese 
Variable gibt dann an über case, welche LEDs dann leuchten.

So müsste das ja realisierbar sein denke ich.

von Loramor (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
hab jetzt mal den Schaltplan und das bisher bestehende Programm 
hochgeladen.

Die Balken kann ich jetzt beide über jeweils 2 Taster steuern.
Im Programm ist im Moment nur 1 Balken programmiert, der andere Balken 
kommt noch.
Dafür klemm ich die letzte LED-Reihe ab, damit ich an dem Anschluss noch 
einen 4. Taster anklemmen kann.

Jetzt ist aber das nächste und wahrscheinlich auch größte Problem wie 
ich das mit dem Ball mache.

- Also die Abfrage ob er die Platte getroffen hat oder nicht.
- Dann die Bewegung die der Ball macht wenn er die Platte getroffen hat.
- und wo er wieder auftaucht wenn er die Platte nicht getroffen hat.

Hat da einer ne Idee oder kann mir jemand einen Denkanstoß geben?

Mit freundlichem Gruß
Loramor

von Clemens M. (panko)


Lesenswert?

Den Ball hat eine konstante Geschwindigkeit denke ich?
Dann kannst du anhand seines Geschwindigkeitsvektors ja direkt 
ausrechnen, ob der beim nächsten Zeitschritt ein Hindernis trifft. 
Einfach gucken ob die Position erlaubt ist.
Am Paddel gilt dann Einfallswinkel gleich Ausfallswinkel. Wobei ich 
-meine- mich zu erinnern, daß die Enden anderes Verhalten zeigten beim 
Pong.

Funktioniert denn die Ansteuerung deiner Matrix und die Steuereingabe 
zufriedenstellend?

von Loramor (Gast)


Lesenswert?

Ja der soll eine Geschwindigkeit beibehalten.

Zufriedenstellend noch nicht ganz.
Ich musste die LEDs gegeneinander Verriegeln und das hab ich über 
schnelles Blinken realisiert und wenn man jetzt die Knöpfe drückt geht 
immer eine Seite kurz aus.
Denke das liegt am Atmega8 und das er vielleicht nicht mehr schafft.

Aber kannst du mir das mit dem Ball noch ne bisschen genauer beschreiben 
steh da gerade noch aufm Schlauch sun bisschen.

von Peter II (Gast)


Lesenswert?

Loramor schrieb:
> Denke das liegt am Atmega8 und das er vielleicht nicht mehr schafft.

ganz bestimmt nicht.


Du hast _delay_ms(200); im code drin, damit bekommst du keine saubere 
anzeige hin.

von Erich (Gast)


Lesenswert?

Ein  _delay_ms( <egalwieviel> )
hat in einem ordentlichen Programm  n i c h t s  zu suchen,
kommt also überhaupt nicht vor.
Das macht man mit Timer und Interrupt.

Insofern siehst du mal, was das am Threadanfang von dir reinkopierte 
Programm schon alles kann,
und was du jetzt mühsam hinpfriemeln willst.

von Clemens M. (panko)


Lesenswert?

Zunächst würde ich definitiv an der Ansteuerung der Led Matrix 
weiterarbeiten.
Denn früher oder später muss etwas 2-dimensionales angezeigt werden.
Es sollte möglich sein etwas oberhalb des Panels anzuzeigen. Evtl. wäre 
auch ein Sichten des wiki Artikels hilfreich.

Bin selber kein heldenhafter Programmierer, aber da fehlt nach meinem 
Gefühl Konzept in deinem Code was überhaupt passieren soll. Also nicht 
verzagen.

Zum Ball. Da wirst du dir sicherlich die aktuelle Position und aktuelle 
Geschwindikeit merken. Also pos als (x,y) und geschw als (vx,vy). 
Vermute ich mal.
Beim nächsten Zeitschritt (eine Zeitbasis braucht das Programm noch) 
haste dann halt pos (x+vx*dt, y+vy*dt) und wenn das außerhalb des Feldes 
wäre, hast du verloren.
Bei einer Reflexion ändert sich ann die Geschwindigkeitskomponente je 
nach Einschalgsszenario.

von Clemens M. (panko)


Lesenswert?

P.S. das was im Beispielcode oben framebuffer genannt wird, macht Sinn. 
Da kannst du virtuell das Paddel verschieben, den Ball bewegen usw.
Eine Routine zeigt dir den Inhalt des framebuffers dann auf den leds an.

Also wäre das Beste, zunächst zu versuchen einen framebuffer auf der 
Matrix darszustellen. Ein 2d Array, was z.B. einen Buchstaben fest 
eingetütet enthält.
Vielleicht liest auch einer der Altvorderen hier mal rein, bei konkreten 
Problemen zu dem Problem können sie sicher helfen.

von Thorsten S. (whitejack) (Gast)


Lesenswert?

Hey Loramor,

nimm doch die Schaltung des original Pong Spiels:

http://www.produktinfo.conrad.com/datenblaetter/900000-924999/902766-an-01-ml-CONRAD_RETRO_SPIEL_PING_PONG_de_en_fr_nl.pdf

Seite 15.

http://www.conrad.de/ce/de/product/902766/CONRAD-RETRO-SPIEL-PING-PONG

Dann kannst du die ISR aus dem Netz ziehen die die Matrix im Ram des 
Controllers spiegelt, das ist ein flotter 8 Zeiler...

Damit hast du eine solide Basis für alle Matrix Anwendungen.

Gruß,
T

von Loramor (Gast)


Lesenswert?

Danke für die ganzen Antworten.

Erich kannst du mir mal ne Beispiel für sun Timer schreiben oder zeigen.
Kenn die sonst nur von PWM wenn das das ist was ich meine.

Gruß
Loramor

von Erich (Gast)


Lesenswert?

GOOGLE kann auch dein Freund werden:
    avr timer interrupt

Ergebnisse zu hauf, z.B.
http://www.rn-wissen.de/index.php/Timer/Counter_%28Avr%29

von Christian H. (christian_h)


Lesenswert?

Zeig doch mal Eigeninitiative. Nur wenige Zentimeter von deiner Maus 
entfernt, befindet sich übrigens ein schönes Tutorial zu AVR, aber wer 
suchet der findet.

von Zeigefinger (Gast)


Lesenswert?

Das avr Tutorial ist ein guter Rat. Du hast ja definitiv noch viele 
Lücken. Da kann ich nur raten: mach nicht alles auf einmal, wiederhole 
auch (vermeintlich) bekannte Dinge.
Zu viel auf einmal geht hier nicht und du kannst nun mal nicht erwarten, 
daß du so ein relativ komplexes Projekt nach einem Beispiel in der 
Schule stemmen kannst.
Also ran ans Tutorial und üben, alles mögliche blinken lassen usw. Du 
hast Glück daß der Thread noch intakt ist und nicht zertrollt wurde.
Richtig glücklich wirst du auch nicht wenn du etwas vorgekaut bekommst. 
Das wär ja Schule vor ner Klausur :P


-such das avr Tutorial.
-gucks dir an auch wenn der Anfang dir bekannt vorkommt.
-als Anfang solltest du versuchen den ganz schnöden OVERFLOW interrupt 
zu verwenden. Da musst du nämlich quasi nichts machen.
Da lässt du in der isr z.B. ne led laufen oder setzt dir ein flg für das 
Hauptprogramm oder was auch immer. Probieren und inspirieren lassen. ocr 
oder andere Modi kommen so oder so danach
-dann ein 1D Paddel nur mit der Led zeile. Noch nix multiplexen. Nur das 
Paddel in einer Dimension bewegen können. Bei deiner Tasteneingabe ist 
nämlich auch noch nicht alles super. Stichwort Entprellen und ggf. auch 
Beschleunigung für die Bewegung.

usw. Da werden einige Aha Momente kommen und der Schule tuts auch gut. 
Wenn was nicht klappt, also gar nicht klappt nach Stunden. Fragen. Bugs 
suchen ist natürlich als Anfänger besonders schwierig.

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.