Download

5/01/2013

Pengertian Amplifier OTL BTL dan OCL


Istilah amplifier boleh dikatakan sudah memasyarakat di semua lapisan masyarakat, dari orang yang tingkat ekonominya rendah sampai tingkat ekonomi atas pasti memiliki. Begitu populernya amplifier sehingga banyak orang menyebut amplifier dengan kata yang lebih simpel, yaitu "ampli".

Secara teknik amplifier digunakan pada hampir semua peralatan elektronik mulai dari radio sampai satelit. Dalam sound system, amplifier adalah alat penguat signal audio seperti
dari kaset, VCD, tape dsb.
Power output suatu amplifier bervariasi mulai dari 5 Watt sampai ribuan Watt. Untuk hiburan di rumah power output 50 Watt sudah cukup memadai, tetapi untuk penggunaan di lapangan terbuka dibutuhkan power output yang lebih besar sesuai medan cakupan. Untuk public address 275 Watt sudah cukup, tetapi untuk konser musik mungkin 5000 Watt masih dianggap kurang meledak atau membahana. Terlepas dari masalah power output, amplifier yang baik harus mampu merespon frekuensi audio dari 20 - 20.000 Hz, karena telah kita ketahui bersama range pendengaran manusia adalah antara 20 – 20.000 Hz.

Kini tidak hanya power output-nya saja yang bermacam-macam, tetapi jenis-jenis dari amplifier pun telah bervariasi seperti OTL, BTL, OCL yang sudah ada banyak dipasaran. Dan setiap jenis tersebut memiliki kekurangan dan kelebihan masing-masing. Untuk lebih jelasnya Anda bisa memahami pada artikel berikut.

1. OTL (Output Transformer Less = keluaran tanpa trafo), yaitu rangkaian amplifier yang menggunakan elco sebagai ganti transformer, misalkan nilai 2200uf untuk amplifier yang memiliki watt besar. Umumnya tegangan rangkaianamplifier ini hanya + (positif) dan – (negatif / ground).

2. BTL (Bridge Transformator Less) , yaitu rangkaian Amplifier OCL yang digabung dengan metode Bridge (jembatan). Sehingga power outputnya menjadi 2 kali lipat dari power Rangkaian Amplifier OCL.
Misalkan : suatu amplifier memiliki power output 400 watt, maka jika dijadikan BTL power outputnya kira-kira akan menjadi 800 watt.

3. OCL (Output Capacitor Less = keluaran tanpa kapasitor), yaitu rangkaian amplifier yang memiliki skema rangkaian dari transistor/IC penguat final langsung ke speaker output (tanpa pelantara apapun). Umumnya tegangan amplifier ini simetris yaitu + (positif), 0 (nol), - (negatif).

Dahulu amplifier yang populer adalah jenis amplifier jenis OT (ada trafo keluaran untuk menyesuaikan impedansi ampli dengan speaker), karena banyak kelemahan digantikan OTL. OTL ada kelemahan juga, yaitu nada rendah (bass) sedikit tersaring, sehingga tidak keluar penuh, muncullah OCL yang jauh lebih prima dibanding amplifier sebelumnya.
Kelemahan dan kelebihan OTL dan OCL :

3/01/2013

Text to Bit Converter untuk merancang karakter dot matrix


Jika mengalami kebingungan untuk mendesain karakter dot matrix, saya kasi tools yg mungkin bermaanfaat untuk merubah karakter ke bit.





Mudah-mudahan membantu praktek belajar menulis di dot matrix yang tersedia di paket belajar mikrokontroler

2/28/2013

DISPLAY 7 SEGMEN + DADU DIGITAL dengan IC 4026

Bahan-Bahan :
<!--[if !supportLists]-->1. <!--[endif]-->IC 555
<!--[if !supportLists]-->2. <!--[endif]-->IC 4026
<!--[if !supportLists]-->3. <!--[endif]-->Resistor 10k ohm (1buah), 100Kohm (1 buah) atau diganti dengan Potensiometer 100k ohm, 220 ohm (7 buah bila perlu)
<!--[if !supportLists]-->4. <!--[endif]-->Kapasitor 10 uF (1 buah)
<!--[if !supportLists]-->5. <!--[endif]-->Tombol tekan / push button
<!--[if !supportLists]-->6. <!--[endif]-->Baterai 4.5V
<!--[if !supportLists]-->7. <!--[endif]-->Kabel Jumper secukupnya

Skematik :
Keterangan : perhatikan kaki IC yg tidak urut, sesuaikan nomer kaki pada skematik dengan kaki pin di IC sebenarnya

Langkah Merakit ke Breadboard :

<!--[if !supportLists]-->1. <!--[endif]-->Setelah paham merangkai percobaan 555 maka percobaan kali ini akan mudah saja tinggal mengikuti gambar skematik yang ditampilkan sebelumnya, dan hasil di breadboard seperti ini :




<!--[if !supportLists]-->2. <!--[endif]-->Pushbutton memiliki 4 kaki dimana ada 2 buah pasang kaki yg tersambung.
<!--[if !supportLists]-->3. <!--[endif]-->Jika tegangan baterai melebihi 6V, maka sebelum masuk ke 7 segmen diperlukan resistor 220 ohm atau lebih. Jika memakai 4.5 V resistor bisa tidak dipakai.
<!--[if !supportLists]-->4. <!--[endif]-->Putar-putar potensiometer untuk mendapatkan kecepatan penambahan digit yang diinginkan.
<!--[if !supportLists]-->5. <!--[endif]-->Jika kecepatan perubahan digit sangat cepat, maka rangkaian ini dapat digunakan sebagai “DADU ELEKTRONIK”. Jadi ketika tombol ditekan maka angka akan berhenti pada digit angka yang tidak kita duga sebelumnya.

2/27/2013

Tutorial Eagle Step By Step

Kali ini akan kita bahas mengenai routing pcb dengan menggunakan Eagle Cad Software. Software eagle adalah software cad paling umum digunakan kalangan pelajar, karena ada license yg bisa dibeli murah jika status masih pelajar/mahasiswa. Tapi "jamu" buat software ini banyak jadi silahkan ubek-ubek aja dunia maya(not Recommended)


1. Membuat Schematic Baru

Buatlah Nama project yg dikehendaki dilanjutkan dengan membuat schematic sesuai gambar berikut:



setelah itu akan muncul windows baru / worksheet tempat kita menggambar schematic


2. Menyusun Schematic diatas Editor

Langkah pertama adalah dengan memilih komponen yg digunakan melalui tombol "ADD" . Jika ada komponen yg digunakan sejenis dan berulang, hanya diperlukan pemilihan sekali saja selanjutnya bisa dicopy paste di editornya



contoh diatas jika kita ingin memilih komponen IC CMOS 4017



contoh diatas jika ingin menambah simbol supply GROUND

setelah semua komponen diletakkan di editor maka dilanjutkan dengan menghubungkan kaki-kaki komponen sesuai dengan keinginan. Toolbar sebelah kiri sangat membantu dalam pengaturan schematic, seperti ilustrasi berikut ini



klik gambar untuk memperbesar


beberapa komponen tidak mencantumkan kaki-kaki yg umum seperti VCC & GND (tapi di pcb ada) , kadang ini akan membuat bingung...jangan khawatir kita "INVOKE" saja melalui toolbar sesuai gambar berikut



3. Routing PCB

Setelah semua schematic disusun sesuai keinginan, lanjutkan menuju ke PCB routing dengan perintah File==>Switch to Board

Mulanya akan muncul PCB dengan kabel semrawut dan tanpa grid/kotak seperti gambar dibawah. Pindahkan semua komponen dengan :toolbal move + toolbar select + drag mouse ke semua komponen + klik kanan + Move group, ke dalam kotak PCB layout




Setelah itu susun komponen sesuai keinginan dan selanjutnya bisa membuat layout PCB secara AUTO dengan memilih tombol auto route dan memilih jumlah layer pcb yg diinginkan




klik untuk memperbesar


jika ingin kembali ke mode awal sebelum di routing maka tinggal ikuti urutan ...pilih ripup + pilih select + drag mouse ke komponen + klik kanan + pilih ripup group




4. Routing Manual

Terkadang routing auto akan menghasilkan routing yg aneh2 dan ga masuk akal. Untuk itu perlu dilakukan routing manual. Toolbar yg penting adalah "ROUTE", "RIPUP" , "VIA" dan "RATSNET" sesuai gambar dibawah . Untuk meroutingkan PCB klik toolbar ROUTE dan klik antara kaki komponen yg akan di sambung. Ukuran routing dapat dipilih di toolbar sebelah atas ( "width"). Jika routing manual tidak memungkinkan maka jurus VIA / Jumper dapat membantu dengan membuat "AIRWAYS" yg nantinya akan disolder dengan kabel pada bagian atas PCB



klik untuk memperbesar


untuk mempercantik PCB dan menghemat waktu "ETCHING", maka daerah2 yg kosong perlu diberikan suatu gambar polygon. Pada umumnya polygon juga mewakili sinyal yg common/dipake berulang di PCB, umumnya sih untuk menghubungkan semua sinyal ground. Untuk membuatnya gampang saja, dengan menggambar polygon disekitar komponen dan menamakannya dengan nama signal yg akan disambungkan. jika tidak diberi nama maka polygon akan berdiri sendiri.




dan ketika tombol RATSNET ditekan maka PCB akan menjadi terhubung seperti ini



tetapi permasalahannya antara polygon dan routing terlalu mepet...jangan khawatir, kita atur saja jarak antar routing melalui "DRC RULES"



setting DRC ini dapat disimpan dan dipanggil pada desain PCB selanjutnya




4. PrintOut PCB

Setelah PCB layout selesai, dilanjutkan dengan printing layout ke atas kertas , plastik transparansi, glossy dsb. Layer yg dipilih hanya BOTTOM, PADS, dan VIA




selanjutnya lakukan printing secara mirror (untuk cara setrika) atau disesuaikan dengan kebutuhan






2/26/2013

BIKIN PCB MURAH MERIAH tapi KUALITAS OK !



untuk membuat PCB home made, ada bermacam cara
bisa didapat di instructable.com , seabrek cara dibeber disana
tapi yang menurut saya mengeluarkan uang paling sedikit cara yg satu ini

1. Desain PCB melalui software CAD semacam Eagle layout atau sebangsanya
Tinggal googling aja, banyak tersedia EAGLE Layout Editor + kracknya

2. Print Hasil Layout PCB dengan LASER PRINTER, keatas kertas MAJALAH BEKAS. yang dipakai adalah kertas majalah (biasanya majalah bisnis) yang tipis & mengkilat. Majalah / Buletin TV kabel contoh yg paling gampang

3. Bila tidak ada printer laser, print di kertas biasa, kemudian Lakukan PhotoCopy diatas kertas majalah tadi

4. siapkan PCB polos ( 1 layer saja), bersihkan dari kotoran menggunakan kertas gosok halus

5. Panaskan SETRIKA, kemudian setrika kertas majalah yg sudah ada gambar PCB nya tadi ke atas tembaga PCB , tekan2, mungkin diperlukan trial & error beberapa kali dan perkirakan transfer sudah merata baru kita boleh selesai setrika.

6. Rendam PCB tadi di air hangat ( dingin juga boleh) sampai kertas tipis tadi mengelupas, hati2 agar tidak merusak jalur PCB. Pastikan semua kertas yg ada di LUAR JALUR bersih , sedangkan yang di atas jalur tidak masalah jika ada sisa kertas ( asal tidak meninggalkan serat2 berlebihan) . perbaiki jalur2 yang mungkin rusak/ tipis dengan spidol permanen.

7. Siap di etching ( pake Ferry Clorit ataupun larutan HCL + H202)

8. Untuk ferry clorit, gunakan air hangat (jangan panas), perlu goyang2 tempat/ wadah etchingnya, tambahkan feri clorit ke larutan jika kekuatan oksidasinya berkurang, larutan sisa bisa disimpan & dipakai lagi untuk proses etching di lain waktu ( tambah feri clorit baru sedikit saja).

9. HCL yg umum dijual = 30 %, H202 < 5 % , jika kondisi seperti ini bisa di gunakan komposisi 1:1 atau 3:4 , ingat tuang HCL ke H202, jangan sebaliknya. jika komposisi H202 > 10 %, perlu penambahan air agar tidak terlalu cepat proses oksidasinya ( merusak masking )

10. HCL + H202 hanya sekali pake, sebab tidak bisa disimpan dalam botol

11. setelah proses etching dirasa selesai, bilas PCB dengan air hangat atau air mengalir (kran)

12. PCB siap di bor, setelah semua lubang komponen di bor, bersihkan masking dengan Aceton / thiner CAT A. Agar PCB tampak bersih & tidak beroksidasi dengan udara, bisa dilaminasi dengan lapisan perak (mahal), liquid tin ( mahal & jarang ada), atau di lapisi ( tipis) dengan cat semprot (lacquer) transparan ( 10 ribu juga dapet)

13. PCB siap di solder

2/25/2013

BERKENALAN DENGAN AVR MICROCONTROLLER

avr-chip.jpg (230×191)
Lupakan MC 89S51 karena sudah outdate, walau masih tersedia di pasar
kenapa ??

1. 89c51 memang dasar sekali, tapi untuk fungsi2 yang memerlukan RAM, EEPROM, COUNTER, ADC,PWM dsb dibutuhkan komunikasi ke IC tersendiri

2. AVR merupakan teknologi MC yang langsung memiliki beberapa fungsi sekaligus dalam 1 chip (Harvard architecture) RAM, EEPROM, ADC, PWM COUNTER, UART, SPI, I2C dsb. gabung dalam 1 IC tinggal pilih IC MC yang sesuai dengan kebutuhan

3. Pemrograman secara SPI, bisa mencoba produk 200 rb-an di http://www.innovativeelectronics.com/

4. AVR yang cocok buat belajar :
- ATtiny 2313(15rb) ==> umum, kecil, simple, realible
- ATMega 8515(35rb) ==> jika butuh kapasitas agak besar
- ATMega 8535 (40rb) ==> tambah ADC 8 ch
- ATMEGA128(70rb) ==> jika butuh I/O yang banyak & memori gede

5. Bikin Progam "Hello world" , dengan menyalakan LED berjalan bolak-balik dengan MC AtTiny 2313, menggunakan AVR studio(gratis) & WInAVR(krack) sehingga pemrograman full dalam bahasa C (GCC)

6. Hubungkan PORTD dari attiny2313 dengan LED 8 buah ( tambahkan Resistor 470 ohm tiap led untuk pembatas arus)


#include <avr/io.h>
#include <avr/delay.h>


int main (void)
{
// set PORTD sebagai output
DDRD = 0xFF;
int i ;


while(1) {
for(i = 1; i <= 128; i = i*2)
{
PORTD = i;
_delay_ms(1000);
}
for( i = 128; i > 1; i -= i/2)
{
PORTD = i;
_delay_ms(1000);
}

}
}



Download file "hex" menuju AVR melalui SPI port , alat yg digunakan bisa beragam...googling aja banyak kok yg gampang + murah bahan2nya

Hasilnya :


2/24/2013

DOT MATRIX


Pada dasarnya DOT matrix adalah Display LED yg disusun sedemikian rupa sehingga untuk menghidupkan led ke (x,x) dibutuhkan kombinasi tegangan antara Pin baris & kolom


The 5x7 LED matrixThe drawing from the datasheet

Kemudian untuk mempermudah kontrol dan menghemat pin maka diperlukan proses scanning ( biasanya kolom...) sedangkan pada baris diberikan bit sesuai huruf/karakter yang akan ditampilkan yang bersesuaian dengan posisi scanning.

Scanning untuk kolom dimaksud memberikan "1" high ( untuk common katoda) atau"0" untuk common anoda , untuk kolom lainnya diberi nilai negasi dari kolom yg diberi nilai 1 tadi .....begitu selanjutnya untuk kolom berikutnya sampai kolom terakhir dari rangkaian led matrix..dan berulang dari depan lagi.
Proses ini dilakukan sangat cepat sehingga mata kita melihatnya tetap sebagai suatu karakter yg diam.

misalnya ingin menampilkan huruf A , secara umum digambarkan sebagai berikut:


0000000
0000000
0000000
0000000
0000000
0000000
0000000


dari gambar diatas logikanya seperti ini :

- saat kolom pertama ( scan kolom 1 = 1 / high/2.4 v) maka bit yg diberi pada baris berupa "1110000", sehingga jika ketemu 1 vs 1 ga ada arus mengalir, jadi LED mati, jika 1 ketemu 0 maka arus mengalir, led menyala

- begitu juga untuk kolom kedua, ketika kolom kedua diberi tegangan maka pada baris bit yg diberikan adalah "1101011"

- Dan seterusnya, ketika kolom nya mencapai ujung maka akan diulang ke kolom 1 lagi

- Untuk melakukan scanning biasanya dilakukan dengan memanfaatkan shift register, atau paling sederhana dengan menggunakan IC 4017 yang di cascade menjadi led berjalan yang panjang. (buka di sini )

2/23/2013

Jam Sederhana Dengan Attiny 2313

Kali ini kita akan menggunakan 4 buah 7 segment untuk membuat jam sederhana


"wahhh..kalo banyak 7 segmentnya, ngabisin banyak port dong ?"



Jangan khawatir, kita pake teknik " SCANNING", artinya kita hidupin segment satu persatu, tiap segment diparalel saja...tp kita hidupin dengan memberikan switch/saklar ke common port 7segment yg dikontrol oleh port micro ..dan scanningnya cepetttt...sehingga mata kita melihatnya seperti nyala biasa aja.

jadi untuk bikin 7-segment 4 buah, diperlukan 7 port display(diparalel) + 4 port control

rangkaiannya seperti berikut :

klik untuk memperbesar gambar

Biasanya untuk display yg agak besar, kita perlu transistor untuk mengatur scanning, tp karena contoh kali ini memakai segment yg kecil maka tidak memerlukan kontrol memakai transistor ( coba pake transistor dijamin nyalanya redup !!)


Prinsip jam kali ini menggunakan prinsip DELAY, jadi tidak terlalu akurat.
Sebenernya mau seh membagi ilmu untuk jam yg super akurat, tapi ntar aja yahh..soalnya memerlukan pengetahuan mengenai "Timer/Counter" dari microcontroller

source code nya sebagai berikut :

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int jam=0, min=0, detik=0; //variable global untuk menyimpan data2 waktu

void segmen (int angka)

{

switch (angka)
{

case 0 : { PORTB =0b1000000; break ; }
case 1 : { PORTB =0b1111001; break ; }
case 2 : { PORTB =0b0100100; break ; }
case 3 : { PORTB =0b0110000; break ; }
case 4 : { PORTB =0b0011001; break ; }
case 5 : { PORTB =0b0010010; break ; }
case 6 : { PORTB =0b0000010; break ; }
case 7 : { PORTB =0b1111000; break ; }
case 8 : { PORTB =0b0000000; break ; }
case 9 : { PORTB =0b0010000; break ; }
case 10 : { PORTB =0b1111111; break ; } //blank biar ga berbayang
}


}


void clock (void) //fungsi penambah waktu

{

detik ++; //jika fungsi dipanggil maka var detik ditambah

if ( detik == 60) // tambahkan menit jika 60 detik
{ detik=0; //untuk kembali ke 0
min++;
}

if ( min == 60) // tambahkan jam jika 60 menit
{ min = 0; //untuk kembali ke 0
jam++ ;
}

if (jam == 24) jam=0; //untuk kembali ke 0


}



int main(void)

{

int counter=0; //variabel delay
int digit; //variabel digit yang ditampilkan


// Port untuk display 7 segment
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6);
//port untuk scanning ( PD0-4) dan dot ":" (PD6)
DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3) |(1<<PD6);
//tombol untuk nambah jam/menit
DDRD &= ~(1<<PD4) & ~(1<<PD5) ;

PORTD = (1<<PD6) ; // blink untuk ":"


while(1)

{



counter++ ; //bikin delay nambah terusss

// sesuaikan nilai max counter dengan detik yg pas, tentunya tidak akurat
if(counter == 30) { counter =0 ; clock(); }

// nilai 1/2 dari counter untuk blink ":"
if(counter == 15) PORTD ^=(1<<PD6) ;

else{

segmen(10); // kasi display "mati' agar tidak berbayang

//digit pertama

digit = jam/10;
PORTD |= (1<<PD0); // 7 segment no1 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 2

segmen(10);
digit = jam%10;
PORTD |= (1<<PD1); // 7 segment no2 hidup..yg laen mati
PORTD &= ~(1<<PD0) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 3

segmen(10);
digit = min/10;
PORTD |= (1<<PD2); // 7 segment no3 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD0) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 4

segmen(10);
digit = min%10;
PORTD |= (1<<PD3); // 7 segment no4 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD0) ;
segmen(digit);
_delay_ms(5);



}

if (bit_is_set(PIND, PIND4)) //tombol nambah jam
{
jam++;
if(jam==24) jam =0;
_delay_ms(100);

}

if (bit_is_set(PIND, PIND5)) //tombol nambah menit
{
min++;
if(min==60) min=0;
_delay_ms(100);

}



}

return 0;

}


jika ingin mengetest/kalibrasi delay detik, ganti salah satu digit untuk menampilkan detik

//digit pertama

digit = detik/10;
PORTD |= (1<<PD0); // 7 segment no1 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 2

segmen(10);
digit = detik%10;
PORTD |= (1<<PD1); // 7 segment no2 hidup..yg laen mati
PORTD &= ~(1<<PD0) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);


hasilnya dapat dilihat seperti berikut :


2/22/2013

Bermain Dengan Dot Matrix "LoveHurt"

Siapkan bahan-bahan seperti berikut:




Attiny 2313
Led matrix 7x5
R 10K
Diode 4148
PCB lobang
Header 2x5 buat ISP programmer (optional - Bisa diprogram di Breadboard)
Socket 20 untuk ATtiny, dan soket 14 ( dibelah dua ) buat tempat Led matrix

rangkaiannya seperti ini :



Kemudian komponen dirangkai diatas PCB lobang, ato bisa juga memakai bahan lain( disesuaikan dengan tempat yg mau di pake, misale kotak hadiah , papan tripleks dan lain sebagainya)


letakkan LED MATRIX sesuai dengan SOCKET IC yg dibelah tadi


karena ga ada baterai ( punya tempatnya doang) jadi pake adaptor 3 Volt aja



Script code dalam Bahasa C /WinAvr seperti berikut:


#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h> 
#include <string.h>
#include <avr/eeprom.h>

//Progmem simpannya di FLASH memory

const char love1[] PROGMEM =
{
0b0011110,
0b0100001,
0b1000010,
0b0100001,
0b0011110

};

const char love2[] PROGMEM =
{
0b0001100,
0b0010010,
0b0100100,
0b0010010,
0b0001100

};

const char L[] PROGMEM ={0x7f, 0x7f, 0x40, 0x40, 0x20}; 
const char O[] PROGMEM ={0x3e, 0x7f, 0x41, 0x41, 0x3e};
const char V[] PROGMEM ={0x3f, 0x7e, 0x40, 0x20, 0x1f};
const char E[] PROGMEM ={0x7f, 0x7f, 0x49, 0x49, 0x41};
const char H[] PROGMEM ={0x7f, 0x7f, 0x08, 0x08, 0x7f};
const char U[] PROGMEM ={0x3f, 0x7f, 0x40, 0x40, 0x3f};
const char R[] PROGMEM ={0x7f, 0x7f, 0x11, 0x29, 0x46};
const char T[] PROGMEM ={0x03, 0x03, 0x7f, 0x03, 0x02};

const char creature[]={0x4e, 0x31, 0x35, 0x31, 0x4e}; //simpan di memory/RAM aja

uint8_t EEMEM tengkorak[5]= {0x1e, 0x75, 0x61, 0x75, 0x1e}; //simpan di EEPROM

uint8_t EEMEM pacman[5]= {0x26, 0x67, 0x67, 0x7f, 0x3e}; //simpan di EEPROM


char dotnya[5],scrolnya[7];



void tulis(uint8_t lama)
{
  uint8_t a,b;

for(a=0 ; a<lama ; a++)
{
 for(b=0 ; b<5 ; b++)   
  
{

PORTB = ~(1<<b) ;
PORTD = dotnya[b];
            _delay_ms(2);

     
}

}



}


void geser(uint8_t lama)
{
  uint8_t a,b;

 for(a=0 ; a<11 ; a++)   
  
{

  if( a<6) 
   { 
 for(b=0 ; b<(5-a) ; b++)  dotnya[b]=0x80;
              for(b=(5-a); b<5 ;b++) dotnya[b]=scrolnya[b-5+a];
 
 tulis(10);
             
             }
  else if (a==6) tulis(lama);

  else 
             {  for(b=0 ; b<11-a ; b++) dotnya[b]=scrolnya[a-5+b];
   for(b=(11-a); b<11 ;b++) dotnya[b]=0x80;  
 
                tulis(10);
              }

          }
 
   
                
     

 
}

void naik (uint8_t lama)

{
{  uint8_t q,step=0;
  
  
  while(step!=16)
   {
if( step <8)
  {   
for(q=0 ; q < 5 ; q++) dotnya[q] = scrolnya[q] << (7 - step) ; 

           tulis(10);
        } 
   
    else if (step == 8)
  {    
        tulis(lama); 

       }      
else 
  {   
         for(q=0 ; q < 5 ; q++)  dotnya[q] = scrolnya[q] >> (step - 7) ;  
          
  tulis(10);

     step++; 

}    

}




}


int main(void)
{
DDRD = 0b1111111; // untuk baris
DDRB = 0b11111;  // untuk kolom

PORTD =0; // Set all pins low
PORTB =0b11111; //matikan layar
    
    


while(1)
{
// yang ini nulis langsung 
  
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);     

//yang ini pake function geser 

strncpy_P(scrolnya,L,5);
     geser(50);
strncpy_P(scrolnya,O,5);
     geser(50);
strncpy_P(scrolnya,V,5);
     geser(50);
strncpy_P(scrolnya,E,5);
     geser(50);
strncpy_P(scrolnya,H,5);
     geser(50);
strncpy_P(scrolnya,U,5);
     geser(50);
strncpy_P(scrolnya,R,5);
     geser(50);
strncpy_P(scrolnya,T,5);
     geser(50);

//geser ambil dari RAM

strncpy(scrolnya,creature,5);  //tanpa _P karena ambil di RAM
     naik(50);

//ambil dari eeprom ..mengirit..

     eeprom_read_block((void*)&scrolnya,(const void*)&tengkorak, 5); 
naik(50);

     eeprom_read_block((void*)&scrolnya,(const void*)&pacman, 5); 
geser(50);

}

return 0;
}


Script code diatas dibuat dalam mode FLASH, RAM, dan EEPROM, jadi ketika download program ke IC harus memprogram FLASH dulu kemudian dilanjutkan dengan EEPROM.
FLASH extensinya .hex sedangkan isi EEPROM extensinya .eep



hasil akhirnya seperti di video berikut :




SELAMAT MENCOBA

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 !!

2/20/2013

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
Newer Posts Older Posts Home
Aulia DirUt. Powered by Blogger.
 

Followers

 

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