"Kembali Ke Dasar Elektronika Digital ... "

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Animasi LED Dengan IC 4017

    IC 4017 adalah IC 16-pin CMOS dekade counter dari seri IC CMOS 4000. Sangat berguna jika ingin membuat animasi lampu atau LED secara sederhana seperti led berjalan, tulisan berjalan , counter/timer dan masih banyak kegunaan lainnya

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • BIKIN PCB SEDERHANA TAPI GA MURAHAN

    Bikin PCB itu ga susah kok..dengan software EAGLE CAD dan teknik sterika kamu dapat membuat PCB untuk berbagai project elektronika mu ...

Tampilkan postingan dengan label attiny2313. Tampilkan semua postingan
Tampilkan postingan dengan label attiny2313. Tampilkan semua postingan

Rabu, 12 Desember 2012

BELAJAR ACCESS SD CARD CARA SIMPLE DENGAN ATTINY2313 - PART2


Disclaimer : collected from various source on Google, writer read and modify for educational purpose only. Free to use !


Silahkan Baca Part1 terlebih dahulu agar tidak kebingungan


SPI via USI



SPI merupakan serial peripheral interface yang dapat mengkomunikasikan antara master dan slave. Kecepatan transfer data bergantung dari pembagian clock yang diberikan . Sedangkan USI adalah SPI mode simple, dimana clock diberikan manual secara software atau input dari luar. Pin SS (slave select ) juga tidak disediakan tapi bisa di akali dengan PIN & software



dari gambar diatas dapat dilihat mode 3 wire USCK, DO (MOSI) , DI (MISO)
USCK diberikan secara software (manual) dengan toogling register USICR pada USICLK dan USITC
ada 3 buah register yg perlu diperhatikan yaitu USIDR = Data register , USICR =Control register dan USISR = Status Register

Berikut script untuk inisialisasi dari USI sebagai SPI

Code:
//definisi port

#define SPI_DDR DDRB

#define MOSI (1<<PB6)

#define MISO (1<<PB5)

#define SCK (1<<PB7)



#define CS_DDR DDRD

#define CS (1<<PD6) // PD6 sebagai slave/chip select

#define CS_ENABLE() (PORTD &= ~CS)

#define CS_DISABLE() (PORTD |= CS)



//inisialisasi port SPI

void SPI_init() {

 CS_DDR |= CS; // SD card circuit select as output

 SPI_DDR |= MOSI + SCK; // MOSI and SCK as outputs

}



//Pembacaan SPI

unsigned char SPI_write(unsigned char ch) {

    USIDR = ch; // data yang akan dikirim

    USISR |= (1<<USIOIF); // aktifkan interrupt Overflow

 

 do {

//Kirim USCK8 x

 USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

 _delay_us(100);

       } while((USISR & (1<<USIOIF)) == 0); // selesai jika overflow

 return USIDR; // baca data reply yg masuk

}






gampang bukan ? selanjutnya kita dapat mengirim perintah ke SD card melalui port USI dan kita siap untuk membaca data dari SD CARD.

Jika bahan-bahan sudah siap dan tersusun di breadboard (jangan lupa set fusebit memakai clock 8MHZ , clk_div jangan dipake, bisa meakai xtal atau internal RC) kita akan membaca file text yang telah dicopy ke dalam SD card

Pertama kita bahas cara read (CMD 51) dari isi file SDCARD , langkahnya seperti berikut:

1. Pull CS low (select)
2. Send 0×51
3. Send 0x00000000 (Sector x 512)
4. Send 0×FF
5. Baca data yg dikirim 520 kali (sambil kirim 0xFF ke kartu)
6. Pull CD low (deselect)

kenapa 520 kali ? karena format reply per sector seperti ini :



yang garis merah diatas merupakan header awal (6 byte) yang menyatakan data ready, jadi di script nantinya kita akan mendeteksi 00 dan FE , sedangkan 2 terakhir merupakan CRC yang bisa di abaikan.

jadi kita susun script seperti berikut :

Code:
void SD_command(unsigned char cmd, unsigned long arg, unsigned char crc, unsigned char read) {

 unsigned char i;

 //berfungsi mengirim perintah ke SD card

 CS_ENABLE();

 SPI_write(cmd);

 SPI_write(arg>>24); //geser byte

 SPI_write(arg>>16);//karena format

 SPI_write(arg>>8);//0x00000000

 SPI_write(arg);//alias 4 bit argumen

 SPI_write(crc);

  

 for(i=0; i<read; i++) SPI_write(0xFF); //kirim & baca

 CS_DISABLE();  

}



char SD_init() {

    char i;

//berfungsi inisialisasi SD card        

    CS_DISABLE();

    for(i=0; i<10; i++) SPI_write(0xFF);   

     _delay_ms(500);

// langkah 1  0x40

    SD_command(0x40, 0x00000000, 0x95, 8);

        _delay_ms(500);

// langkah 2  0x41                        

    SD_command(0x41, 0x00000000, 0xFF, 8);

        _delay_ms(500);

// langkah 3  0x50           

    SD_command(0x50, 0x00000200, 0xFF, 8);  

    _delay_ms(500);

        

    return 0;

}



void SD_begin(unsigned long  sector) {

    uint8_t i = 0;

//berfungsi untuk membaca data SD card    

    CS_ENABLE();

 SPI_write(0x51); //perintah baca 0x51

     //selanjutnya geser2 byte sector

        SPI_write(sector>>15); // sector*512 >> 24

 SPI_write(sector>>7);  // sector*512 >> 16

 SPI_write(sector<<1);  // sector*512 >> 8

 SPI_write(0);          // sector*512

        SPI_write(0xFF);

    

    for(i=0; i<10 && SPI_write(0xFF) != 0x00; i++) {} // wait for 0

    for(i=0; i<10 && SPI_write(0xFF) != 0xFE; i++) {} // wait for data start

    

    // baca SD& kirim melalui serial

    for(i=0; i<512; i++)   USART_Tx(SPI_write(0xFF));

    //2 kali checksum

    SPI_write(0xFF);

    SPI_write(0xFF);    



    CS_DISABLE();   

}








Yah..begitulah...ga terlalu susah ....hanya masalah creativitas, ntar munculnya di layar (jika dihubungkan dengan serial via putty/hyperterminal) seperti ini :



atau jika data langsung dibaca, bisa langsung membaca text. Sesuai percobaan bahwa sector paling depan tempat file disimpan adalah sector 96,

kenapa ? karena SD CARD yang aku pake jadul , memakai system FAT12




sedangkan jika memakai Format pc terbaru maka otomatis menjadi system FAT16 dan File pertama berada di sector 555. Jadi sesuaikan dengan jenis format yang dipakai



semua source code dapat didownload dimari , untuk dapat membaca wav file dan memainkan suara kita lanjut ke post berikut disini


SELAMAT MENCOBA
Share:

BELAJAR ACCESS SD CARD CARA SIMPLE DENGAN ATTINY2313 - PART1


Disclaimer : collected from various source on Google, writer read and modify for educational purpose only. Free to use !


SD card merupakan media penyimpanan data yang sering dijumpai, memiliki flash memory yang di format sesuai dengan standar FAT dari microsoft. Jadi cara accesnya hampir mirip dengan acces floppy disk ataupun hardisk dengan standar yg cocok kita pakai untuk interfacing dengan AVR adalah FAT16.


PINOUT




cara access hardware menggunakan cara SPI 3 wire, dimana microcontroller 8bit sekelas AVR memiliki fasilitas ini. Ingat Level tegangan yang digunakan adalah 3,3 volt, jadi memerlukan regulator seperti AIC 1722-33 untuk merubah ke vcc 3,3 v. Untungnya ATTINY masih bisa disupply dengan tegangan 3,3v sehingga tidak butuh logic converter 5 vs 3,3

FILE SYSTEM

Gunakan software winhex untuk membuka SD card yang diformat FAT, sehingga muncul tampilan image dari sebuah SD card



waduh pusing ya liatnya ....TS saja berpikiran seperti itu, tapi google memberikan banyak resource untuk belajar seperti disini dan penjelasan melalui artikel BUS PIRATE

Kali ini tidak akan membahas pembacaan nama file, awal dan akhir file dan sebagainya, mengingat memory ATTiny2313 yang lumayan mini, jadi kita akan membaca secara mentah data yang ada di SD CARD


oke kita berpatokan pada penjelasan di BUS PIRATE, dan singkat saja jika kita ingin melakukan akses ke sebuah SD card melalui SPI mengikuti aturan seperti berikut :

inisialisasi SPI:

1. Pull CS high (deselect)
2. Read 10 bytes (basically sends CLK pulse 80 times to give SD card time to initialize)
3. Pull CS low (select)
4. Send 0×40 (“go to SPI mode” command, CMD0)
5. Send four zero bytes (SD protocol has 4-byte arguments)
6. Send 0×95, the CRC checksum of the command and argument just sent
7. Read eight bytes and print them out (while sending 0xFF to the card)
8. Pull CD low (deselect)

inisialisasi kartu :

1. Pull CS low (select)
2. Send 0×41
3. Send 0x00 4kali
4. Send 0×FF
5.Baca data yg dikirim 8 kali (sambil kirim 0xFF ke kartu)
6. Pull CD low (deselect)

Inisialisasi besar transfer data / sector:

1. Pull CS low (select)
2. Send 0×50
3. Send 0x00000200 (desimal 512 , dikirim per byte)
4. Send 0×FF
5. Baca data yg dikirim 8 kali (sambil kirim 0xFF ke kartu)
6. Pull CD low (deselect)

Selanjutnya adalah proses pembacaan data (dibahas berikutnya)

jika benar, maka response dari SDcard seharusnya seperty ini :



wahh kok bisa keluar sepeti itu ? sebaiknya kumpulkan bahan-bahan seperti berikut ini dulu :





Ada yang aneh dari ATTiny2313 , dimana ic ini tidak mempunyai fungsi SPI yang murni, sehingga memanfaatkan fungsi USI (unifersal serial Interface) sesuai Datasheet maka pin MOSI itu DI = Data Input ( MISO di SPI asli) dan MISO itu DO = Data Output (MOSI di SPI asli). Jadi perhatikan koneksi MISO - MOSI yang silang (kalau terbalik gpp, hanya data nya ga kebaca...tinggal dibalik saja GAN !!)

untuk konektor ke SD card, dapat menggunakan SDcard - micro SD adapter yang kemudian disolder




atau jika sayang adapternya rusak, pake cara TS aja dengan menggunakan Header 2 baris, kemudian salah satu baris kaki ditekuk kedalam, kemudian Adapter SD card di selipkan dan pastikan pin header yang ditekuk menyentuh pad SDcard dengan baik




Lanjut Ke Post Berikut disini
Share:

Senin, 12 November 2012

INTERFACING KEYBOARD ke AVR (ATtiny) & OUTPUT ke DOT MATRIX



- LEVEL : ADVANCE
- BAHAN2 : AVR micro ( ATTINY 2313), KEYBOARD PS-2, DOTMATRIX , R 10K
- DASAR yg PERLU DIKUASAI : Basic I/O, Interupt dan menulis ke DOT MATRIX ( love hurts) silahkan baca disini



Pertama kita perlu mengetahui port keyboard PS2 itu seperti ini :


sedangkan pada input micro , umumnya menggunakan koneksi seperti ini :



dimana input 'clock' masuk ke pin interupt pada microcontroller, sedangkan pin 'data' masuk ke pin biasa dari AVR (bidirect). semua I/O di pull up dengan resistor 10k ke Vcc. Selanjutnya kita bahas dulu format transfer data saat ada penekanan tombol , gambarannya seperti ini :



jadi keyboard dapat mengirim data karakter ke micro, sedangkan micro mengirimkan setting keyboard. sehingga komunikasinya bidirectional

oke, selanjutnya kita perhatikan kode scan/hex dari pencetan tombol keyboard, tabelnya seperti ini :




setelah itu kita susun port ps 2 & port dot matrix dengan susunan I/O seperti ini :


==========potongan script di main(), lengkapi sendiri==============

//clock di interupt 0 (pin 6)

MCUCR |= (1<<ISC01) | (0<<ISC00); // falling edge int 0

GIMSK |= (1<<INT0);



//data keyboard di port PD3 (pin 7)

DDRD &= ~_BV(PD3) ;



//kolom dot matrix

DDRD |= _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) | _BV(PD6) ;



//data / baris dot matrix 

DDRB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;



// output led buat ngecek ada pencetan  keyboard di PA0 (pin 4)

DDRA |= _BV(PA0);














kemudian yg ga kalah pentingnya adalah membikin databse/lookup table untuk scan code keyboard menjadi baris data dot matrix. (harap baca dulu cara menulis di dot matrix)




const char h_A[5] PROGMEM = {0x7e, 0x11, 0x11, 0x11, 0x7e}; //A

const char h_B[5] PROGMEM = {0x7f, 0x49, 0x49, 0x49, 0x36}; //B

const char h_C[5] PROGMEM = {0x3e, 0x41, 0x41, 0x41, 0x22}; //C

const char h_D[5] PROGMEM = {0x7f, 0x41, 0x41, 0x22, 0x1c}; //D

...... dst ....




jadi, tiap ada pemencetan tombol, maka pin clock dari keyboard akan menginterupt ( falling / turun dari 1-0) AVR dengan format seperti gambar diatas, sehingga script pada interuptnya berupa




SIGNAL (SIG_INT0) //routinre interupt INT0

{



if(clk > 1 && clk <10) //clock yg bermanfaat saja yg dibaca 



{ 

//pindahkan data dari PIN DATA keyboard ke memory

key[(clk - 2)] = ((PIND & _BV(PIND3)) >> PIND3);

 //nyalakan led penanda ada data dikirim keyboard

PORTA |= _BV(PA0);



}



clk++;   // tambahkan nilai variable clk tiap interrupt



if(clk == 12) //maksimum clock yg dikirim



{clk=1; 

PORTA &= ~_BV(PA0); //matikan led tanda data kosong



}



}


selanjutnya kita terjemahkan data dari memory array "key" kedalam bentuk hexa yg kemudian diterjemahkan dengan database metode "lookup"




int a;

char hurufnya[5];



//rumus merubah array key ke hexa scan code

 a= (128*key[7]) + (64*key[6]) + (32*key[5]) + (16*key[4]) + (8*key[3]) + (4*key[2]) + (2*key[1]) + key[0] ;





switch (a)        

  {

case 0x1C : strncpy_P(hurufnya,h_A,5); break;

case 0x32 : strncpy_P(hurufnya,h_B,5); break;

case 0x21 : strncpy_P(hurufnya,h_C,5); break;

case 0x23 : strncpy_P(hurufnya,h_D,5); break;

case 0x24 : strncpy_P(hurufnya,h_E,5); break;

case 0x2B : strncpy_P(hurufnya,h_F,5); break;

............dan seterusnya

default : strncpy_P(hurufnya,h_43,5);



  }



// selanjutnya ditampilkan di DOTMATRIX ( tampilkan per kolom)

//kolom 1

    PORTB = 0x80;

    PORTD &= ~_BV(PD0);

    PORTD |=  _BV(PD1) | _BV(PD4) | _BV(PD5) | _BV(PD6) ;

    PORTB = hurufnya[0];    

    _delay_ms(10);  

//kolom2

    PORTB = 0x80;

    PORTD &= ~_BV(PD1);

    PORTD |=  _BV(PD0) | _BV(PD4) | _BV(PD5) | _BV(PD6) ;

    PORTB = hurufnya[1];    

    _delay_ms(10);  

......dst.....


Masalahnya jaman sekarang udah jarang yang jual model PS/2 dan yang umum itu versi USB. Tinggal beli adapter nya aja...ehhh ternyata didalemnya ga ada rangkaian tambahannya loo...bikin aja sendiri



Jangan lupa untuk melakukan pull-up clock dan data dengan resistor 10K ke Vcc





hasilnya kalo udah mahir, seperti ini loooo....




code full bisa didapat disini
Share:

Jumat, 06 Juli 2012

Menghitung RPM (TACHOMETER) dari Radiasi Kabel busi



RPM ( round per minute ) adalah angka yang menunjukkan banyaknya putaran suatu system dalam 1 menit. Biasanya dimanfaatkan sebagai penunjuk putaran mesin pada kendaraan bermotor, sehingga mempermudah dalam pengaturan tenaga dan bahan bakar. Alat pengukur ini lazim disebut TACHOMETER.

Pada sebuah kendaraan roda 2, putaran mesin dapat diperoleh dengan menghitung pulsa pada dinamo, tetapi hal ini susah karena harus membuka blok mesin. Cara paling mudah adalah dengan memanfaatkan radiasi dari CDI ke BUSI yang dapat dihitung jumlah pulsanya. Jadi dengan menggunakan prinsip radiasi elektromagnet, cukup dengan melilitkan kawat tembaga/email/enamel/kabel dinamo  ke kabel di dekat ujung tutup busi, maka tegangan yang konstan (pulsa) dapat diperoleh. Jumlah lilitan tidaklah penting, cukup dikira-kira saja sampai tegangan yg dihasilkan dapat mengaktifkan transistor sebagai switch penghitung.

Tidak perlu menunggu 1 menit untuk mengeluarkan nilai RPM, dengan memanfaatkan fasilitas counter pada microcontroller maka nilai RPM dapat diperoleh. Semisal kita melakukan sampling pengambilan data RPM per 1 detik. Maka RPM didapat melalui rumus :


RPM = Jumlah Pulsa  x 60

jika ingin lebih cepat, semisal 0,5 detik, maka nilai RPM didapat dengan mengalikan jumlah pulsa yg terjadi dengan angka 120.










Skematik dibawah ini memanfaatkan microcontroller attiny2313, dan menggunakan transistor sebagai switch pulsa.



klik biar lebih jelas




sedangkan scriptnya seperti berikut ini  (revised version):

#define F_CPU 1000000UL // frek clock internal
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 

uint8_t angka1=10 ;
uint8_t angka2=10 ;
uint8_t angka3=10 ;
uint8_t angka4=10 ;
uint8_t segstep=0;

uint8_t kalibrasi=3;

int number=0;

void conv_segmen(uint8_t digit)//nampilin segmen

{
switch (digit) 
{

case 0 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5);
PORTB |= _BV(PB6) ;
break;
}
case 1 :
{
PORTB &= ~_BV(PB1) & ~_BV(PB2) ;
PORTB |= _BV(PB0) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;
break;
}
case 2 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB6) ;
PORTB |= _BV(PB2) | _BV(PB5) ;
break;
}
case 3 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB6) ;
PORTB |= _BV(PB4) | _BV(PB5) ;
break;
}
case 4 :
{
PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB5) & ~_BV(PB6) ;
PORTB |= _BV(PB0) | _BV(PB3) | _BV(PB4) ;
break;
}
case 5 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB5) & ~_BV(PB6) ;
PORTB |= _BV(PB1) | _BV(PB4) ;
break;
}
case 6 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5) & ~_BV(PB6) ;
PORTB |= _BV(PB1) ;
break;
}
case 7 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) ;
PORTB |= _BV(PB3) | _BV(PB4) | _BV(PB5)| _BV(PB6) ;
break;
}
case 8 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5) & ~_BV(PB6);
break;
}
case 9 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB5) & ~_BV(PB6);
PORTB |= _BV(PB4) ;
break;
}
case 10 :
{
PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;
break;
}
}
}



void init_ctr(void) //counter tampilan
{
TCCR0A |= (1 << WGM01); // Configure timer 0 for CTC mode
TIMSK |= (1 << OCIE0A); // Enable CTC interrupt
OCR0A = 50; // Set CTC compare value till blink disapear at 1MHz AVR clock, with a prescaler of 64
TCCR0B |= (1 << CS01)|(1 << CS00); // Start timer at Fcpu/64
}


void init_ctr1(void)//counter perhitungan 600ms sampling
{
TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
OCR1A = 586; //compare the CTC A = 600ms =586
TCCR1B |= ((1 << CS10) | (1 << CS12)); // Start timer at Fcpu/1024
}


ISR(TIMER1_COMPA_vect) //timer capture RPM counter

{ uint16_t rpm;
switch(kalibrasi) { 
case 1 :{ 
rpm=number/100;
break; }

case 2 :{ 
rpm=number/10;
break; }

case 3 :{ 
rpm=number;
break; }

case 4 :{ 
rpm=number*10;
break; }

case 5 :{ 
rpm=number*100;
break; }
default: rpm=0;
}

angka1 = rpm%10;

if(rpm>9) angka2 = ((rpm%100) - (rpm%10)) /10 ;
else angka2=10;

if(rpm>99) angka3 = ((rpm%1000) - (rpm%100)) /100 ;
else angka3=10;

if(rpm>999) angka4 = ((rpm%10000) - (rpm%1000)) /1000 ;
else angka4=10;


number=0;
}

ISR(TIMER0_COMPA_vect) // timer pindah kolom
{
segstep++;
switch(segstep) { 
case 1 :{ conv_segmen(10);
PORTD |= _BV(PD0);
PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5) ;
conv_segmen(angka1);
break;
}

case 2 :{ conv_segmen(10);
PORTD |= _BV(PD1);
PORTD &= ~_BV(PD0) & ~_BV(PD4) & ~_BV(PD5) ;
conv_segmen(angka2);
break;
}
case 3 :{ conv_segmen(10);
PORTD |= _BV(PD4);
PORTD &= ~_BV(PD1) & ~_BV(PD0) & ~_BV(PD5) ;
conv_segmen(angka3);
break;
}
case 4 :{ conv_segmen(10);
PORTD |= _BV(PD5);
PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD0) ;
conv_segmen(angka4);
segstep=0;
break; 
}
}
}


SIGNAL (SIG_INT0)
{
number++;

}

void tombol(void)
{

cli();
conv_segmen(10);

kalibrasi++;

if (kalibrasi == 6) kalibrasi=1;

eeprom_write_byte((uint8_t*)10, kalibrasi);


 _delay_ms(200); 
              sei();
}


void baca_eeprom(void)
{

kalibrasi = eeprom_read_byte((uint8_t*)10);

if(kalibrasi == 0xFF) kalibrasi=3;


}

int main(void)
{

GIMSK |= (1<<INT0); 
MCUCR |= (1<<ISC01)| (1<<ISC11); //fall edge 

DDRD |= _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) ; // seg select
                    DDRD &= ~_BV(PD3) ; // tombol
DDRB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ; // seg a,b,c,d,e,f,g


init_ctr();
init_ctr1();
baca_eeprom();
sei();
while(1)

{
                    if(bit_is_clear(PIND, PD3) )
              {tombol;
                      } 
}
}


SELAMAT MENCOBA 
Share:

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:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (2) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (39) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sinyal (1) sms (6) software (18) tachometer (2) telepon (7) televisi (73) television (5) transistor (1) troubleshoot (3) tulisan (60) tutorial (78) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika