Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Selasa, 19 Juni 2012

Membuat Game Pacman "PaKMan" sederhana dengan ATTiny2313

Setelah mendapatkan ilmu yg cukup dari beberapa sumber di internet, akhirnya kesampaian juga untuk membuat game pacman sederhana, dan kita namakan ..

LONELY PAKMAN




Kenapa Lonely ? karena dia memang kesepian, sendirian gerak-gerak di layar TV.

sebaiknya membaca dulu pembahasan dasar televisi di: part#1  part#2

Siapkan Bahan-bahan berikut ini:

1. Micro-AVR ATTiny 2313
2. Breadboard
3. Power suply 5v , atau adaptor 12v dan diregulasi 7805
4. Resistor 10K, 470
5. Tombol push button
6. Xtal 20Mhz + capasitor 22pF
7. Programer AVR
8. Pesawat TV yg nganggur ( jangan sampai bertengkar dengan sodara yg lagi nonton sinetron)

Kemudian skematik yg digunakan seperti gambar berikut :


Klik pada gambar buat memperjelas gambar




Ntar hasilnya seperti berikut ini :








Listing program dari game lonely pakman sebagai berikut :

//==========LONENLY PAKMAN=======
//    by  : ahocool@gmail.com
//   http://aisi555.blogspot.com
//=========== 2012 ===============
#define F_CPU 20000000UL   //xtal yg digunakan
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#define HSYNC PORTB=0; //H sinkronisasi
#define BLACK PORTB=1; // warna hitem  
//deklarasi variable 
uint8_t textnya,pakline,arah;  
static uint16_t x,y,tick;
char pakman1[12] =  // memory penyimapan data gambar pakman

   {  //kanan mangap
0b00000000,
0b01111100,
0b11001100,
0b11001000,
0b11110000,
0b11100000,
0b11000000,
0b11100000,
0b11110000,
0b11111000,
0b01111100,
0b00000000,
};


char pakman2[12] =
   {    //kanan mingkem
0b00000000,
0b01111100,
0b11001110,
0b11001110,
0b11111110,
0b11111110,
0b11111110,
0b11111110,
0b11000000,
0b11111110,
0b01111100,
0b00000000,
};


char pakman3[12] =

   {  //kiri mangap
0b00000000,
0b01111100,
0b01100110,
0b00100110,
0b00011110,
0b00001110,
0b00000110,
0b00001110,
0b00011110,
0b00111110,
0b01111100,
0b00000000,
};


char pakman4[12] =
   {   //kiri mingkem
0b00000000,
0b00111100,
0b01100110,
0b01100110,
0b01111110,
0b01111110,
0b01111110,
0b01111110,
0b00000110,
0b01111110,
0b00111100,
0b00000000,
};


char pakman5[12] =

   {   //bawah mangap
0b00000000,
0b01111100,
0b11111110,
0b11110010,
0b11110010,
0b11001110,
0b11001110,
0b11000010,
0b10000010,
0b10000010,
0b10000010,
0b00000000,
};


char pakman6[12] =
   {   //bawah mingkem
0b00000000,
0b01111100,
0b11111110,
0b11110010,
0b11110010,
0b11111110,
0b10111110,
0b10111110,
0b10111110,
0b10111110,
0b10111100,
0b00000000,
};

char pakman7[12] =

   {  //atas mangap
    0b00000000,
    0b10000010,
    0b10000110,
    0b10000110,
    0b10000110,
    0b11011110,
    0b10110010,
    0b11110010,
    0b11111110,
    0b01111100,
    0b00000000,
};


char pakman8[12] =
     { //atas mingkem
    0b00000000,
    0b10111100,
    0b10111110,
    0b10111110,
    0b10111110,
    0b10111110,
    0b11110010,
    0b11110010,
    0b11111110,
    0b01111100,
    0b00000000,
};

void timer_init(void){ 
//inisialisasi timer per rasterline 64us (PAL TV) 
TCCR1B |= (1<<WGM12);
TIMSK |= (1<<OCIE1A);
OCR1A = 1280; //64 us dengan xtal 20Mhz, untuk 16Mhz= 1024;
TCCR1B |= (1<<CS10); //full speed
}



//interupt timer untuk menampilkan gambar
ISR (TIMER1_COMPA_vect) {
static uint16_t rasterline=0; //baris
uint16_t a;
uint8_t out=0; // variabel simpan memory byte pakman

HSYNC;
        
//posisi berdasarkan nilai x,y dengan lebar 12 baris
if( rasterline > (18 + y)  && rasterline <= (30 +y) ) { 
_delay_us(4);
BLACK;
_delay_us(7);
        for(a=0;a<x;a++) asm("nop");
      // tampilkan sesuai arah dari pakman
 if(arah==0){
 if(tick<5000)out= pakman1[pakline];
 else out= pakman2[pakline];
      } 
 else if(arah==1){
 if(tick<5000)out= pakman3[pakline];
 else out= pakman4[pakline];
      }       
 if(arah==2){
 if(tick<5000)out= pakman5[pakline];
 else out= pakman6[pakline];
      }
 if(arah==3){
 if(tick<5000)out= pakman7[pakline];
 else out= pakman8[pakline];
      }
//geser bit untuk tampilkan data gambar ke pakman ke TV 
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
       out <<=1;
 PORTB= (out & 0x81) + 1;
      

      pakline++;  //tambahkan index array dari gambar pakman



// Vsync ada disini tanpa membedakan genap ganjil 
else if( rasterline >= 0 && rasterline < 5 ) {
_delay_us(27);
BLACK;
_delay_us(5);
HSYNC;
_delay_us(27);
BLACK;
} else if( (rasterline >= 5 && rasterline <= 10) ) {
_delay_us(2);
BLACK;
_delay_us(28);
HSYNC;
_delay_us(2);
BLACK;
} else if( rasterline >311-6 ) {
_delay_us(2);
BLACK;
_delay_us(28);
HSYNC;
_delay_us(2);
BLACK;
} else { 
_delay_us(3);
BLACK;
pakline=0;
  }

rasterline++;
tick++; //variabel timer untuk mangap & mingkem
    if(tick >10000) tick=0;

if( rasterline > 311 )rasterline = 0; //maksimum baris/raster
}


void tombol(void) // membaca tombol
{
if(bit_is_clear(PIND, PIND3)) 
{x--;
arah=1;
if(x<1)x=125;
_delay_ms(50);
}

else if(bit_is_clear(PIND, PIND4))
{
x++;
arah=0;
if(x>125)x=1;
_delay_ms(50);
}

else if(bit_is_clear(PIND, PIND5))
{y-=3;
arah=3;
if(y<3)y=280;
_delay_ms(50);
}

else if(bit_is_clear(PIND, PIND6))

{y+=3;
arah=2;
if(y>280)y=0;
_delay_ms(50);
}

}
int main() {  //Main Program
x=1;
y=13;
arah=0;
 DDRD &=~(1<<PD3) & ~(1<<PD4) & ~(1<<PD5) & ~(1<<PD6); //tombol
DDRB = (1<<PB7)|(1<<PB0); //PB0=1K, PB7=470 ohm

timer_init();
sei();

for( ;; )tombol();

}



SELAMAT MENCOBA 
Share:

1 komentar:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (25) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (17) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika