Ping-Pong über LED-Brett für Anfänger

Gast #2394228
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
Gast #2394285
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
}
Gast #2394302
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.
#2394319
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
Gast #2394350
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.
Gast #2394523
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
Gast #2394537
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.
Gast #2394599
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.
Gast #2397165
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
Angehängte Dateien:
#2397274
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?
Gast #2397284
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.
Gast #2397307
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.
#2397308
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.
#2397313
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.
Gast #2397327
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
Gast #2397602
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren