Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Kamis, 17 Januari 2013

BERMAIN DENGAN TV PART #3 - OSD (Composite Video Text Overlay) dengan Attiny2313




Text Overlay atau On Screen Display (OSD) merupakan fitur yang umum dijumpai pada televisi modern. Gambar composite (AV in) dapat ditumpuk dengan text seperti text berjalan (scroll text / crawler) , logo , jam dan berbagai macam sesuai keinginan. Bagaimana cara menimpa gambar video dengan text akan kita bahas disini, dan diharapkan membaca penjelasan mengenai dasar-dasar bermain televisi menggunakan microcontroller disini:  PART#1  PART#2  JAM TV



Courtesy of  VIENA WIRELESS SOCIETY 


Gunakan rangkaian yg terhubung dengan AIN saja, yg di dekat TX RX diabaikan saja


Pada web aslinya yang digunakan ic microcontroller  ATMega8 ,prinsip utamanya memanfaatkan analog komparator untuk mendeteksi sinkronisasi vertikal & horisontal dari sinyal input video composit (semisal dari kamera atau dvd).


Pada script di web asli dijelaskan bahwa yg digunakan video NTSC..karena di indonesia menggunakan PAL maka saya ubah script menjadi PAL dan menggunakan ATTINY



dari gambar ic attiny 2313 kita akan menggunakan pin AIN0 dan AIN1 serta pin MOSI, dan beberapa pin digunakan sebagai tombol seperlunya, rangkai sesuai gambar asli. gunakan nilai komponen sesuai catatan dan dengan bereksperimen maka akan didapat efek2 yg tidak diduga seperti warna text, warna latar dsb.


untuk itu kita bahas script satu persatu ...


>>> Header <<



#define F_CPU 20000000UL //xtal 20MHz

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

#include <avr/pgmspace.h>

#include <avr/sleep.h>





#define FONTHEIGHT 12 //panjang text



//rumus dan variabel syncronisasi

#define HSYNC PORTB=0;

#define GREY PORTB=0x80;

#define COL(r) textnya=word[r][fontline];



static uint8_t fontline = 0;

static uint8_t fontzoom = 0;

static uint16_t rasterline=0;



// ARRAY untuk tulisan nomer 0,1,2 dst



const unsigned char font[12][FONTHEIGHT] PROGMEM = { 

   {

 0b00000000,

 0b01111100,

 0b11000110,

 0b11001110,

 0b11011110,

 0b11010110,

 0b11110110,

 0b11100110,

 0b11000110,

 0b01111100,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00010000,

 0b00110000,

 0b11110000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b11111100,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b11001100,

 0b00001100,

 0b00011000,

 0b00110000,

 0b01100000,

 0b11001100,

 0b11111100,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b00001100,

 0b00001100,

 0b00111000,

 0b00001100,

 0b00001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00001100,

 0b00011100,

 0b00111100,

 0b01101100,

 0b11001100,

 0b11111110,

 0b00001100,

 0b00001100,

 0b00011110,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b11111100,

 0b11000000,

 0b11000000,

 0b11000000,

 0b11111000,

 0b00001100,

 0b00001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00111000,

 0b01100000,

 0b11000000,

 0b11000000,

 0b11111000,

 0b11001100,

 0b11001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b11111110,

 0b11000110,

 0b11000110,

 0b00000110,

 0b00001100,

 0b00011000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b11001100,

 0b11101100,

 0b01111000,

 0b11011100,

 0b11001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b11001100,

 0b11001100,

 0b01111100,

 0b00011000,

 0b00011000,

 0b00110000,

 0b01110000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00000000,

 0b00000000,

 0b00110000,

 0b00110000,

 0b00000000,

 0b00000000,

 0b00110000,

 0b00110000,

 0b00000000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 }};





//variabel pelengkap



uint8_t word[7][12];

int y;

uint8_t jam,menit,detik,textnya,tick;







>>> timer untuk horisontal sync PAL (64us) <<


void timer_init(void){



 TCCR1B |= (1<<WGM12);

 TIMSK |= (1<<OCIE1A);

 OCR1A = 1280; //64*16;

 TCCR1B |= (1<<CS10);



}





>> geser2 bit untuk menampilkan angka dari Array <<



void geser(void)

{ 

PORTB = (textnya  & 0x80) +0x8  ;

textnya <<=1;

PORTB = (textnya  & 0x80) +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)  +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)  +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)  +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)   +0x8;

textnya <<=1;

PORTB = (textnya  & 0x80)   +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)   +0x8 ;



}





>> proses tulis tiap 1us dari frame horisontal 64us <<




void tulis(void){



//31 & 43 adalah batas tinggi karakter 12 scan/rasterline/vsync

//y adalah posisi rasterline(Vsync) yg sedang ditulis

 if( rasterline > (31+y) && rasterline <= (43+y) ) {

  _delay_us(8);

    COL(0);

    geser();

    COL(1);

    geser();

    COL(2);

    geser();

    COL(3);

    geser();

    COL(4);

    geser();

    COL(2);

    geser();

    COL(5);

    geser();

    COL(6);

    geser();

       PORTB=0;

      _delay_us(1);

  fontline++; //pindah ke array selanjutnya

 } 

//jika tidak menulis 

   else { 

  _delay_us(8);

   fontline = 0;

  fontzoom=0;

   }



// yang ini batas scannline trus bisa sisipkan proses

//      memasukkan data ke memory 

//  sesuaikan karena kaskus merubah text &word; (hilangkan ' ; ') 

 if( rasterline > 311 )

  { memcpy_P(&word;[0],&font;[jam/10],12);

   memcpy_P(&word;[1],&font;[jam],12);

   memcpy_P(&word;[2],&font;[10],12);

   memcpy_P(&word;[3],&font;[menit/10],12);

   memcpy_P(&word;[4],&font;[menit],12);

   memcpy_P(&word;[5],&font;[detik/10],12);

   memcpy_P(&word;[6],&font;[detik],12);

 

      }

}



// interupt 64us 

ISR (TIMER1_COMPA_vect) {



rasterline = 0;



}



>> comparator untuk mendeteksi awal Vsync dan Hsync <<



SIGNAL(SIG_COMPARATOR)



{ //trik mendeteksi hsync dan vsync dengan melihat lama blanking



 TCNT1=0; // reset timer

 while(TCNT1<70); // wait 5us to see if H or V sync



 if(!((ACSR>>ACO)&1)) { // its an H sync

  TCNT1=0; // reset timer

  rasterline++;

  tulis();

 }

 else { // this a V sync

  rasterline=0;

    

//sekalian aja ditambah timer untuk nambah detik

  tick++;

    if(tick >= 200){

    tick=0;

       detik++;

    if(detik==60){

      menit++;

   detik=0;}



       if(menit==60){

    menit=0;

    jam++;}

    if (jam==24) jam=0;

  }

 }

}  





>> Tombol untuk ubah jam dan geser2 posisi jam <<




void tombol(void)

{

if(bit_is_clear(PIND, PIND3)) 

{

jam++;



if(jam == 24) jam=0;



detik=0;

_delay_ms(200);

}



else if(bit_is_clear(PIND, PIND4))

{

menit++;  



if(menit == 60) menit =0;





detik=0;

_delay_ms(200);

}



else if(bit_is_clear(PIND, PIND5)) //naik

{

y-=3;



if(y<1) y=1;



_delay_ms(200);

}



else if(bit_is_clear(PIND, PIND6)) //turun

{

y+=3;



if(y>300) y=300;



_delay_ms(200);

}






>> main program<<




int main() {

tick=0;

jam=22;

menit=19;

detik=44;

rasterline=0;

y=0; //variable posisi text

    



    ACSR = (1<<ACIE)|(1<<ACIS0)|(1<<ACIS1);  //analog comparator

    DDRD &=~(1<<PD3) & ~(1<<PD4)&~(1<<PD5) & ~(1<<PD6) ; //tombol

    

  // data text dan MISO, PB0 pada web asli dirubah jadi PB3 attiny 

    DDRB |= (1<<PB7)|(1<<PB3);

  



        timer_init(); //idupin timer

    

 set_sleep_mode(SLEEP_MODE_IDLE); //menghemat tenaga



 sei();



 for( ;; )tombol();

}





rangkaian ini cocok buat nambahin text ke kamera CCTV murah yg ga ada textnya, jadi bisa ditambahin jam atau text penanda nomer kamera




SELAMAT MENCOBA
Share:

1 komentar:

  1. as. mas bisa minta program untuk USB'y ? menggunakan mikrokontroler attiny 2313 ?

    BalasHapus

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (27) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (75) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika