- 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)
#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); }
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 */ 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; }
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