Siapkan Bahan-bahan berikut ini:
- Micro-AVR ATTiny 2313
- Breadboard
- Power suply 5v , atau adaptor 12v dan diregulasi 7805
- Resistor 10K, 470
- Tombol push button 2 buah
- Xtal 20Mhz + capasitor 22pF
- Programer AVR + header isp (2 x 10)
- Pesawat TV yg nganggur (pastikan tidak bentrok dengan jadwal mama nonton tv)
Kemudian skematik yg digunakan seperti gambar berikut :
Klik pada gambar buat memperjelas gambar
*) Rangkaian sama persis dengan project pakman hanya tombol yg digunakan berada pada INT0 dan INT1
Kita akan breakdown scriptnya secara satu persatu agar pembaca semakin mengerti (atau tambah mumet .....mungkin looo). SIlahkan Baca Penjelasan disela-sela script.
>>> Header <<
>>> TIMER <<
#define F_CPU 20000000UL //Frekuensi xtal yg digunakan, ubah fusebit untuk mengaktifkan #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #define FONTHEIGHT 12 //Tinggi font yg diwakili lebar array font #define HSYNC PORTB=0; //PORTB=0 sebagai bit sinkronisasi horizontal atau penghasil 0 volt #define BLACK PORTB=1;//PORTB=0 sebagai warna putih //Berikut ini rumus untuk menampilkan warna dot putih di televisi berdasarkan array #define COL(r) textnya=word[r][fontzoom]; static uint8_t fontline = 0; //variabel fontline static uint8_t fontzoom = 0; //variabel zoom font untuk besar karakter yg ditampilkan //BERIKUT INI ARRAY DOT YG MEWAKILI ANGKA 0 - 9 : const unsigned char font[12][FONTHEIGHT] PROGMEM = { { //0 0b00000000, 0b01111100, 0b11000110, 0b11001110, 0b11011110, 0b11010110, 0b11110110, 0b11100110, 0b11000110, 0b01111100, 0b00000000, 0b00000000, }, {//1 0b00000000, 0b00010000, 0b00110000, 0b11110000, 0b00110000, 0b00110000, 0b00110000, 0b00110000, 0b00110000, 0b11111100, 0b00000000, 0b00000000, }, {//2 0b00000000, 0b01111000, 0b11001100, 0b11001100, 0b00001100, 0b00011000, 0b00110000, 0b01100000, 0b11001100, 0b11111100, 0b00000000, 0b00000000, }, {//3 0b00000000, 0b01111000, 0b11001100, 0b00001100, 0b00001100, 0b00111000, 0b00001100, 0b00001100, 0b11001100, 0b01111000, 0b00000000, 0b00000000, }, {//4 0b00000000, 0b00001100, 0b00011100, 0b00111100, 0b01101100, 0b11001100, 0b11111110, 0b00001100, 0b00001100, 0b00011110, 0b00000000, 0b00000000, }, {//5 0b00000000, 0b11111100, 0b11000000, 0b11000000, 0b11000000, 0b11111000, 0b00001100, 0b00001100, 0b11001100, 0b01111000, 0b00000000, 0b00000000, }, {//6 0b00000000, 0b00111000, 0b01100000, 0b11000000, 0b11000000, 0b11111000, 0b11001100, 0b11001100, 0b11001100, 0b01111000, 0b00000000, 0b00000000, }, {//7 0b00000000, 0b11111110, 0b11000110, 0b11000110, 0b00000110, 0b00001100, 0b00011000, 0b00110000, 0b00110000, 0b00110000, 0b00000000, 0b00000000, }, {//8 0b00000000, 0b01111000, 0b11001100, 0b11001100, 0b11101100, 0b01111000, 0b11011100, 0b11001100, 0b11001100, 0b01111000, 0b00000000, 0b00000000, }, {//9 0b00000000, 0b01111000, 0b11001100, 0b11001100, 0b11001100, 0b01111100, 0b00011000, 0b00011000, 0b00110000, 0b01110000, 0b00000000, 0b00000000, }, {//: 0b00000000, 0b00000000, 0b00000000, 0b00110000, 0b00110000, 0b00000000, 0b00000000, 0b00110000, 0b00110000, 0b00000000, 0b00000000, 0b00000000, }, {//blank 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, }}; uint8_t word[7][12]; //array dari dot int tick; //variabel untuk mendapatkan pulse tiap sync uint8_t jam,menit,detik,textnya;//variabel jam dan text
>>> TIMER <<
void timer_init(void){ //timer untuk menentukan pewaktu Hsync 64us TCCR1B |= (1<<WGM12); TIMSK |= (1<<OCIE1A); OCR1A = 1280; //64 (us)* 20(Mhz) sesuaikan dengan xtal yg dipakai TCCR1B |= (1<<CS10); }
>>>GESER PER PIXEL <<
void geser(void) { uint8_t a; //loop untuk menggeser Array angka yg ditampilkan dalam 64 us for(a=0;a<8;a++){ PORTB = (textnya & 0x81) + 1; textnya <<=1; asm("nop"); asm("nop"); asm("nop"); //sesuaikan banyak asm("nop"); dengan lebar karakter yg diinginkan }
>>>TIMER INTERRUPT dan RASTER <<
/* Timer interrupt */ ISR (TIMER1_COMPA_vect) { //64 us static uint16_t rasterline=0; HSYNC; //mulai h sync //tulis jika diantara line 100 dan 160 if( rasterline > 100 && rasterline <= 160 ) { _delay_us(4); BLACK; _delay_us(8); asm("nop"); asm("nop"); asm("nop"); //tampilkan dot putih(1) atau hitam(0)sesuai array gambar angka COL(0); //tampilkan puluhan jam geser(); COL(1); //tampilkan satuan jam geser(); COL(2); //tampilkan : geser(); COL(3);//tampilkan puluhan menit geser(); COL(4);//tampilkan satuan menit geser(); COL(2);//tampilkan : geser(); COL(5);//tampilkan puluhan detik geser(); COL(6);//tampilkan satuan detik geser(); fontline++; //tambahkan line / pindah raster selanjutnya if(fontline % 6 ==0)fontzoom++; // ubah angka 6 untuk mengatur tinggi karakter yg tampil di tv , fontzoom menyatakan berapa jumlah line raster yg akan ditampilkan (sama) sebelum menuju ke array baris karakter selanjutnya. semakin lama ditampilkan maka karakter akan semakin memanjang. sesuaikan nilai if di atas ( if( rasterline > 100 && rasterline <= 160 ) ) } //yang ini bagian Vertical sync, hanya menggunakan raster genap saja, karena efek kelembaban mata tidak perlu menampilkan karakter saat raster ganjil (menghemat memory) else if( rasterline >= 0 && rasterline < 5 ) { _delay_us(27); BLACK; _delay_us(5); HSYNC; _delay_us(27); BLACK; } else if( (rasterline >= 5 && rasterline <= 10) ) { _delay_us(2); BLACK; _delay_us(28); HSYNC; _delay_us(2); BLACK; } else if( rasterline >311-6 ) { _delay_us(2); BLACK; _delay_us(28); HSYNC; _delay_us(2); BLACK; } else { //yang ini mereset nilai array karakter _delay_us(3); BLACK; fontline = -1; fontzoom=0; } rasterline++; //bagian dibawah ketika layar ga tampil maka pindahkan nilai waktu if( rasterline > 311 ) { rasterline = 0; memcpy_P(&word[0],&font[jam/10],12); memcpy_P(&word[1],&font[jam%10],12); memcpy_P(&word[2],&font[10],12); memcpy_P(&word[3],&font[menit/10],12); memcpy_P(&word[4],&font[menit%10],12); memcpy_P(&word[5],&font[detik/10],12); memcpy_P(&word[6],&font[detik%10],12); } //yang ini mengakali nilai 1 detik , karena resource timer termakan oleh proses sinkronisasi tick++; if(tick == 15625){ //ubah nilai tick sehingga pas 1 detik tick=0; detik++; if(detik==60){ menit++; detik=0;} if(menit==60){ menit=0; jam++;} if (jam==24) jam=0; } }
>>>TOMBOL <<
SIGNAL (SIG_INT0) //Tombol Tambah Jam { jam++; if(jam == 24) jam=0; detik=0; } SIGNAL (SIG_INT1)// Tombol Tambah Menit { menit++; if(menit == 60) menit =0; detik=0; }
>>>MAIN PROGRAM <<
int main() { tick=0; jam=00; menit=00; detik=00; MCUCR |= (1<<ISC01) |(1<<ISC11) ; // interupt tombol fall edge GIMSK |= (1<<INT0) |(1<<INT1); //aktifkan interrupt 0 dan 1 DDRB = (1<<PB7)|(1<<PB0); //PB0=1K, PB7=470 ohm timer_init(); //hidupkan timer sei(); // aktifkan interrupt for( ;; ); //muter terussssss }
>>>HASILNYA <<
SELAMAT MENCOBA
kalo interfacenya menggunakan VGA lalu ke monitor bisa ngga yah gan? :)
BalasHapusbisa kalo pake VGA...googling aja banyak..lagian kalo VGA bia bikin warna-warni
BalasHapuspernah bikin ngga gan?
BalasHapus