aplikasi modul suara untuk antrian

bikin project suara antrian kaya di bank, ini cocok untuk yang mau buat mainan.  blok diagramnya seperti ini

komunikasinya memakai paralel aja 8bit, pin strobe, dan pin busy. saya kenalkan dulu modul suaranya.

modul suara ini merupakan

–  modul suara yang support untk file mp3,

– bisa rekam dan play music,

– antarmuka bisa serial,i2c dan paralel.

– tegangan kerja 3-7 v

– include mic untuk rekam

pakai modul suara ini di jamin lebih keren lah, suaranya mantap,

-berikut fungsi fungsi pin modul suara

– pin strobe digunakan untuk trigger

– p20-p27 digunakan untuk data paralel 8 bit

– MCU TXD merupakan sinyal serial transmit, Level TTL

– Busy, pin ini akan aktif low jika file mp3 sedang di jalankan

– MCU RXD merupakan sinyal receive

– MCU RST, pin reset untuk modul suara. minimal low 10 ms

modul suara ini memiliki 9 mode, yang akan saya jelaskan cukup mode 7 aja, yang lainnya belajar sendiri aja.

//======================================================================================

untuk menjalankan modul suara ini pertama tama kita harus memilih mode, yaitu dengan cara menyeting SD CARD. SD CARD hanya support untuk 2 g ke bawah. kemudian system formatnya pilih FAT

kemudian pada SD CARD buat 2 folder dengan nama

– Music

– Config

Kemudian Pada folder config buat file dengan nama

– Config.txt

file config .txt ini isi dengan mode(1-9) misal kita mode 7 isi dengan angka 7.

pada folder music diisi dengan file mp3, nama file mp3 harus 001.MP3, 002.MP3 sampai 255.mp3.

//==================================================================================

untuk mode 7 ini maximum bisa memanggil 256 file yaitu dari konfigurasi paralel 8 bit (0-255).

untuk menjalankan mode 7 ini, pertama tama kita tulis strobe aktif low. kemudian siapkan data paralel 8 bit (aktif low). kalo kita misal pengen pilih file 001.mp3 maka data yang di kirim itu 254 atau 0b1111 1110.  setelah itu  kita tulis stobe aktif high nah maka file mp3 akan mulai di play, tanda ketika file mp3 sudah di play pin busy akan aktif low, kemudian kita tunggu hingga pin busy aktif high, jika busy sudah logic high maka file sudah beres di putar. saya berikan contoh simplenya

void play(unsigned char nomor)

{

unsigned char temp;

temp=nomor;

PORTD.2=0;

delay_ms(10);

PORTB=temp;

delay_ms(10);

PORTD.2=1;

//PORTB=255;

for(;;)

{

if(PIND.3==0)

break;

}

for(;;)

{

if(PIND.3==1)

break;

}

}

nah itu subrutinnya,

berikut contoh demonya. untuk pemanggilan suara bank

belajar menyimpan data suhu lm 35 ke MMC

kali ini kita akan praktikum . bagaimana caranya menyimpan data suhu lm 35 ke mmc. data akan disimpan tiap  10 detik sekali. adapun bahan bahan yang harus disiapkan

1. modul avr trainer 2.0 dengan ic atmega 32.

2. mmc

3. codevision.

………………………………………………………………………………………………………………………………………………………………………….

alangkah baiknya anda membeli modul avr trainer 2.0 dengan ic atmega 32 harga 450.000. agar praktikum anda berjalan dengan mulus.

mmc yang dipakai mmc merek VGEN .siapa tahu di kasih hadiah sama v gen

code vision yang di pakai , yaitu versi 2.04 keatas. agar support MMC librari.

//=====================================================================

pertama kita buat dulu project baru dengan codevision. yang jelas yang dipakai ic atmega 32, xtal 11.0592, adc, i2c buat rtc ds1307, dan mmc, berikut setingan yang penting untuk MMC.

nantinya di hardware modul avr trainer 2.0 PORTD.5 DAN PORTD.6 di sambungkan ke GND ..

//=============================================================

berikut hasil create file menggunakan modul avr trainer 2.0

berikut isi dari file suhu.txt.

berikut contoh source codemenulis data suhu ke mmc tiap 1o detik sekali.

source code memakai compiler codevision 2.04.4a

ayo gan setelah mengcopy source code ini jangan lupa kalo ada yang nanya, beli modul avr dimana, hubungi KEI ELEKTRONIK(085228292473) ya. ini cuma permintaan saya saja. .

nah sekarang penjelasannya. saya akan mencoba menjelaskan yang penting pentingnya saja.

MEMBERI SEBUAH NAMA FILE

Dalam memberikan sebuah nama file , kita harus mengikuti aturan penamaan file seperti DOS. yaitu nama file maximal 8 huruf. lebih dari itu tidak bisa coba buktikan sendiri.

Dalam contoh ini saya memberi nama file. “suhu.txt”. nama file ini di hitung cuma 4 huruf sedangkan .txt tidak dihitung.

terus  ketika kita memanggil nama file diusahakan filename itu di kosongkan dulu dengan cara diisi 0. dapat dilihat di subrutin reset filename

Membuat sebuah file.

urutan untuk membuat sebuah file:

1. reset namafile

2.beri nama file (jangan lupa tidak boleh lebih dari 8 huruf).

3. create file

4.  jangan lupa close file (kalo fungsi close file tidak di panggil mas proses membuat file baru tidak akan berhasil.

berikut source nya

void file_baru(void)
{
    unsigned char ulang;
    status_create=0;
    for(ulang=0;ulang<10;ulang++)
    {
        reset_filename();
        file_data_suhu();
        timer_mmc();   

        if ((res=f_open(&file,filename,FA_CREATE_NEW))==FR_OK)status_create=1;
        else status_create=0;

        if(status_create==1)
        {
            if ((res=f_close(&file))==FR_OK)status_create=1;
            else status_create=0;
        }

        if(status_create==1)break;

    }
    stop_timer_mmc();
}

Mengisi isi file (append)

urutan untuk mengisi file, dalam proyek ini kita akan menambahkan isi file ke bawah,  urutan :

1. reset nama file

2. beri nama fie

3. baca ukuran file (ukuran file ini dgunakan untuk mengetahui posisi terakhir alamat isi file).

4. buka file kemudian pilih mode tulis file

5. tunjuk alamat file yang akan ditulis. ( disini kita menggunakan alamat hasil dari ukuran file agar nantinya nambah terus).

6. kemudian tulis file dari buffer yang sudah di siapkan

7. close file (kalau fungsi close tidak dipanggil pasti udik semuanya. alias tidak berhasil).

void isi_file(void)
{
    unsigned ulang;
    status_tulis=0;

    reset_filename();
    file_data_suhu();
    display_status(filename);

     for(ulang=0;ulang<10;ulang++)
    {
             timer_mmc();
            if ((res=f_open(&file,filename,FA_WRITE))==FR_OK)status_tulis=1;
            else status_tulis=0; 

            if(status_tulis==1)
            {
                if ((res=f_lseek(&file,finfo.fsize))==FR_OK)status_tulis=1;
                else status_tulis=0;
            }

            if(status_tulis==1)
            {
                if ((res=f_write(&file,buffer,panjangdatammc+1,&nbytes))==FR_OK)status_tulis=1;
                else status_tulis=0;
            }

            if(status_tulis==1)
            {
                if ((res=f_close(&file))==FR_OK)status_tulis=1;
                else status_tulis=0;
            }     

            if(status_tulis==1)break;
            delay_ms(500);
    }
    stop_timer_mmc();
}

sekian dulu dari saya. maaf photo hardwarenya belum saya upload. nanti saya upload. mudah mudahan semuanya nambah rejekinya. amin. jangan lupa KEI ELEKTRONIK ya.

trims

dhani nugraha S.T.


	

jika MMC FAT 32 jadi source code murahan.

terus terang saja, saya juga masih bingung dengan fat32. ngga ngerti ngerti, ngerti MMC cuma nulis samapai raw format saja. untuk fat32 ngga ngerti ngerti. nyari nyari di google banyak yang bahas, tapi pas modifnya juga pusing.

Nah kalo jagonya MMC FAT32 pasti semuanya nyotek dari elm chan. pahlawan saya di jaman sekarang (open source sejati). nah dari seorang elm chan inilah code vision juga ngambil librarynya. nah karena berhubung saya ngga ngerti ngerti tentang fat 32. jadi  saya ber inisiatif untuk  coba mengerti  pemakaian library nya.

Nah betapa gampangnya memakai libarary MMC elm chan di compile code vision. untuk memakai library mmc kita harus mengaktifkannya terlebih dahulu di code wizzard nya (hahahhaha gaul euy apal code wizzard). berikut setingannya

nah jika MMC nya tidak ada pin out untuk CD(CARD DETECT) sama WP (Write protected).  Sudah saja jangan bingung bingung tipu saja pin mikronya. jadi pin CD dan WP mikro di GND kan. WKWKWKWKWKWKWKKWKW.

sudah urusan hardware pasti beres kalo CD sama WP di tipu mah. nah terus kita berlanjut membahas softwarenya. materi yang akan saya bahas:

1. inisialisasi fat 32

2. buat file .txt

3. isi file

4. baca file

5. delete file

6. baca ukuran file

7. lihat isi mmc

nah itu yang akan saya bahas. gaya euy jiga dosen wae. hehehehhe.

TO be continued. pembahasan lengkapa ada di MODUL AVR TRAINER 2.0 ayo segera beli. harga terjangkau 1 paket Rp.500.000.

Anda pintar saya senang, anda kaya saya juga kaya.

trims

dhani nugraha A.md, S.T


UNEK UNEK MMC

Kemarin SD card (MMC) saya dipinjam oleh teman, munkin sama teman di format pakai FAT32, dan keesokan harinya MMC tersebut dikembalikan, kemudian saya pun langsung, memasukan MMC tersebut ke alat yang saya buat.

Tetapi ternyata setelah saya masukan MMC Ke alat saya, ternyata ada masalah, sebelumnya, menulis dan membaca ke MMC itu yang normal normal saja dan hampir dipastikan jarang sekali gagal, ini ternyata sering gagalnya, akhirnya saya pun, punya pemikiran untuk memformat MMC dengan komputer saya kembali , tetapi cuma dengan format FAT saja, akhirnya setelah saya format, MMC saya masukan kembali,dan akhirnya alat saya berjalan dengan normal kembali.

Saya kurang tahu kenapa di format FAT32 kurang stabil, Tetapi di format FAT saja sangat stabil!!!!!!!!!!!!!!

program antarmuka mmc dengan atmega 128

UNTUK SETINGAN DI PROTEUSNYA SEPERTI GAMBAR DIBAWAH INI

filemmc

PADA CARD IMAGE FILE KAMU BIKIN FILE DENGAN EKSTENSI .MMC, MISALNYA PUNYA SAYA DATA.MMC

BERIKUT TAMPILAN SIMULASINYA

filemmc1

DATA YANG DITULISKAN YAITU KARAKTER ASCII DARI 0-255. NAH KALO INGIN LIHAT DATA YANG DITULIS KE MMC SUDAH BENAR PAKAI WINHEX. MMC MASUKIN KE KOMPUTER TERUS LIHAT PAKAI PROGRAM WINHEX

BERIKKUT TAMPILAN MMC KETIKA DIBUKA DENGAN PROGRAM WINHEX.

filemmc2

 

UNTUK MEMBUKA MMC DENGAN WINHEX, MASUK TOOLS–>OPENDISK, TERUS FILIH MMC YANG DIPAKAI.

FILEMMC3

 

INI SOURCE NYA MEMAKAI AVR STUDIO4 +AVR GCC

//============================================
//atmega 128 crystal 11059200
//============================================
#define F_CPU 11059200UL
#include “util/delay.h”
#include “stdlib.h”
#include “avr/io.h”
#include “avr/iom128.h”
#include “avr/pgmspace.h”
#include “avr/interrupt.h”
//===========================================
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ((F_CPU)/((UART_BAUD_RATE)*16l)-1)
//===========================================
#define SPIDI    3    // Port B bit 6 (pin7): data in (data from MMC)
#define SPIDO    2    // Port B bit 5 (pin6): data out (data to MMC)
#define SPICLK    1    // Port B bit 7 (pin8): clock
#define SPICS    0    // Port B bit 4 (pin5: chip select for MMC

#define enable_mmc    PORTB&=~(1<<SPICS)
#define disable_mmc   PORTB |=(1<<SPICS)
//=====================================================mmc
#define GO_IDLE_STATE            0+0x40
#define SEND_OP_COND             1+0x40
#define READ_SINGLE_BLOCK        17+0x40
#define WRITE_SINGLE_BLOCK       24+0x40

#define idmaksimal 250

unsigned long startmmc;
unsigned int jumlah_idamr;
unsigned char temp1,temp2;
unsigned int immc,index1word,index2word,indexserial,indextime,indextime1;
unsigned char status_bacammc,status_tulismmc;
unsigned char ulang_bacammc,ulang_tulismmc;
unsigned char buffer_mmc[512];
//===================================================================
void init_serial1()
{
UBRR1H=(uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRR1L=(uint8_t) UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
UCSR1B |= (1<<RXEN1)|(1<<TXEN1);
UCSR1C |= (1 << UCSZ10) | (1 << UCSZ11);
}

void uart_putc1(unsigned char c)
{
while(!(UCSR1A & (1 << UDRE1)));
UDR1 = c;
}

void uart_puts1(char *s) {
while (*s) {
uart_putc1(*s);
s++;
}
}

void uart_puts_p1(const char *progmem_s)
{
register char c;
while ((c = pgm_read_byte(progmem_s++))) {
uart_putc1(c);
}
}

void uart_puts_pp1(const char *progmem_s)
{
register char c;
for(;;)
{
c = pgm_read_byte(progmem_s++);
if(c==0) break;
uart_putc1(c);
}
}

void enter()
{
uart_putc1(13);
uart_putc1(10);
}

void uartbyte(unsigned char datana)
{
unsigned char tempbyte;
unsigned char buff[3];
tempbyte=datana;
buff[2]=(tempbyte/100)+48;
buff[1]=((tempbyte%=100)/10)+48;
buff[0]=(tempbyte%10)+48;
if (datana <10){uart_putc1(buff[0]);}
else if(datana <100) {uart_putc1(buff[1]);uart_putc1(buff[0]);}
else {uart_putc1(buff[2]);uart_putc1(buff[1]);uart_putc1(buff[0]);}
}

void uartword(unsigned int datana) //(0-9999999)
{    unsigned int tempword;
unsigned char buff[5];
tempword=datana;
buff[4]=(tempword/10000)+48;
buff[3]=((tempword%=10000)/1000)+48;
buff[2]=((tempword%=1000)/100)+48;
buff[1]=((tempword%=100)/10)+48;
buff[0]=(tempword%=10)+48;
if (datana <10){uart_putc1(buff[0]);}
else if(datana <100) {uart_putc1(buff[1]);uart_putc1(buff[0]);}
else if(datana <1000) {uart_putc1(buff[2]);uart_putc1(buff[1]);uart_putc1(buff[0]);}
else if(datana <10000)
{uart_putc1(buff[3]);uart_putc1(buff[2]);uart_putc1(buff[1]);uart_putc1(buff[0]);}
else if(datana <65536)
{uart_putc1(buff[4]);uart_putc1(buff[3]);uart_putc1(buff[2]);uart_putc1(buff[1]);uart_putc1(buff[0]);}
}
//=======================================================
//================================================================
//spi
//================================================================
void init_spi()
{
DDRB &= ~(1 << SPIDI);    // set port B SPI data input to input
DDRB |= (1 << SPICLK);    // set port B SPI clock to output
DDRB |= (1 << SPIDO);    // set port B SPI data out to output
DDRB |= (1 << SPICS);    // set port B SPI chip select to output
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
//PORTB &= ~(1 << SPICS);    // set chip select to low (MMC is selected)
enable_mmc;
//SPE SPI ENABLE;
//MASTER
//64
}

char spi(char d) //kirim terima 1 byte
{
char received = 0;
SPDR = d;
while(!(SPSR & (1<<SPIF)));
received = SPDR;
return (received);
}
//=================================================================
//mmc
//=================================================================
char send_command(char command1, unsigned long adr, char command2 )
{
unsigned int retry=0;
unsigned char response;
spi(0xFF);
spi(command1);
spi(adr>>24);
spi(adr>>16);
spi(adr>>8);
spi(adr);
spi(command2);
//spi(0xFF);

//return spi(0xFF);    // return the last received character

retry=0;
do
{
response=spi(0xFF);
retry++;
//if(retry>0xfe) return 0; //time out
if(retry>2000) return 0; //time out
}
while(response == 0xff);
return response;
}

int init_mmc(void)
{
unsigned char i,response;
unsigned int retry=0
;
disable_mmc;
for(i=0;i<10;i++) spi(0xFF); //10*8=80 clock pulses
enable_mmc;

do
{
response = send_command(GO_IDLE_STATE, 0,0×95);//send ‘reset & go idle’ command
retry++;
if(retry>2000) return 0; //time out
//if(retry>0xfe) return 0; //time out
} while(response != 0x01);

retry = 0;

do
{
response =send_command(SEND_OP_COND, 0,0xff); //activate card’s initialization process
retry++;
if(retry>2000) return 0; //time out
//if(retry>0xfe) return 0; //time out
}while(response); // tunggu sampai 0
SPCR &= ~((1<<SPR0) | (1<<SPR1));
SPSR = SPSR|(1<<SPI2X);
return 1;
}

void inisialisasi_mmc() // 1 oke, 0 gagal inisialisasi mmc
{
unsigned char statusmmc;
for(;;)
{
statusmmc=init_mmc();
if(statusmmc==1)break;
}
}

//=========================================================
//write single block mmc
//=========================================================
unsigned char mmc_writesingleblock(unsigned long startBlock)
{
unsigned char response;
unsigned int i,retry=0;

do
{
response = send_command(WRITE_SINGLE_BLOCK, startBlock,0xff);//send ‘reset & go idle’ command
retry++;
//if(retry>0xfe) return 0; //time out
if(retry>2000) return 0; //time out
} while(response != 0x00);

spi(0xFF);
spi(0xFF);
spi(0xFE);
for (i=0;i<512;i++)
{
spi(buffer_mmc[i]);
}
spi(0xFF);
spi(0xFF);

response =spi(0xFF);
response&= 0x1F;     // 0x1F = 0b.0001.1111;
if (response!= 0x05)
{ // 0x05 = 0b.0000.0101
//uart_puts(“MMC: write error 2 “);//debug
return 0;
}

retry=0;
do
{
response=spi(0xFF);
retry++;
//if(retry>0xfe) return 0; //time out
if(retry>2000) return 0; //time out
}
while(response != 0xff);
return 1;
}

//=========================================================
//read single block mmc
//=========================================================
unsigned char mmc_readsingleblock(unsigned long startBlock)
{
unsigned char response;
unsigned int i=0;
unsigned int retry=0;
response = send_command(READ_SINGLE_BLOCK, startBlock,0xff);
if(response != 0x00)
{
return 0;
}

do
{
response = spi(0xff);
retry++;
//if(retry>0xfe) return 0; //time out
if(retry>2000) return 0; //time out
} while(response != 0xfe);

for (i=0;i<512;i++)
{
buffer_mmc[i]=spi(0XFF);
//uartword(i);                //debug
//uart_puts(“—>”);            //debug
//uart_putc(buffer_mmc[i]);// tampil uart
//enter();
}

spi(0xFF); // actually this returns the CRC/checksum byte
spi(0xFF);
return 1;
}

//======================================================================
void hitung_startblock()
{
unsigned long dataku;
dataku=index1word;
startmmc=dataku*512;
}
//===========================================
//program utama
//===========================================
int main()
{
_delay_ms(100);
init_spi();
init_serial1();
inisialisasi_mmc();
uart_puts1(“inisialiasi mmc oke”);        //indikator
enter();
for(;;)
{
for(index1word=0;index1word<512;index1word++)
{
buffer_mmc[ index1word]=index1word;
}

ulang_tulismmc=10;
for(immc=0;immc<ulang_tulismmc;immc++)
{
status_tulismmc=mmc_writesingleblock(0);
if(status_tulismmc==1)break;
_delay_ms(50);
}

ulang_bacammc=10;
for(immc=0;immc<ulang_bacammc;immc++)
{
status_bacammc=mmc_readsingleblock(0);
if(status_bacammc==1)break;
_delay_ms(50);
}

for(index1word=0;index1word<512;index1word++)
{
uart_putc1(buffer_mmc[index1word]);
if(index1word%50==0)enter();
}
enter();
uart_puts1(“selesai”);
enter();
for(;;){;}
}
}
//===========================================

ANTARMUKA ATMEGA 128 DENGAN MMC

IO MMc / SD card membutuhkan tegangan 3.3v, jadi kalo kita menghubungkannya dengan sebuah mikro, cara menurunkannya bisa memakai pembagi tengangan, atau dengan zener, dan bisa juga dengan memakai ic buffer

antarmukaMMC

baru nyoba mmc, baru bisa mode raw format,  inisialisasi, nulis, baca mmc udah stabil.

belum bisa mode pake fat, fat16,dan fat32. setiap ada kemauan pasti bisa.

bisa karena terpaksa