- uint8_t eeprom_read_byte (const uint8_t *addr)
- void eeprom_write_byte (uint8_t *addr, uint8_t value)
- uint16_t eeprom_read_word (const uint16_t *addr)
- void eeprom_write_word (uint16_t *addr, uint16_t value)
- void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)
- void eeprom_write_block (const void *pointer_ram, void *pointer_eeprom, size_t n)
Kamis, 20 Juni 2013
Tutorial: Menghemat memory Statis dengan PROGMEM dan EEPROM
Anda mungkin akan terkejut ketika melihat kenyataan terbatasnya jumlah memory yang disediakan oleh ic avr yang tersedia di pasaran. Bayangkan saja ATTINY2313 hanya memiliky 128 byte memory (lebar 8 bit) sedangkan ATMega8535 memiliki 512 byte saja. Setiap data variabel statis, semisal data text yang akan dikirim menuju lcd kadang menyebabkan memory RAM menjadi habis, padahal harus ada space RAM yang cukup untuk menampung data-data dinamis yg berubah sesuai jalannya program. Untuk itu data statis ini dapat disimpan ke dalam FLASH (PROGMEM) atau EEPROM.
PROGMEM
Progmem merupakan pemanfaatan memory flash / program sebagai penyimpan data statis. Pada mode scripting GCC inisialisasi awal yang harus di deklarasikan adalah #include <avr/pgmspace.h>. Pemanfaatan progmem cukup membantu menghemat RAM akan tetapi sebelum menuangkannnya ke dalam perhitungan atau penulisan ke lcd / UART, isi dari memory flash perlu dipindahkan ke memory RAM. Perhatikan contoh berikut ini.
contoh 1
char angka = 30;
char angka2;
Variable angka diatas berada di RAM, jika ingin memanfaatkan variabel diatas cukup gampang.
angka2 = angka * 2;
Jika variabel angka dirubah dirubah berada di FLASH , maka perubahannya seperti berikut:
contoh 2
const char angka PROGMEM= 30;
char angka2,angka3;
untuk mendapatkan hasil perhitungan yang sama maka harus ada variabel angka3 yang akan memindahkan data dari variabel angka (yang berada di flash) menuju RAM.
angka3 = pgm_read_byte(&angka); //yg dimaksud &angka adalah alamat memory
angka2= angka3 * 2;
Tentunya contoh diatas tidak menggambarkan penghematan memory, tapi perhatikanlah contoh penulisan variabel array tulisan yang panjang ke UART berikut ini:
const char tulisan[] PROGMEM= "ahocool hebat sekali lo broo";
void USART_Tx(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));{}
UDR = data;
}
void kirim_text(const char *data)
{
while (pgm_read_byte(data) != 0x00)
USART_Tx(pgm_read_byte(data++));
}
Dari fungsi diatas , routine kirim_text akan mengirimkan isi dari memory flash satu persatu ke UART, sehingga tidak perlu memindahkan semua data tulisan ke RAM cukup hanya dipindahkan secara berurutan. Perintah untuk mengirim text ascii ke UART seperti berikut ini :
kirim_text(tulisan);
Apabila pembaca sering memperhatikan script yang ditulis diblog ini, terutama yang berhubungan dengan LCD maka penulisan teks variable tulisan seperti contoh diatas, cukup menuliskan seperti ini:
lcd_puts_P(tulisan)
untuk lebih lengkapnya dapat membaca penjelasan mengenai library pgmspace.h disini
EEPROM
Salah satu keunggulan dari microcontroller AVR adalah adanya memory non volatile (tidak akan hilang saat tidak ada power) yang berupa EEPROM. Biasanya penggunaanya adalah sebagai penyimpan data statis seperti halnya PROGMEM dan yang paling penting adalah variabel dinamis yang akan berubah nilainya dan kemudian nilainya akan disimpan seterusnya walau saat microcontroller dimatikan. Inisialisasi librarynya dilakukan dengan menuliskan #include <avr/eeprom.h>.
Beberapa perintah script EEPROM yang paling penting adalah :
Contoh paling sederhana adalah pembacaan dan penyimpanan data kalibrasi seperti contoh berikut:
uint8_t EEMEM kalibrasi=100;
char berubah;
untuk membaca nilai EEPROM dan memindahkan ke RAM seperti ini :
berubah=eeprom_read_byte(&kalibrasi);
semisal nilai variabel "berubah" memang berubah karena perjalanan dari aplikasi, maka ketika ingin menyimpannya ke EEPROM tuliskan script seperti berikut:
eeprom_write_byte(&kalibrasi,berubah);
cukup mudah bukan? Bagaimana jika ingin menuliskan data EEPROM ke LCD atau UART ? contohnya seperti berikut ini :
uint8_t EEMEM edit_tgl[]= " *EDIT KALENDER*$";
void tulis_ee(uint8_t *eem)
{
uint8_t a=0;
while(eeprom_read_byte(eem + a) != '$')
{
lcd_putc(eeprom_read_byte(eem + a));
a++;
}
}
contoh diatas sering digunakan oleh penulis untuk menyimpan data-data teks yg akan ditulis ke LCD, dengan sebuah trick menempatkan tanda $ sebagai penanda akhir kalimat (tentunya karakter lain bisa saja, asal karakternya jarang digunakan). untuk menulis ke LCD cukup menuliskan script berikut:
tulis_ee(edit_tgl);
Bagaimana dengan mengirim UART ? Perhatikan contoh berikut:
uint8_t EEMEM tulisan[]= "ahocool memang ganteng banget broo !!";
void USART_Tx(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));{}
UDR = data;
}
void kirim_text_ee(const char *data)
{
while (eeprom_read_byte(data) != 0x00)
USART_Tx(eeprom_read_byte(data++));
}
Dan selanjutnya sangat mudah hanya cukup menuliskan :
kirim_text_ee(tulisan);
SELAMAT MENCOBA
Rabu, 19 Juni 2013
Tutorial: RFID ID-12 Trainer Modul dan Aplikasi Pintu Berbasis RFID
Penulis mendapat modul starter kit RFID innovative dari pembaca blog yg kebingungan setelah membeli nya. Modul ini dapat diperoleh dengan harga sekitar 350 ribu dengan packing yang sudah terdapat komunikasi serial UART atau Rs232 serta beberapa rangkaian tambahan sehingga dapat dikatakan siap pakai. Modul Utama RFID adalah ID-12 yang bekerja pada frekuensi 125Khz dan hanya berfungsi sebagai reader. Terdapat antenna internal sehingga tinggal menempatkan kartu RFID di atasnya. Unutk model yang bisa write/menulis ke kartu RFID maka dibutuhkan jenis yang lebih advance yaitu ID-20
Ternyata tidaklah sesusah yg dikira..bisa langsung dihubungkan menuju serial port atau usb to serial converter dan melalui software hyperterminal / putty (9600 bps) ketika kartu RFID dideketkan ke modul akan muncul kode ascii seperti contoh ini :
4D00D584B1AD
Dari datasheet didapatkan penjelasan byte yg dikirim ketika kartu didekatkan berupa :
1. STX (0x02) , start transmission
2. 10 DATA ASCII
3. 2 byte checksum (ascii)
4. <cr><lf> ETX , kalo hexanya 0x0D , 0x0A, 0x03
Ke 16 byte ini bisa dibaca langsung melalui serial port (tentunya ketika kartu yg sesuai ditempelkan dekan ID-12) akan tetapi checksumnya mubazir jika hanya kecepatan membaca kartu tidak tinggi, sehingga lebih baik hanya di compare semua byte ascii (10 + 2) jika ingin melakukan suatu proses pengecekan kartu.
Untuk rangkaian dari datasheet produk RFID Innovations, seperti berikut:
Perbedaan antara ID-0/ID-2 dan ID-12 hanya di antenna , dimana ID0/2 tidak memiliki antena internal seperti ID12. Tapi ID12 dapat juga dipasangkan antena external yg dapat digunakan bersamaan. Antenna dapat dibuat dengan lilitan kawat enamel diameter 0.5 mm yang dililit melingkar sekitar 100 putaran dengan diameter lingkaran 10cm (kira2 menghasilkan 640uh, gunakan google untuk mencari kalkulator lilitan), dan kemudian jangan lupa memasangkan tunning capacitor yang bernilai sekitar 1,5nF. Untuk koneksinya dapat dilihat pada gambar diatas.
Jika modul trainner dihubungkan dengan Microcontroller maka cukup gunakan mode UART TTL , dan hanya digunakan pin RX saja , karena tujuannya hanya membaca data serial yg diberikan oleh modul ketika membaca kartu.
jadi....kodenya kira2 begini , output ke LCD 16x2 (baca tutorial mengenai penulisan lcd disini):
#define F_CPU 4000000UL //sesuaikan dengan clock micro #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "lcd.h" //silahkan baca pembahasan menulis LCD #define USART_BAUDRATE 9600 //baudrate #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) void init_usart(void) { UCSRB |= (1 << RXEN) | (1 << TXEN); UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH = (BAUD_PRESCALE >> 8); UCSRB |= (1 << RXCIE); //interupt serial usart sei(); //enable interupt } ISR(USART_RX_vect) //interupt ketika ada data yg diterima { char databyte; databyte = UDR; // isi data if(databyte == 2) { //deteksi STX (0x02h) lcd_gotoxy(0,1); } //tampilkan data kecuali data status ke LCD else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) {lcd_putc(databyte); } } int main(void) { //inisialisasi port I/O DDRC=0b1111111; //port LCD ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit //inisialisasi LCD lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts(" BACA RF ID"); init_usart(); while(1) { } return 0; }
Script diatas hanya berfungsi untuk mendapatkan pembacaan dari kartu RFID yang didekatkan ke modul. Untuk lebih ke aplikasi selanjutnya kita dapat memanfaatkan nomer kartu yang unique yang kemudian akan dipakai sebagai pembuka suatu slot kunci dari selenoid. Slot kuncinya seperti ini nih :
Jadi ntar salah satu pin dari microcontroller akan meng ON dan OFF selenoid sebagai proses Kunci dan Buka dari pintu. Ketika tombol kunci ditekan maka selenoid akan OFF sehingga ujung slot akan mengunci pintu. Ketika kartu yang kodenya sesuai dengan yang diijinkan membuka (atau memakai daftar database pun bisa) maka Micro akan meng ON kan selenoid sehingga slot akan tertarik oleh magnet selenoid dan pintu akan terbuka. Selenoid ini harus di drive oleh relay atau transistor agar tidak merusak microcontroller dan rata-rata tegangan selenoid tidak bisa di drive langsung oleh microcontroller. contohnya seperti gambar berikut:
Script komparasi dari kartu RFID seperti berikut ini :
/*============================= RF ID trainner modul IE version connected to IE MINSYS 8535 For DOOR LOCK via SELENOID by: ahocool@gmail.com www.aisi555.com =============================*/ #define F_CPU 4000000UL //sesuaikan clock xtal yg dipakai #include <string.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "lcd.h" //untuk LCD #define USART_BAUDRATE 9600 //baudrate komunikasi serial #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) uint8_t dataindex,detik; char data[12]; char pass[12]="4D00D584B1AD" ; //sesuaikan dengan pembacaan kartu via PC & hyperterminal/putty , kartu yg digunakan yg dapat membuka pintu void init_usart(void) //inisialisasi usart { UCSRB |= (1 << RXEN) | (1 << TXEN); UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH = (BAUD_PRESCALE >> 8); UCSRB |= (1 << RXCIE); //interupt serial usart sei(); } void init_jam(void) //timer 8 detik tanpa aktivitas, LCD mati { TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode TIMSK |= (1 << OCIE1A); // Enable CTC interrupt OCR1A = 62499; //compare the CTC A TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64 TCNT1 = 0; PORTC |= (1<<PC7); //hidupkan LCD detik=0; } ISR(TIMER1_COMPA_vect) //interrupt detik { detik ++; if(detik == 2) { lcd_gotoxy(0,1); lcd_puts("Tempelkan Kartu!"); } if(detik >=8) { //8 detik layar lcd mati PORTC &= ~(1<<PC7); // lcd mati TCCR1B=0; } } ISR(USART_RX_vect) //interupt data serial dari RFID { char databyte; uint8_t a; databyte = UDR; if(databyte == 2) { //Start transmission dataindex=0; } //byte status di skip aja else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) { data[dataindex - 1]=databyte; //simpan ke memory hasil pembacaan } if(dataindex > 14 ) //jika sudah baca semua data { for(a=0 ;a<12 ; a++) { if(data[a] != pass[a]) break; //komparasi nilai pembacaan RFID } if( a == 12) { //jika kartu benar lcd_gotoxy(0,1); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" PINTU DIBUKA "); PORTA |=(1<<PA0); init_jam(); } else{ lcd_gotoxy(0,1); //jika kartu salah lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" Kartu Salah ! "); init_jam(); } } dataindex++; } void tombol(void) //routine pembacaan tombol { if(bit_is_clear(PINA, PINA1)) { lcd_gotoxy(0,1); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" PINTU DIKUNCI "); PORTA &= ~(1<<PA0); init_jam(); } } int main(void) { //inisialisasi port I/O, sesuaikan dengan IC AVR yg dipakai DDRC=0b11111111; //port LCD dan PC7 terhubung ke VCC dari LCD (kalau tidak kuat di drive transistor) untuk mematikan layar jika melebihi waktu (biar hemat listrik) DDRA |= (1<<PA0); //output ke relay/transistor driver selenoid kunci & led status pintu DDRA &= ~(1<<PA1); //tombol kunci pintu ,tombol lepas= pull up 10k ke vcc, tombol ditekan = nyambung ke GND ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit //inisialisasi LCD init_jam(); lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts(" RFID DOOR LOCK\n"); lcd_puts("Tempelkan Kartu!"); init_usart(); while(1) { tombol(); } return 0; }
Hasilnya seperti ini nih...
Selamat Mencoba
Senin, 17 Juni 2013
Seputar Televisi Digital Teresterial di Indonesia
PERTELEVISIAN DI INDONESIA
Dunia pertelevisian di Indonesia dimulai saat Indonesia menjadi tuan rumah Asian Games 1962, dimana salah satu prasyaratnya adalah adanya coverage televisi. Satu paket dengan stadion GBK di wilayah senayan didirikan juga stasiun pemancar dan studio TVRI. Dan perkembangannya lumayan cepat di eranya karena pasar yang cukup tinggi sehingga menjadikan Indonesia negara ke-3 yang memiliki sistem televisi yg dipancarkan via satelit yaitu melaui SKSD (Sistem Komunikasi Satelit Domestik) - PALAPA yang diluncurkan tahun 1976. Dengan satelit yang dapat mencakup wilayah kepulauan nusantara maka bermunculan stasiun relay di daerah-daerah sehingga jangkauan TVRI menjadi lebih luas.
SKSD - PALAPA
Mengudaranya televisi swasta mengakhiri monopoli TVRI, diawali dengan RCTI (jakarta) dan SCTV (surabaya) yang mengudara diakhir tahun 80-an, dan muncul juga layanan TV via satellite Indovision setelahnya. Jika pembaca mengalami hidup di wlayah pelosok seperti penulis dan mengalami masa tahun 90-an maka peralatan penerima satelit via Parabola merupakan hal yang wajib dimiliki. Dengan generasi satelit Palapa yang berkekuatan tinggi (generasi Palapa C dan sesudahnya) berakibat semakin kecilnya ukuran parabola yang nangkring diatas genteng, mengingat tahun 80-an hanya orang kaya dengan rumah yg luas yg bisa memasang piring/dish parabola dengan actuator penggerak yg menakutkan suara mesinnya. Jaman ini siaran TV via satelit masih menggunakan system analog yang menyebabkan 1 channel televisi harus menggunakan 1 transponder satelit, sehingga rata-rata tiap satelit kala itu memiliki 12 -24 transponder yg harus dipakai berbagi dengan layanan data dan telepon.
ERA DIGITAL SATELIT
Standar televisi satelit digital diluncurkan pada pertengahan 90-an dengan tujuan mendigitalkan siaran dan memiliki keuntungan kompresi digital yang akan menghemat bandwith. Sistem multiplexing juga menghemat penggunaan transponder dimana beberapa saluran televisi berada pada frekuensi yg sama dan dibedakan melalui kode digital. Permintaan akan siaran televisi berbayar dengan channel yang semakin banyak juga mendorong konsorsium DVB dan perusahaan elektronika membuat system enkripsi/pengacakan yang secara teori susah dibajak. Begitu juga dengan masalah kualitas dengan munculnya era High-Definition (HDTV) memunculkan standar baru yaitu DVB-S2 yang memiliki teknologi kompresi lebih baik dan tentunya mendukung penyiaran HD dan juga 3D.
DIGITAL TERESTERIAL BROADCAST
Bagaimana dengan televisi digital di darat (teresterial) ? Kembali kepada standar televisi analog yang tidak seragam antar negara, amerika utara dengan NTSC, Eropa dengan PAL, perancis dengan SECAM dan masih banyak lagi perbedaan standar antar negara. Hal ini juga berlaku ketika era digital merambah siaran televisi teresterial dimana amerika memiliki ATSC, jepang dengan ISDB-T, eropa dengan DVB T, korea selatan dengan T-DMB dan beberapa standar yg diciptakan memunculkan kebingungan di beberapa negara "pengikut".
Kenapa harus beralih ke digital? Seperti halnya televisi digital via satelit tujuan dasarnya adalah penghematan bandwith penyiaran, multiplexing dan kualitas. Sebagaimana diketahui spektrum frekuensi untuk penyiaran dan telekomunikasi saling tumpang tindih dan semakin sempit saja celah diantaranya. Dengan munculnya kepentingan penggunaan bandwith untuk komunikasi data seluler mau tidak mau televisi harus ikut di kompresi sehingga beberapa channel dapat disumbangkan ke operator seluler.
Dibeberapa negara yang seirus melakukan migrasi seperti amerika dan australia mungkin hal ini sudah dianggap jadul, karena mereka sudah meninggalkan siaran analog sejak 2000an dan full analog cut-off sekitar tahun 2009. Spektrum bandwith televisi diatas 700Mhz (ch 48 keatas) sudah disumbangkan ke penggunaan teknologi seluler 4G LTE. Bagaimana dengan Indonesia ?
SIARAN TELEVISI DIGITAL TERESTERIAL DI INDONESIA
Penyiaran digital Indonesia secara resmi sekitar tahun 2010 dengan dibukanya stasiun digital TVRI di jakarta, bandung, batam dan surabaya oleh presiden SBY. Sebelumnya kementrian KOMINFO membuka suatu konsorsium TV digital sekitar tahun 2008 dengan tujuan melakukan trial DVB T di jakarta, bandung dan surabaya. Nasib konsorsium ini tidak jelas dengan mundurnya beberapa broadcaster dan pemancar disurabaya dikabarkan disambar petir kala itu. TVRI sebagai tv pemerintah mengikuti roadmap ASEAN digital tv, didukung penuh oleh pemerintah melakukan penyiaran digital secara resmi tahun 2010. Perjalanan tv digital seakan jalan ditempat padahal roadmap mensyaratkan tahun 2015 semua TV harus beralih ke digital dan 2018 siaran TV analog harus ditiadakan.
Tahun 2010 penulis sempat tertarik dengan penyiaran digital dan mendapatkan Set Top Box nya melalui forum kaskus, dan hasilnya ketika dicoba disurabaya hanya mendapatkan siaran TVRI.
Pemerintah melalui kementrian kominfo berusaha agar tidak jalan ditempat dengan melelang penyiaran multiplexing televisi digital kepada swasta. Ujung-ujungnya pelelangan ini digugat dan kalah di MA (kalau masalah bagi-bagi duit ya susah di negeri ini). Gebrakan lainnya adalah dengan mengadaptasi teknologi DVB terbaru yg merupakan standar eropa yaitu DVB-T2. Penulis sempat dibuat kesal karena STB yang dibeli hanya berstandar DVB-T sehingga akan tidak bisa dipakai lagi.
Menurut wikipedia, siaran tv digital di Indonesia akan mengikuti jadwal migrasi seperti berikut:
Fase I (2008–2010)
Percobaan DTV
Pengosongan layanan primer lainnya (broadband telepon genggam dan RFID)
Fase II (2012–2015)
Siaran TV analog & DTV simulcast
Fase III (2015-2017)
TV analog dinonaktifkan
Pengosongan siaran DTT melalui saluran 22 sampai 48
Pengosongan broadband telepon genggam di gelombang 694 MHz sampai 806 MHz
Fase IV (2018-)
Tidak ada layanan TV analog
100% siaran DTV melalui saluran 22 sampai 48
Wilayah siaran :
- Kawasan Ekonomi Maju 1: Jakarta, Jawa Barat, Jawa Tengah, dan Jawa Timur mulai Q1 2011 sampai Q2 2015
- Kawasan Ekonomi Maju 2: Sumatera Utara, Banten, Yogyakarta, Kalimantan Timur, dan Kepulauan Riau mulai Q4 2012 sampai Q1 2016
- Kawasan Ekonomi Berkembang 3: Aceh, Sumatera Barat, Riau, Jambi, Bengkulu, Sumatera Selatan, Lampung, Bangka Belitung, Bali, Maluku, Sulawesi Selatan, Sulawesi Utara, Kalimantan Barat, dan Kalimantan Tengah mulai Q3 2013 sampai Q4 2016
- Kawasan Ekonomi Berkembang 4: Nusa Tenggara Barat, Nusa Tenggara Timur, Papua Barat, Maluku Utara, Sulawesi Barat, Sulawesi Tenggara, Sulawesi Tengah, Gorontalo, and Kalimantan Selatan mulai Q1 2014 sampai Q2 2017
- Kawasan Ekonomi Berkembang 5: Papua mulai Q3 2014 sampai Q4 2017
Pada juni 2013 penulis berhasil mengumpulkan duit receh demi receh untuk membeli STB terbaru berstandar DVB-T2 . Cukup murah dengan harga dikisaran 300 ribu ++ STB DVB-T2 pun didapat dengan beberapa keunggulan diantaranya standar DVBT / T2, kompresi MPEG4/2, HD ready, time shifting, usb storage dan masih banyak lagi. Dan hasil drive test di seputaran surabaya cukup memanjakan pemirsa dengan kualitas gambar yang bagus. Saluran yang berhasil di scan adalah : Ch23 (TVOne & ANTV), Ch25 (Metro TV , BBS, 8 ch LP3M blank), Ch27 (TransTV/7 dan Kompas TV), Ch 35(TVRI3, TVRI_NAS, TVRI_SURABAYA) dan ch41(RCTI, MNCTV, Global TV & 3ch yg duplikasi).
Siaran TV MUX yang cukup niat menurut saya adalah di ch27 yaitu milik transcorp dan kompas, dimana EPG (electronic program guide) nya lumayan lengkap layaknya dimiliki oleh siaran TV satelit berbayar
Bagaimana kelanjutannya setelah ini? Apakah akan berubah lagi standarnya ? Entahlah...di negeri ini semuanya mungkin berubah kalau sudah berhubungan dengan duit dan proyek ......Only Heaven Knows !!
UPDATE : Untuk panduan, kami telah review beberapa merek STB digital yg sudah ada di pasaran dan anda kini bisa bandingkan sesuai fasilitas dan keunggulannya :
- Matrix Apple - Polytron PDV 600T2 - Venus Cabe Rawit - Evinix H-1 - Akari ADS-2230
Bagi anda yg berada di lokasi lain di Nusantara dapat juga membaca update perkembangan migrasi TV digital di kota-kota besar seluruh Indonesia :
- Surabaya ( MNC , EMTEK , VIVA )
- Malang
- Jember
- Kediri
- Madiun
- Jogja
- Semarang
- Makasar
- Medan
Jumat, 07 Juni 2013
Tutorial: POV TEXT Sederhana
Yang mau belajar tentang POV... nih ane share, tapi yang model paling sederhana dulu ya...
Jadi startnya masih ngaco karena ga ada semacam sensor penanda posisi motor
tapi lumayan lah buat start pemula....
Sebelumnya kita perlu tau prinsip POV,sebenernya sama dengan prinsip scanning led matrix, dimana tiap byte dari baris dikeluarkan satu persatu berdasarkan periode waktu. Karena led ini bergerak (dalam hal ini berputar) maka kelembaman mata akan menyebabkan efek terlihatnya teks. Seperti pada video berikut ini :
Video diatas merupakan dasar POV yang cukup sederhana yang tidak memiliki sensor penanda awal posisi motor dan deretan led, sehingga efek yang muncul adalah tulisan yang tidak diam alias ikut muter. Sensor yang mungkin dipakai adalah Opto sensor atau magnetic-hall efect sensor. Sensor ini nantinya akan mentrigger interupt yang akan menandai titik referensi awal dari motor.
Sensor Opto dan Magnetic (Hall Effect)
skematiknya ini ya ...
scriptnya ga jauh beda dengan praktek LOVEHURT kok ...
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
//database Huruf
const char h_A[5] PROGMEM = {0x7e, 0x11, 0x11, 0x11, 0x7e}; //A
const char h_B[5] PROGMEM = {0x7f, 0x49, 0x49, 0x49, 0x36}; //B
const char h_C[5] PROGMEM = {0x3e, 0x41, 0x41, 0x41, 0x22}; //C
const char h_D[5] PROGMEM = {0x7f, 0x41, 0x41, 0x22, 0x1c}; //D
const char h_E[5] PROGMEM = {0x7f, 0x49, 0x49, 0x49, 0x41}; //E
const char h_F[5] PROGMEM = {0x7f, 0x09, 0x09, 0x09, 0x01}; //F
const char h_G[5] PROGMEM = {0x3e, 0x41, 0x49, 0x49, 0x7a}; //G
const char h_H[5] PROGMEM = {0x7f, 0x08, 0x08, 0x08, 0x7f}; //H
const char h_I[5] PROGMEM = {0x80, 0x41, 0x7f, 0x41, 0x80};//I
const char h_J[5] PROGMEM = {0x20, 0x40, 0x41, 0x3f, 0x01}; //J
const char h_K[5] PROGMEM = {0x7f, 0x08, 0x14, 0x22, 0x41}; //K
const char h_L[5] PROGMEM = {0x7f, 0x40, 0x40, 0x40, 0x40}; //L
const char h_M[5] PROGMEM = {0x7f, 0x02, 0x04, 0x02, 0x7f}; //M
const char h_N[5] PROGMEM = {0x7f, 0x04, 0x08, 0x10, 0x7f}; //N
const char h_O[5] PROGMEM = {0x3e, 0x41, 0x41, 0x41, 0x3e}; //O
const char h_P[5] PROGMEM = {0x7f, 0x11, 0x11, 0x11, 0x0e}; //P
const char h_Q[5] PROGMEM = {0x3e, 0x41, 0x51, 0x21, 0x5e}; //Q
const char h_R[5] PROGMEM = {0x7f, 0x09, 0x19, 0x29, 0x46}; //R
const char h_S[5] PROGMEM = {0x46, 0x49, 0x49, 0x49, 0x31}; //S
const char h_T[5] PROGMEM = {0x01, 0x01, 0x7f, 0x01, 0x01}; //T
const char h_U[5] PROGMEM = {0x3f, 0x40, 0x40, 0x40, 0x3f}; //U
const char h_V[5] PROGMEM = {0x1f, 0x20, 0x40, 0x20, 0x1f}; //V
const char h_W[5] PROGMEM = {0x3f, 0x40, 0x38, 0x40, 0x3f}; //W
const char h_X[5] PROGMEM = {0x63, 0x14, 0x08, 0x14, 0x63}; //X
const char h_Y[5] PROGMEM = {0x07, 0x08, 0x70, 0x08, 0x07}; //Y
const char h_Z[5] PROGMEM = {0x61, 0x51, 0x49, 0x45, 0x43}; //Z
const char h_27[5] PROGMEM = {0x32, 0x49, 0x79, 0x41, 0x3f}; //@
const char h_28[5] PROGMEM = {0x02, 0x01, 0x51, 0x09, 0x06}; //?
const char h_29[5] PROGMEM = {0x80, 0x80, 0x5f, 0x80, 0x80}; //!
const char h_30[5] PROGMEM = {0x3e, 0x51, 0x49, 0x45, 0x3e}; //0
const char h_31[5] PROGMEM = {0x80, 0x42, 0x7f, 0x40, 0x80}; //1
const char h_32[5] PROGMEM = {0x42, 0x61, 0x51, 0x49, 0x46}; //2
const char h_33[5] PROGMEM = {0x41, 0x41, 0x45, 0x4b, 0x31}; //3
const char h_34[5] PROGMEM = {0x18, 0x14, 0x12, 0x7f, 0x10}; //4
const char h_35[5] PROGMEM = {0x27, 0x45, 0x45, 0x45, 0x39}; //5
const char h_36[5] PROGMEM = {0x3c, 0x4a, 0x49, 0x49, 0x31}; //6
const char h_37[5] PROGMEM = {0x01, 0x71, 0x09, 0x05, 0x03}; //7
const char h_38[5] PROGMEM = {0x36, 0x49, 0x49, 0x49, 0x36}; //8
const char h_39[5] PROGMEM = {0x06, 0x49, 0x49, 0x29, 0x1e}; //9
const char h_40[5] PROGMEM = {0x80, 0x60, 0x60, 0x80, 0x80}; //dot
const char h_41[5] PROGMEM = {0x20, 0x10, 0x08, 0x04, 0x02}; //slash
const char h_42[5] PROGMEM = {0x08, 0x08, 0x08, 0x08, 0x08}; //-
const char h_43[5] PROGMEM = {0x80, 0x80, 0x80, 0x80, 0x80}; //blank
const char h_44[5] PROGMEM = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //end
char charnya[5];
void tulis(void)
{
int a;
for(a=0 ; a<5 ;a++)
{
PORTD = charnya[a] ;
_delay_ms(2);
}
PORTD = 0x80 ;
_delay_ms(2);
}
int main(void)
{
DDRD = 0b1111111; // PD0-PD6 output
while(1)
{
//ubah susunan huruf sesuai keinginan (asal ga penuh aja memorynya)
strncpy_P(charnya,h_A,5);
tulis();
strncpy_P(charnya,h_H,5);
tulis();
strncpy_P(charnya,h_O,5);
tulis();
strncpy_P(charnya,h_C,5);
tulis();
strncpy_P(charnya,h_O,5);
tulis();
strncpy_P(charnya,h_O,5);
tulis();
strncpy_P(charnya,h_L,5);
tulis();
_delay_ms(500); //ubah2 sesuai keinginan dan kecepatan motor
}
return 0;
}
lumayan kan ? skematik dalam bentuk eagle dapat didownload disini