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
> ob man den Code auch vereinfachen kann?
welchen Code meinst du denn?
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
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 | }
|
aber ist halt nicht von mir sondern nur ne beispiel. würde gerne selber sowas machen und dann am besten in einfach. ;)
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.
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.
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
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.
alles klar! danke euch! ich fang dann mal mit den Balken an und poste meine Fortschritte hier mal. Gruß Loramor
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
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.
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.
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
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?
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.
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.
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.
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.
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.
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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.