Download

2/21/2013

BELAJAR ACCESS SD CARD CARA SIMPLE DENGAN ATTINY2313 - Part3



sebelum lanjut, kita ingat project wav player dengan memory I2C  (silahkan baca disini), kapasitasnya kecil banget dan sagat pendek, kenapa tidak kita pakai SD card saja ?

ternyata kita tidak perlu pusing2, karena jika memainkan attiny pada clock 8mhz, maka waktu access SD card dan PWM sangatlah pas sehingga cukup memainkan beberapa nilai delay saja sudah mendapatkan suara yang cukup bagus (file wav PCM 6000hz 8bit)

kita ingat dulu code untuk membuat audio via PWM - OC1A, kita hilangkan sekarang beberapa pembagian dan script jadi lebih simple

Code:
void pwm_init(void)

{

    /* use OC1A pin as output */

    DDRB = _BV(PB3);



    /*

    * clear OC1A on compare match

    * set OC1A at BOTTOM, non-inverting mode

    * Fast PWM, 8bit

    */

    TCCR1A = _BV(COM1A1) | _BV(WGM10);

   

    /*

    * Fast PWM, 8bit

    * Prescaler: clk/1 = 8MHz

    * PWM frequency = 8MHz / (255 + 1) = 31.25kHz

    */

    TCCR1B = _BV(WGM12) | _BV(CS10);

   

    /* set initial duty cycle to zero */

    OCR1A = 0;

}






dan kita mainkan delay pada code pembacaan SD CARD melalui USI, untuk clock 8mhz dan file format 6000hz 8bit mengggunakan delay seperti berikut

Code:


unsigned char SPI_write(unsigned char ch){

 USIDR = ch;

    USISR |= (1<<USIOIF);

 

 do {

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



   _delay_us(9);

   

    } while((USISR & (1<<USIOIF)) == 0);



 return USIDR;

}



THAT"S IT ....hanya itu yang dirubah, selanjutnya simpan file wav pada SD card dan dengan bantuan software winhex, kita dapat membaca sector dimana file dimulai. Jika format SD card adalah FAT16, maka jika file dicopy setelah di format ulang akan diletakkan di posisi sector 555. Karena memory attiny yang kecil, maka ga usah dibingungkan dengan pembacaan root, FAT1, FAT2 dan sebagainya. Kita baca dulu saja via winhex kemudian dimanfaatkan. Seperti pada skematik berikut, saya akan memutar audio setelah tombol dipencet...file audio saya rekam dari laptop.



(klik biar tambah gede)

audio output pada OC1A bisa menggunakan amplifier sederhana seperti diatas, atau bisa juga membuat yg lebih paten, semisal menggunakan opamp LM386 atau TDA2003 (googling aja)


Langkah selanjtunya adalah memformat SDcard dan membuat file audio yang akan diputar (bisa dipotong dari mp3 atau direkam dan jangan lupa diconvert ke WAV PCM 6000Hz 8 bit). Sebagai contoh saya mempunyai 4 file dan copykan ke SD card. Selanjutnya buka SD menggunakan winhex seperti gambar berikut :



dan tampilan snapshot SD card dan file-filenya seperti berikut:



untuk mengetahui awal dan akhir sector dari file maka kita baca FAT1 atau FAT2 yang berisikan informasi dari isi file. Tiap file yg ada pada SD card memiliki "alokasi" pada FAT ini dimana 2byte berarti 1 cluster dari file. Untung saja winhex memberitahu pada layar sebelah kiri kalau sedang klik pada alokasi file apa dan nomer sector berapa. seperti pada gambar diatas , kita hanya perlu mencari awal cluster dan akhir cluster (ditandai dengan FF FF). Kemudian kita catat seperti yang saya dapatkan.

Code:
tombol3.wav =  cluster  2 - 18    

silahkan.wav = cluster 19 - 43   

tombol1.wav = cluster  44 - 62    

tombol2.wav =  cluster 63 - 82      



ingat cluster = sector





sedangkan untuk physical sector, cukup dengan menambahkan 553 (bukan 555 karena sector 0-1 dianggap tidak ada oleh FAT16)



selanjutnya scriptnya kita tweak biar tambah maknyus seperti berikut , karena ada beberapa bagian dari file yang digenerate oleh wavepad editor kudu di skip biar halus.

Code:


void SD_play(unsigned long  sector_start, unsigned long  sector_end) {



char i;

int byte=0;

    SD_begin(sector_start); 

  

  for(i=0; i<100; i++) {

       SPI_write(0xFF);



    byte++;

    } //biar tidak njebluk pas pencet

    

 while(1) {





      OCR1A=SPI_write(0xFF);



    byte++; 



    if(byte>= 512 && byte<515)OCR1A=0x80; //silent 



    if(byte >= 515) { 

      OCR1A=0x80;//silent

         

      CS_DISABLE();



   byte =0;

         sector_start++;

         

        if(sector_start > (sector_end -7))break; //biar halus

  else SD_begin(sector_start);

        }  

      } 

}





selanjutnya semua script bisa didownload dimari


hasilnya kayak gini gan ....



SELAMAT MENCOBA !!

0 komentar:

Post a Comment

Newer Post Older Post Home
Aulia DirUt. Powered by Blogger.
 

Blog Archive

Followers

 

Templates by Nano Yulianto | CSS3 by David Walsh | Powered by {N}Code & Blogger