KOMUNITAS HOBBIYST ELEKTRONIKA - KHE
Diskusi Elektronika => Kategori Mikrokontroller/Robotik => Mikrokontroller Seri ATMEL => Topik dimulai oleh: takalamingan pada Oktober 26, 2011, 01:28:10 PM
-
mau tanya nih,,,saya kan mau buat proyek pake mikrokontroler ATMEGA32 trus ngeluarin suara berformat WAV dari SD Card,,,sistemnya FAT,,,saya ambil dari elm-chan,,,nah yang mau saya tanyakan bagaimana cara memanggilnya???kalau untuk memanggil teks sudah bisa,,,saya bingung cara memanggil suaranya,,,setelah saya lompat pake "f_lseek" untuk mengabaikan headernya apa yang harus saya program lagi untuk memanggil byte suara sampai habis,,,apakah memakai f_read atau f_forward???kalau dibaca tutorialnya saya lebih prefer pakai f_forward karena langsung streaming dari SD Card ke output tanpa adanya buffer,,,mohon pencerahannya bagaimana contoh program untuk memanggil suara pakai syntax tersebut...soalnya kalau saya baca dari contohnya elm-chan jadi bingung,,,saya pakai Code Vision buat pemrogramannya,,,
-
agak rumit kyaknya nih..
konek1 konek1 konek1 konek1 konek1 konek1
-
Waduuuh...ga pernah pake SD Card, paling pake ISD....sama kayak iccank BINUN??? nyerah1
-
mau tanya nih,,,saya kan mau buat proyek pake mikrokontroler ATMEGA32 trus ngeluarin suara berformat WAV dari SD Card,,,sistemnya FAT,,,saya ambil dari elm-chan,,,nah yang mau saya tanyakan bagaimana cara memanggilnya???kalau untuk memanggil teks sudah bisa,,,saya bingung cara memanggil suaranya,,,setelah saya lompat pake "f_lseek" untuk mengabaikan headernya apa yang harus saya program lagi untuk memanggil byte suara sampai habis,,,apakah memakai f_read atau f_forward???kalau dibaca tutorialnya saya lebih prefer pakai f_forward karena langsung streaming dari SD Card ke output tanpa adanya buffer,,,mohon pencerahannya bagaimana contoh program untuk memanggil suara pakai syntax tersebut...soalnya kalau saya baca dari contohnya elm-chan jadi bingung,,,saya pakai Code Vision buat pemrogramannya,,,
prinsipnya setelah kita baca struktur dari FAT nya, kita akan tau file wav yg mau kita baca ada di physical sector mana, lalu baca sector demi sector sampai file habis. beberapa catatan:
*. perhatikan format dari wav tsb (mono/stereo, dan sample ratenya)
*. nilai sample disimpan dalam complement dua
-
masalahnya, atmega32 itu kalo saya tak salahjenis mikrokontroller 8bit ya.. apa bisa hasilkan musik hanya dnegan 8bit...?dari beberapa literatur di internet, beberapa mengatakan terlalu mepet untuk mengolah suara dengan mikrokontroller 8bit... TAPI, ada bebrapa yang bisa, pake PIC seri 16F. coba lihat di youtube...
kalo ada literaturnya.. jujyr saya dari beberapa bulan yang lalu sudah coba cari info ato literature yang membahas masalah ini... ada proyek kecil... cari1
-
Mas Dian beri contoh listing and rangkaiannya biar kita coba-coba...
-
Mas Dian beri contoh listing and rangkaiannya biar kita coba-coba...
saya suka males bikin skema.. caranya mudah kok..
coba ikutin step berikut, kalau belum berhasil nanti saya share lebih jauh ya..
1. hubungkan SD card ke SPI Port (kalau mau cepat) atau ke port/pin manapun (bit bang) selain Port A dan Port B
2. hubungkan port A dan port C (16 bit) ke rangkaian R2R DAC (16 bit DAC dengen 2 jenis resistor) coba google aja R2R DAC..
3. baca sector dari MMC/SD Card (per 512 byte) masukkan kedalam array
4. proces array per 16 bit data, invert bit ke 16 (MSB)
5. keluarkan 16 data tsb ke port A dan Port B
note: beri delay secukupnya sesuai dgn sample rate nya.. biar gak terlalu ngebut suaranya
sejauh yg saya uji cukup bersaing kualitasnya.
berikut ada penggalan program dalam BASCOM yg saya pakai, menggunakan nanoFAT (made in dewe)
'*******************************************************************************
' micro FAT32 access for read only wav player
' Dian Kurniawan v0.1b
' 2005
'*******************************************************************************
$regfile = "m16def.dat"
'$crystal = 7372800
$crystal = 14745600
$baud = 57600
'*******************************************************************************
' Overlay Memory
'*******************************************************************************
Dim Buff(512) As Byte
Dim Fileinfo(128) As Long At Buff Overlay
'*******************************************************************************
' MBR and Partition
'*******************************************************************************
Dim Mbr(512) As Byte At Buff Overlay
Dim Map_part_type_1 As Byte At Mbr(1) + 450 Overlay
Dim Map_lba_start_1 As Long At Mbr(1) + 454 Overlay
Dim Map_part_type_2 As Byte At Mbr(1) + 466 Overlay
Dim Map_lba_start_2 As Long At Mbr(1) + 470 Overlay
Dim Map_signatur_mbr As Word At Mbr(1) + &H1FE Overlay
'*******************************************************************************
' Boot Record
'*******************************************************************************
Dim Bootrec(512) As Byte At Buff Overlay
Dim Map_bytspersec As Word At Bootrec(1) + &H0B Overlay
Dim Map_secperclus As Byte At Bootrec(1) + &H0D Overlay
Dim Map_rsvdseccnt As Word At Bootrec(1) + &H0E Overlay
Dim Map_numfats As Byte At Bootrec(1) + &H10 Overlay
Dim Map_fatsz32 As Long At Bootrec(1) + &H24 Overlay
Dim Map_rootclus As Long At Bootrec(1) + &H2C Overlay
Dim Map_signature_boot As Word At Bootrec(1) + &H1FE Overlay
'*******************************************************************************
' microFAT variable
'*******************************************************************************
Dim Lba_start As Long
Dim Fat_begin_lba As Long
Dim Cluster_begin_lba As Long
Dim Bpb_secperclus As Byte
Dim Bpb_rootclus As Long
Dim Bpb_rsvdseccnt As Word
Dim Bpb_numfats As Byte
Dim Bpb_fatsz32 As Long
'*******************************************************************************
' File Handling
'*******************************************************************************
Dim Fsize As Long
Dim Start_cluster As Long
Dim End_cluster As Long
Dim Addr As Long
Dim Saddr As Long
Dim Sector_pointer As Long
'*******************************************************************************
' DAC Part
'*******************************************************************************
Dim Pcml As Byte
Dim Pcmh As Byte
Dim State As Byte
Dim Dstate As Bit
Dim Idx As Word
'*******************************************************************************
' MMC SPI Part
'*******************************************************************************
Dim Dat As Byte
Dim Resp As Byte
Const Msbl = 0
Dim I As Word
Dim J As Word
Dim Chain_loop As Word
Dim Cmd As String * 8
Dim Rx As Byte
'*******************************************************************************
' Sub Routine Declaration
'*******************************************************************************
Declare Sub Readsector(byval Secnum As Long)
Declare Sub Playsector(byval Secnum As Long)
Declare Sub Playcluster(byval Secnum As Long)
Declare Sub Initmmc()
Declare Sub Initmicrofat()
Declare Sub Getbootrecord()
Declare Sub Playmmc
Declare Sub Printsector
'*******************************************************************************
' Peripheral Config
'*******************************************************************************
'Config Spi = Soft , Din = Pinb.3 , Dout = Portb.1 , Ss = Portb.0 , Clock = Portb.2
'Spiinit
'Cs Alias Portc.0
'Mosi Alias Portc.1
'Clk Alias Portc.2
'Miso Alias Pinc.3
Cs Alias Portb.0
Mosi Alias Portb.1
Clk Alias Portb.2
Miso Alias Pinb.3
Set Cs
Set Clk
Set Mosi
Config Porta = Output
Config Portb = Output
Config Portc = Output
Config Portd = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Input
Config Pinb.4 = Input
Config Pinb.5 = Input
Config Watchdog = 2048
Waitms 100
'*******************************************************************************
' Main Program
'*******************************************************************************
'Enable Urxc
'Enable Interrupts
'On Urxc Change_track
'
' Open "comd.6:57600,8,n,1" For Output As #1;
' Waitms 200
Cmd = ""
Porta = &HFF
Portb = &HFF
Portc = &HFF
Portd = &HFF
State = &HFF
Dstate = 1
Main:
Print "MMC 1.0"
Set Cs
Waitms 500
'Start Watchdog
Call Initmmc
'Stop Watchdog
Print "MMC init success"
Call Initmicrofat
Print "MMC MicroFat success"
Call Playmmc
Goto Main
End
'*******************************************************************************
' init microfat
' get partition information
'*******************************************************************************
Sub Initmicrofat()
Local Calc As Long
Call Readsector(0)
If Map_signatur_mbr = &HAA55 Then
If Map_part_type_1 = &H0B Or Map_part_type_1 = &H0C Then
Lba_start = Map_lba_start_1
Call Getbootrecord
Else
If Map_part_type_2 = &H0B Or Map_part_type_1 = &H0C Then
Lba_start = Map_lba_start_2
Call Getbootrecord
Else
Print "Error, #2" '"microfat Doesn't Recorg Partition Type "
End If
End If
Else
Print "Error, #1" '"microFat doesn't recorg Master Boot Record"
End If
Fat_begin_lba = Lba_start + Bpb_rsvdseccnt
Cluster_begin_lba = Lba_start + Bpb_rsvdseccnt
Calc = Bpb_fatsz32 * Bpb_numfats
Cluster_begin_lba = Cluster_begin_lba + Calc
End Sub
'*******************************************************************************
' Getbootrecord
'*******************************************************************************
Sub Getbootrecord()
Sector_pointer = Lba_start * 512
Call Readsector(sector_pointer)
If Map_signature_boot = &HAA55 Then
Bpb_secperclus = Map_secperclus
'Bpb_secperclus = Bpb_secperclus - 1
Bpb_rootclus = Map_rootclus
Bpb_rsvdseccnt = Map_rsvdseccnt
Bpb_numfats = Map_numfats
Bpb_fatsz32 = Map_fatsz32
Else
Print "Error, #3" '"microFat doesn't recorg Partition Boot Record"
End If
End Sub
'*******************************************************************************
' init MMC device
'*******************************************************************************
Sub Initmmc
Set Cs
Dat = &HFF
For I = 1 To 80
Reset Clk
Waitus 1
Set Clk
Waitus 1
Next I
Reset Cs
Resp = 255
Dat = &H40
Addr = 0
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbl
Dat = &H95
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
While Resp <> &H01
Shiftin Miso , Clk , Resp , Msbl
Wend
Set Cs
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
While Resp <> &H00
Reset Cs
Waitms 100
Dat = &H41
Addr = 0
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbx
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Set Cs
Waitms 100
Wend
Shiftout Mosi , Clk , Dat , Msbl
End Sub
'*******************************************************************************
' Readsector
'*******************************************************************************
Sub Readsector(byval Secnum As Long)
Local Sec_idx As Word
Reset Cs
Dat = &H51
Addr = Secnum
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Addr , Msbx
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp <> 0
Shiftin Miso , Clk , Resp , Msbl
Wend
While Resp <> &HFE
Shiftin Miso , Clk , Resp , Msbl
Wend
For Sec_idx = 1 To 512
Shiftin Miso , Clk , Resp , Msbl
Buff(sec_idx) = Resp
Next Sec_idx
Shiftin Miso , Clk , Resp , Msbl
Shiftin Miso , Clk , Resp , Msbl
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
End Sub
'*******************************************************************************
' Play
'*******************************************************************************
Sub Playmmc
Local Sec_idx As Byte
Local Sec_count As Long
Cluster_begin_lba = Cluster_begin_lba * 512
Call Readsector(cluster_begin_lba )
Fsize = Fileinfo(8)
Start_cluster = Bpb_secperclus * 512
Start_cluster = Start_cluster + Cluster_begin_lba
End_cluster = Fsize
End_cluster = End_cluster + Start_cluster
Sec_count = Start_cluster
'Print Hex(cluster_begin_lba)
'Print Hex(sec_count)
'Print "end sector :" ; Hex(end_cluster)
'Print Hex(fsize )
Reset Cs
Dat = &H52
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Start_cluster , Msbx
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Start Watchdog
Shiftin Miso , Clk , Resp , Msbl
While Resp <> 0
Shiftin Miso , Clk , Resp , Msbl
Wend
Stop Watchdog
Start Watchdog
While Resp <> &HFE
Shiftin Miso , Clk , Resp , Msbl
Wend
Stop Watchdog
Do
Start Watchdog
While Resp <> &HFE
Shiftin Miso , Clk , Resp , Msbl
Wend
Stop Watchdog
For Sec_idx = 0 To 255
Shiftin Miso , Clk , Resp , Msbl
Pcml = Resp
Shiftin Miso , Clk , Resp , Msbl
Pcmh = Resp
Toggle Pcmh.7
Porta = Pcmh
Portc = Pcml
Waitus 2
Next Sec_idx
Shiftin Miso , Clk , Resp , Msbl
Shiftin Miso , Clk , Resp , Msbl
Shiftin Miso , Clk , Resp , Msbl
Sec_count = Sec_count + 512
'Print "current :" ; Hex(sec_count)
Loop Until Sec_count > End_cluster
'Loop Until Sec_count > 2139808
'Until Sec_idx > End_cluster
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftout Mosi , Clk , Dat , Msbl
End Sub
-
mau tanya nih,,,saya kan mau buat proyek pake mikrokontroler ATMEGA32 trus ngeluarin suara berformat WAV dari SD Card,,,sistemnya FAT,,,saya ambil dari elm-chan,,,nah yang mau saya tanyakan bagaimana cara memanggilnya???kalau untuk memanggil teks sudah bisa,,,saya bingung cara memanggil suaranya,,,setelah saya lompat pake "f_lseek" untuk mengabaikan headernya apa yang harus saya program lagi untuk memanggil byte suara sampai habis,,,apakah memakai f_read atau f_forward???kalau dibaca tutorialnya saya lebih prefer pakai f_forward karena langsung streaming dari SD Card ke output tanpa adanya buffer,,,mohon pencerahannya bagaimana contoh program untuk memanggil suara pakai syntax tersebut...soalnya kalau saya baca dari contohnya elm-chan jadi bingung,,,saya pakai Code Vision buat pemrogramannya,,,
saya mau bantu jawab buat agan yg stu ini...
maaf meskipun postingannya uda usang yng penting msh bisa bermanfaat buat orng lain...hehehehe...
kalo menurut saya, cara agan dian itu juga bener..tp ini cara saya sendiri...
kalo mau baca file atau baca karakter dari mmc/sdcard memakai f_read itu juga bisa..tp menurut saya masih terlalu ribet...
coba agan gunakan program berikut buat baca karakter dari file di mmc/sdcard..
void spi_init(void)
{
DDRB.0 = 1;
DDRB.2 = 1;
DDRB.3 = 0;
DDRB.1 = 1;
SPCR = 0b01011110 ;
SPSR = 1;
PORTB.0= 0;
}
char Command(char cmd, unsigned int AdrH, unsigned int AdrL, char CRCbits )
{
spi(0xFF);
spi(cmd);
spi((unsigned char)(AdrH >> 8));
spi((unsigned char)AdrH);
spi((unsigned char)(AdrL >> 8));
spi((unsigned char)AdrL);
spi(CRCbits);
spi(0xFF);
return spi(0xFF);
}
char mmc_init(void)
{
char i;
PORTB.0= 1;
for(i=0; i < 10; i++) spi(0xFF);
PORTB.0= 0;
if (Command(0x40,0,0,0x95) == 1)
{
lcd_gotoxy(0,0);
lcd_putsf("CMD0 sukses");
delay_ms(1000);
lcd_clear();
}
else
goto mmcerror;
st:
if (Command(0x41,0,0,0xFF) ==0)
{
lcd_gotoxy(0,0);
lcd_putsf("CMD1 sukses");
delay_ms(1000);
lcd_clear();
}
else
goto st;
SPCR = 0b01011100;
SPSR = 1;
return 1;
mmcerror:
lcd_gotoxy(0,0);
lcd_putsf("CMD0 Error!");
delay_ms(1000);
lcd_clear();
return 0;
}
char set_blok(unsigned int block)
{
if(Command(0x50,0,block,0xFF) != 0)
{
lcd_gotoxy(0,0);
lcd_putsf("Blok Set Error!");
delay_ms(1000);
lcd_clear();
return 0;
}
else
lcd_gotoxy(0,0);
lcd_putsf("Blok Set sukses");
delay_ms(1000);
lcd_clear();
return 1;
}
int ambil(void)
{
hi=0x000B;
lo=0x6600;
response=Command(0x51,hi,lo,0xFF);
if(response!=0)
{
lcd_gotoxy(0,0);
lcd_putsf("MMC: read error\n");
sprintf(lcd_buffer,"response = %d", response);
lcd_puts(lcd_buffer);
}
startToken = 0;
while(startToken == 0)
{
response = spi(0xFF);
sprintf(lcd_buffer,"response2 = %d", response);
lcd_puts(lcd_buffer);
delay_ms(10);
lcd_clear();
if (response == 0xFE) startToken = 1;
}
for(i=0; i < 512; i++) {
recvd = spi(0xFF);
}
spi(0xFF);
spi(0xFF);
lo=0x200+(unsigned long int)lo;
if(lo>0xFFFF){
lo=0;
hi++;
}
OCR1A=128;
return 0;
}
while(1)
{
ambl();
}
program diatas uda bisa digunakan baca mmc/sdcard
===cara kedua buat baca file berupa suara===
yang harus disiapin agan :
1.mikrophone buat mengisi suara ke software bisa buat sendiri ato beli..
2.software audacity ato ace of wav sama aja..
3.buat seting rekaman menjadi mono 8bit dan dengan frekuensi sampling 8000.
4.setelah selesai merekam, simpan file hasil rekaman dengan format (.wav) atau (.raw)
5.download software winhex untuk melihat alamat heksa pada mmc agan.
6.menyimpan file wav harus pada direktori yang tepat..(ane uda bisa dan harus pake bnyk rumus gan..kebanyakan kalo saya tulis d sinni..mbah gugel banyak kq..hehehehe...ato kalo mau email saya aja...)
7.mmc akan membaca file tiap 512 bit...
8.persiapan uda selesai sekarang keprogramnya gan...(programnya sama kayak baca karakter..tp beda nya harus ditambah PWM untuk conversi ke analognya..kalo pake rangkaian DAC R2R juga boleh..)
9.program baca file suara pada mmc :
int ambil(void)
{
hi=0x000B;
lo=0x6600;
response=Command(0x51,hi,lo,0xFF);
if(response!=0)
{
lcd_gotoxy(0,0);
lcd_putsf("MMC: read error\n");
sprintf(lcd_buffer,"response = %d", response);
lcd_puts(lcd_buffer);
}
startToken = 0;
while(startToken == 0)
{
response = spi(0xFF);
sprintf(lcd_buffer,"response2 = %d", response);
lcd_puts(lcd_buffer);
delay_ms(10);
lcd_clear();
if (response == 0xFE) startToken = 1;
}
for(i=0; i < 512; i++) {
recvd = spi(0xFF);
OCR1A=recvd;
delay_us(125);
}
spi(0xFF);
spi(0xFF);
lo=0x200+(unsigned long int)lo;
if(lo>0xFFFF){
lo=0;
hi++;
}
OCR1A=128;
return 0;
}
=============================================================
ane jelaskan yg penting gan...
hi=0x000B; //alamat awal direktori pada mmc saya bit high
lo=0x6600; // bit low
jadi kalau pada mmc alamat direktori nya jadi 0xB6600...
=======================================================================
for(i=0; i < 512; i++) { //1 sektor pada mmc hanya mampu membaca tiap 512 bit data.
recvd = spi(0xFF); // dengan menggunakan spi data dibaca dan ditampung ke recvd
OCR1A=recvd; //sebagai pengganti R2R saya menggunakan PWM timer 1 untuk konversi dari digital ke analog
delay_us(125); //delay yang saya gunakan agar suara terdengar seperti suara asli..
}
=====================================================================
lo=0x200+(unsigned long int)lo; // bagian program ini untuk pembacaan direktori multi read...tanpa program ini pembacaan direktori hanya akan
if(lo>0xFFFF){ // berulang ke sektor 1 terus....
lo=0; //
hi++; //
}//
OCR1A=128;//
===================================================================
cuma itu yang bisa saya bagi ke agan atau agan2 yang baca...
bisa tidaknya program diatas tergantung kerja keras dan usaha agan...
;D
-
alangkah baik nya ada rangkayan yg bisa di tampilkan (http://www.laymark.com/l/m/m141.gif)
-
alangkah baik nya ada rangkayan yg bisa di tampilkan (http://www.laymark.com/l/m/m141.gif)
Setuju.....buat para agan-agan yang jago mungkin gampang, tapi buat kita-kita yang pemula sulit apalagi list programnya panjang banget
Tampaknya para master masih tetap tidak rela berbagi pengetahuannya....masih banyak yang menyimpan-yimpan ilmunya...ternyata
-
alangkah baik nya ada rangkayan yg bisa di tampilkan (http://www.laymark.com/l/m/m141.gif)
Setuju.....buat para agan-agan yang jago mungkin gampang, tapi buat kita-kita yang pemula sulit apalagi list programnya panjang banget
Tampaknya para master masih tetap tidak rela berbagi pengetahuannya....masih banyak yang menyimpan-yimpan ilmunya...ternyata
saya tidak merasa jago, biasa saja tapi saya tertarik untuk merespon statement "tidak rela", menurut saya alangkah aneh nya bila ada sesuatu yang tidak sesuai dengan apa yang anda harapkan lalu mengambil kesimpulan seperti itu. seolah-olah ada bisa menilai seseorang dengan lengkap, apakah ada tau kesibukan org tsb, atau bahkan apa anda tau apakah orang tersebut masih dalam keadaan sehat dsb, berusahalah untuk selalu berfikir positif.
buat saya pribadi dalam membuat suatu project saya hampir tidak pernah menggambar rangkaian, semua rangkaian ada di PCB yang saya buat, sehingga menggambar skema tentu memakan waktu lagi, kalau salah karena salah no pin nanti malah di cap menjerumuskan, makanya untuk membuat skema benar2 perlu waktu khusus dan saya tidak sulit untuk melungkan waktu untuk itu
-
makai kata "tidak rela" lagi ah.. hiks otakku masih "tidak rela" klo diisi coding diatas.. mungkin ada materi yg lebih mudah dicerna dulu pak ?
buat pemanasan otakku yang beku ini. ini masih mending listingnya pendek.. (dibanding source code tugas akhir sistem informasi point of sales minimarket :p)
tahapan ilmu yg harus dilalui (lulus dulu di semester awal) , teknik digital, Pemrograman Dasar, baru masuk mata kuliah mikrocontroller..
coba yang ini http://avrpcm.blogspot.com/2010/11/playing-8-bit-pcm-using-any-avr.html
mampir ke blog nya pak purwanto nemu beberapa yang menarik untuk nglangi stress bikin LED dengan hanya satu batterai 1,5V http://www.bigclive.com/joule.htm
-
makai kata "tidak rela" lagi ah.. hiks otakku masih "tidak rela" klo diisi coding diatas.. mungkin ada materi yg lebih mudah dicerna dulu pak ?
buat pemanasan otakku yang beku ini. ini masih mending listingnya pendek.. (dibanding source code tugas akhir sistem informasi point of sales minimarket :p)
tahapan ilmu yg harus dilalui (lulus dulu di semester awal) , teknik digital, Pemrograman Dasar, baru masuk mata kuliah mikrocontroller..
coba yang ini http://avrpcm.blogspot.com/2010/11/playing-8-bit-pcm-using-any-avr.html
mampir ke blog nya pak purwanto nemu beberapa yang menarik untuk nglangi stress bikin LED dengan hanya satu batterai 1,5V http://www.bigclive.com/joule.htm
susah juga ya kalau otaknya sudah malas duluan dan mau yang gampang saja :)
di kasih komplit protes di kasih dikit nanti katanya pelit...