Download

2/18/2013

ATTINY2313 I2C MUSIC PLAYER







setelah berhasil membuat downloader EEPROM serial (I2C) kepikiran juga buat ngemanfaatin eeprom ini untuk nyimpan sesuatu. Bisa aja digunakan menyimpan data text untuk project lovehurts sehingga tulisannya lebih panjang. Tapi kali ini akan saya pergunakan untuk menyimpan data wav

Langkah-langkah yang perlu dikuasai adalah:

1. Memutar wav file (PCM 8bit mono) yang pernah dibahas disini

2. Akses EEPROM dengan I2C menggunakan library Pfleury , untuk librarynya bisa didownload disini


Kita bahas dulu cara akses I2C menggunakan TWIMASTER Pfleury, ada i2cmaster.h (include) i2cmaster.S (add source code) dan twimaster.c (dicopy saja). Secara default library ini menggunakan aturan port SDA / SCL dari ATMEGA, sehingga untuk ATTiny2313 edit i2cmaster.S dibagian ini :

Code:


;***** Adapt these SCA and SCL port and pin definition to your target !!

;

#define SDA      5  // SDA Port B, Pin 5   


#define SCL  7  // SCL Port B, Pin 7

#define SDA_PORT        PORTB           // SDA Port B

#define SCL_PORT        PORTB           // SCL Port B         



Penggunaan library ini menggunakan beberapa perintah seperti berikut :


#define Dev24C64 0xA0

define ini berguna sebagai addressing i2C, karena bus i2C dapat dicascade





untuk IC 24C64 menggunakan addressing 8bit = 1,0,1,0, A2, A1, A0, [direction] , sehingga jika menggunakan 1 buah ic saja maka nilai define adalah 0xA0

i2c_init(); : inisialisasi awal

i2c_start_wait(Dev24C64+I2C_WRITE);
i2c_rep_start(Dev24C02+I2C_READ);

masukkan adress IC + Arah , dalam include sudah di define I2C_WRITE = 0 , I2C_READ =1

sequence untuk menulis :

Code:

     i2c_start_wait(Dev24C64+I2C_WRITE)

     i2c_write(0x05);                        // tulis alamat memory = 5


     i2c_write(0x75);                        // masukkan nilai  0x75ke EEPROM

     i2c_stop();                             // set stop conditon = release bus



sequence untuk membaca data secara satu persatu :

Code:

  

    i2c_start_wait(Dev24C02+I2C_WRITE);  // awal menulis alamat dulu 


    i2c_write(0x05);                        // tulis alamat yang akan dibaca = 5

     i2c_rep_start(Dev24C02+I2C_READ);       // mode baca

     baca = i2c_readNak();                    // baca byte dari EEPROM

     i2c_stop();


sequence untuk membaca seluruh data EEPROM secara berulang :


Code:

  

     i2c_rep_start(Dev24C02+I2C_READ);       // mode baca

     for(;;) baca=i2c_readAck();  // baca terus berulang


setelah mengerti langkah2 ini, maka isi dari ic eeprom dapat diakses dengan mudah.

>> UBAH FILE AUDIO MENJADI FORMAT WAV -PCM -8bit -Mono - 6000hz (48kbps)

caranya ? gunakan software WAVEPAD atau yang lain ..untuk IC 24C64 panjang audio yang dapat diputar berkisar 1.2 - 1.5 detik ...wah pendek banget...ya karena memang tanpa kompresi kok...
selanjutnya jangan lupa download langsung file wav tadi ke dalam ic seperti penjelasan sebelumnya.


SKEMATIK :


*)) ralat R2 dan R3 = 4K7 ohm


lepaskan koneksi ke SDA/SCL ke MOSI/SCK (setelah pull up 4k7)pada saat programming, sehingga IC eeprom tidak terhapus dan pin ISP tidak ter pull up



SCRIPT

Jika masih bingung, harap membaca pembahasan sebelumnya untuk memutar wav di mega8515 , karena hanya diubah sedikit saja

Code:


#define F_CPU 8000000UL

#include <stdint.h>


#include <avr/io.h>

#include <avr/interrupt.h>

#include "i2cmaster.h"



//#define SAMPLE_RATE 8000;

#define Dev24C64 0xA0



int sample_count;


//inisialisasi PWM


void pwm_init(void)

{

    // gunakan OC1A sebagai 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;

   

    /* Setup Timer0 */

 

    TCCR0B|=(1<<CS00);


    TCNT0=0;

    TIMSK|=(1<<TOIE0);

    sample_count = 4;

    sei(); //Enable interrupts

}




ISR(TIMER0_OVF_vect)

{

    

         sample_count--;  // menggunakan 4 step 

       if (sample_count == 0)

           {

             sample_count = 4;          


        

    OCR1A = i2c_readAck();   // baca memory secara loop

        

       }

    }




int main(void)


{


   i2c_init(); 

   pwm_init();


 //inisialisasi baca secara terus menerus

 i2c_rep_start(Dev24C64 + I2C_READ); 



   while(1);//muter terus

}





hasilnya seru kayak gini nih......




kalo bisa pake memory yang lebih besar biar lebih panjang lagunya

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