This is an old revision of the document!
Ce face: Proiectul reprezintă o adaptare electronică a clasicului joc arcade „Whack-a-Mole”. În loc de cârtițe mecanice, jocul folosește butoane Arcade iluminate. Microcontrolerul va aprinde aleatoriu LED-ul unuia dintre butoane, iar jucătorul trebuie să apese butonul respectiv cât mai repede posibil.
Scopul lui: Scopul principal este testarea și îmbunătățirea timpului de reacție al jucătorului. Din punct de vedere academic, scopul este implementarea unui sistem interactiv complet (bare-metal) care implică citirea de intrări digitale și analogice, generarea de semnale de ieșire multiplexate și utilizarea timerelor.
Ideea de la care am pornit: Ideea a pornit de la dorința de a recrea sentimentul și dinamica jocurilor mecanice retro folosind componente electronice moderne. Am vrut un proiect care să fie nu doar o demonstrație tehnică, ci și un produs final distractiv și interactiv.
Utilitate: Pentru mine, este o oportunitate excelentă de a aprofunda lucrul cu registrele ATmega328p, timerele, întreruperile și optimizarea pinilor folosind un Shift Register. Pentru utilizatori, este un joc antrenant, perfect pentru pauze, care stimulează reflexele.
Sistemul este centrat în jurul microcontrolerului ATmega328p (pe platforma Arduino UNO). Acesta preia date din lumea fizică, le procesează și oferă feedback vizual și sonor.
Interacțiunea modulelor:
Cod scris în C bare-metal pentru ATmega328P, fără framework Arduino. Toolchain:
<avr/io.h>, <avr/interrupt.h>, <util/delay.h>avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os -Wall whack_a_led.c -o whack.elf avr-objcopy -O ihex -R .eeprom whack.elf whack.hex avrdude -p atmega328p -c arduino -P /dev/ttyACM0 -b 115200 -U flash:w:whack.hex
Binar rezultat: ~4.8 KB flash + 150 bytes RAM.
Niciuna. Toate perifericele sunt programate direct la nivel de registre. Singurele include-uri sunt header-ele standard avr-libc pentru definiţiile registrelor şi macro-urile de întreruperi.
switch din main loop.OCR1A = F_CPU / (2 × prescaler × freq) - 1.uint32_t; citirea protejată cu cli/sei pentru atomicitate.cli/sei.millis() care continuă să refresheze display-ul, eliminând pâlpâirea în timpul melodiilor şi animaţiilor.
Cod organizat într-un singur fişier (whack_a_led.c, ~810 linii) cu următoarele grupuri funcţionale:
timer0_init, millis, tone_start/stop, adc_read, eeprom_read/write_byte_raw, prng_nextshift_out_msb, write_segments, display_digits, display_score, display_idle, display_game_over, compute_dp_masktone_blocking, play_melodydisplay_countdown, start_new_game, pick_next_led, trigger_game_over, score_roll_animation, level_up_sequenceget_pressed_buttonload_high_score, save_high_scorewhile(1) cu refresh display + FSM
Parametrii de joc (timpi de reacţie, punctaje, durate animaţii) sunt grupaţi ca #define-uri la începutul fişierului pentru tuning rapid.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
SimplyCodes