Rabu, 28 September 2011
Minggu, 25 September 2011
Langkah Awal Instalasi DT-HIQ USB AVR ke PC
"Gimana nehh....kok ga detect apa-apa pas dicolokin ? "
SMS seperti ini sering meluncur dari pembeli paket belajar microcontroller dasar sesaat setelah paketnya datang. Kesalah-pahaman seperti ini muncul karena alat tidak mengambil power supply dari port USB melainkan mengambil tegangan dari rangkaian target atau bisa juga hanya menancapkan baterai/tegangan 3 - 5 v ke header pin 2 (+) dan pin 4 (-).
Jika USB-ISP mendapatkan tegangan dari rangkaian atau dari baterai, maka PC akan mendetect hardware baru
Pilih “Locate and Instal driver software” dan arahkan instalasi driver ke DVD installer yg didapat di paketan programmer USB-ISP
Ikuti langkah-langkah sampai USB-ISP terdeteksi oleh PC dan mendapatkan COM PORT tertentu
Dikarenakan software AVR STUDIO hanya mendeteksi port COM terbatas (sampai COM9) maka perlu dilakukan perubahan COM PORT secara manual pada control panel è device manager seperti gambar berikut:
(klik untuk memperbesar)
Klik kanan pada USB ISP Device, kemudian pilih properties, Port setting, Advance dan kemudian pilih com port antara 4-9 ( 1-3 biasanya digunakan oleh PC/Laptop). Jika terdapat keterangan (IN-USE) tidak menjadi masalah asal perangkat yg memiliki com port yg sama sedang tidak terpasang.
Selasa, 13 September 2011
Belajar Menulis di LCD Matrix
Kali ini kita akan membahas tentang LCD matrix
Umumnya LCD matrix yg beredar berbasis chipset HD44780 buatan hitachi
Lcd berbasis HD44780 mempunyai 2 mode interface 4 bit ato 8 bit
kali ini kita akan membahas yg 4bit karena kita pake attiny yg pin nya dikit
menulis ke LCD gampang-gampang susah, ada tricknya tersendiri asal sesuai datasheet
tapi kali ini kita akan bikin paling gampang, dengan memanfaatkan library yg paling banyak dipake buatan si PETER FLEURY linknya disini
sedangkan librarinya dapat download disini
pertama siapkan skematik berikut ini
dari gambar, potensio/trimpot fungsinya untuk mengatur kontras LCD, jika tidak perlu diatur, bisa diganti dengan R 100 ohm
selanjutnya buat project di AVR studio, jangan lupa mengekstrak librarynya si fleury yaitu file lcd.h dan lcd.c
karena file lcd.h nya default, kita bahas bagian2 yg dapat disesuaikan sesuai desain yang kamu bikin. Edit file lcd.h dengan notepad
Quote:
#define XTAL 1000000 sesuaikan nilai dengan frek clock, default attiny2313 adalah 1Mhz #define LCD_LINES 2 jumlah line LCD #define LCD_DISP_LENGTH 16 jumlah karakter per line #define LCD_IO_MODE 1 mode 0=8bit, 1=4 bit selanjutnya adalah definisi pin yang dipake, berikut ini hasil edit yang sesuai skematik diatas #define LCD_PORT PORTB /**< port for the LCD lines */ #define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */ #define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */ #define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */ #define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */ #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ #define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */ #define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */ #define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */ #define LCD_RS_PORT PORTD /**< port for RS line */ #define LCD_RS_PIN 4 /**< pin for RS line */ #define LCD_RW_PORT PORTD /**< port for RW line */ #define LCD_RW_PIN 5 /**< pin for RW line */ #define LCD_E_PORT PORTD /**< port for Enable line */ #define LCD_E_PIN 6 /**< pin for Enable line */ |
selanjutnya jangan lupa untuk menambahkan source lcd.c , seperti pada gambar berikut:
selanjutnya adalah routine/function yg dipake oleh library peter fleury
void lcd_init ( uint8_t dispAttr ) inisialisasi display Parameter yang dipake untuk dispAttr : LCD_DISP_OFF display off LCD_DISP_ON display on, cursor off LCD_DISP_ON_CURSOR display on, cursor on LCD_DISP_ON_CURSOR_BLINK display on, cursor on flashing void lcd_clrscr ( void ) Clear display LCD void lcd_home ( void ) Set cursor ke posisi home void lcd_gotoxy ( uint8_t x, uint8_t y ) Set cursor ke posisi tertentu Parameters: x posisi horizontal , 0 paling kiri y posisi vertikal, 0 baris paling atas void lcd_putc ( char c ) menampilkan sebuah karakter di LCD void lcd_puts ( const char * s ) menampilkan String di LCD void lcd_puts_p ( const char * progmem_s ) Display string jika memakai Progmem void lcd_command ( uint8_t cmd ) Jika mengirim command/perintah setting |
sekarang kita lanjut ke sciptnya yukkk...
kali ini kita akan menulis sesuatu ke LCD :
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"
int main(void)
{
DDRD |= (1<<PD4)|(1<<PD5)|(1<<PD6); //Port RS, R/W, En
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3); //DATA port 4 bit
lcd_init(LCD_DISP_ON); //inisialisasi
lcd_clrscr(); //bersihkan layar
lcd_puts("=== Test LCD ===\n"); //tulis baris 1 dan geser ke bawah
lcd_puts("1234567890@#$%?+"); //tulis baris 2
while(1)
{
}
return 0;
}
sedangkan yang lebih keren..kita bikin teks LCD nya geser...geserr seperti gambar + video
Selasa, 09 Agustus 2011
Kit Pemancar FM 1 Transistor Untuk Pemula
Mau belajar bikin pemancar radio FM sederhana?
Apakah mengalami kesulitan karena bahan-bahan susah dicari?
Mungkin kami bisa bantu kamu menyediakan kompenennya...
Apakah mengalami kesulitan karena bahan-bahan susah dicari?
Mungkin kami bisa bantu kamu menyediakan kompenennya...
KABAR BARU ..TERSEDIA JUGA KIT PEMANCAR AM dengan IC 555
Pemancar FM atau FM transmitter untuk player mp3/mmc umumnya dijual murah, terutama produk dari china..tapi kalau bikin sendiri kenapa tidak? Jika merakit sendiri akan mengasah ketrampilan solder menyolder buat kalian yang baru mengenal dunia elektronika.
Dipasaran ada juga yang menjual KIT pemancar dengan PCB yang sudah jadi , tetapi tidak seru ahh..mending bikin yang seperti ini, lebih klasik dan terlihat sangar! Perlu diketahui jika memakai KIT PCB yang tinggal solder maka kamu akan melewati ilmu "membaca gambar skematik". Tentunya akan mengurangi proses penyerapan ilmu elektronika.
Paket KIT terdiri dari :
1. PCB POLOS 5x10 cm dan PCB lobang 2x3 cm
Dipasaran ada juga yang menjual KIT pemancar dengan PCB yang sudah jadi , tetapi tidak seru ahh..mending bikin yang seperti ini, lebih klasik dan terlihat sangar! Perlu diketahui jika memakai KIT PCB yang tinggal solder maka kamu akan melewati ilmu "membaca gambar skematik". Tentunya akan mengurangi proses penyerapan ilmu elektronika.
Paket KIT terdiri dari :
1. PCB POLOS 5x10 cm dan PCB lobang 2x3 cm
PCB polos sebagai "groundplane" atau dasar ground/pentanahan untuk mengurangi interferensi/gangguan, sedangkan PCB lobang untuk menempatkan komponen. PCB lobang akan diletakkan diatas PCB polos
2. Transistor NPN general purpose seperti 2N3904, 2N2222 dsb
Transistor sebagai penguat sinyal oscillator
3. Kapasitor 10nF, 1uF, 10pF
berfungsi sebagai filter sinyal audio dari input
4. Resistor 10K, 27K dan 470 ohm
digunakan untuk penahan arus listrik, dan jika digabung dengan kapasitor dapat berfungsi sebagai osilator
5. Kasitor Trimmer 20pF
nilai kapasitansinya dapat diubah-ubah, cocok sebagai penala frekuensi yg akan dipancarkan
6. Lilitan kawat email (induktor)
Lilitan induktor jika digabungkan dengan kapasitor akan menghasilkan resonansi frekuensi. Lilitan ini digunakan bersama-sama kapasitor untuk menghasilkan frekuensi FM.
7. Konektor Baterai + Baterai 9V
8. Skematik & Petunjuk Perakitan
Harga
Murah saja ...75 Ribu (belum ongkos kirim) |
Cara Transaksi
Melalui Transfer rek Mandiri / BCA (no rek via PM/sms )
Pengiriman Lewat JNE atau Paket Pos |
HUBUNGI KAMI
HP: 085733889569 , 087882045949
Mail : ahocool@gmail.com ym :ahokleng fb: ahocool1@gmail.com twiter: @ahocool |
Jika Kamu sukses merakit, bisa ngerjain orang serumah...karena pesawat TV bisa keluar suara MP3 dari pemancar yang kamu rakit
Senin, 08 Agustus 2011
PEMANCAR RADIO FM 1 TRANSISTOR
Kali ini kita selingkuh ke Analog dulu yuk , kita bikin Pemancar radio FM paling sederhana. Di inspirasi dari pertanyaan seorang anak SMA yg gagal meniru skematik pemancar FM di sebuah blog, kemudian dia meminta bantuanku untuk memperbaiki. Hasil googling dapet video youtube yg menuntunku menuju website jepang http://anarchy.translocal.jp/radio/micro/
Di salah satu bagian web jadulnya ada petunjuk membuat radio FM sederhana.
Gambar skematik seperti ini :
klik disini untuk gambar skematik lebih jelas
nah..ternyata ketika ku cek di kotak komponen punyaku ada beberapa yg cocok dan yang lainnya aku bikin dengan pendekatan nilai komponen dengan menggabungkan komponen2 berbeda
dari hasil pemantauan siaran dapat diterima sampe jarak 15 meter (LOS / tanpa halangan)
Kalo agan beruntung , bisa ngerjain orang serumah lho ! TV nya bisa masuk suara dari pemancar nya...seru kan ?
dari skematik di web asli, aku lakukan beberapa penyesuaian :
- R 27 Kohm aku buat dari gabungan R 10K + R 12 K , jadi nilainya mendekati
- Kapasitor 10pF aku buat dari seri 2 kasitor 22pF, jadi nilai sekitar 11pF
- Transistor yg kupakai transistor NPN umum 2N3904, ga bagus sebenernya respon frekuensi tinggi, tapi ga masalah
- Lilitan / Kumparan dibuat dari kabel jumper atau wrap kabel yang biasanya di gunakan untuk menyambung rangkaian di PCB lubang. Lilitan dibuat dengan melilitkan kabel 4-5 loop di obeng kecil, kemudian ujung2nya diluruskan biar gampang disolder. Kumparan ini bisa dibuat dengan kabel email, kabel dinamo tamiya ato kabel balast lampu neon. Ingat ujung kabel dikupas saat menyolder karena ada lapisannya
- Kapasitor trimmer/Varco aku pake yg ukuran 20 - 50 PF , bisa juga tidak dipergunakan tapi akan kesusahan ketika tuning lilitan
- PCB yang aku gunakan PCB lobang, sedangkan aslinya menggunakan PCB polos, sehingga Ground plane yg lebar akan memperkecil interfrensi. Jadi PCB lobang aku kasi groundplane pake timah yg disolder memanjang
- Batere yg dipake 3 buah AA, jadi tegangannya 4.5 V
Setelah berkutat beberapa lama dan ga suskses, akhirnya aku pikir lebih baik menunggu sape lewat tengah malem, biar siaran radio publik pada off, dan akhirnya berhasil mancar di range 90-102 MHZ. Aku gunakan mp3 player sebagai inputan audio
Trick tuning frekuensi sebagai berikut :
- Lilitan diusahakan lebar / kerenggangan seragam, semakin lebar/renggang maka frek semakin tinggi dan sebaliknya, jika versi tanpa varco / trimmer maka penentuan frekuensi menggunakan pengaturan jarak kerenggangan lilitan. Susah bangett...
- Putar2 varco dengan obeng trimmer, jika pake obeng biasa maka akan terpengaruh tangan yg nge-ground, pilih frek yg kosong di radio penerima, putar varco pelan2 sampe suara muncul. biasanya akan terjadi offset ketika obeng dilepas, kira2 frek turun 0.6 - 1 MHz. Contoh, misal frek yg diingini 94MHZ, maka radio dipanteng frek 95Mhz ketika muter2 varco sampe suara muncul
- Antena pemancar dapat dibuat dari kabel tunggal
dari hasil pemantauan siaran dapat diterima sampe jarak 15 meter (LOS / tanpa halangan)
Kalo agan beruntung , bisa ngerjain orang serumah lho ! TV nya bisa masuk suara dari pemancar nya...seru kan ?
SELAMAT MENCOBA!
Jumat, 05 Agustus 2011
Bermain Dengan Dot Matrix "LoveHurt"
=== REMAKE 2020 BISA DIBACA DISINI ====
=======================================================
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
Untuk kreasi text dalam Led Matrix 7 x 5 , bisa gunakan panduan excel di link ini.
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
FLASH extensinya .hex sedangkan isi EEPROM extensinya .eep
hasil akhirnya seperti di video berikut :
Kamis, 04 Agustus 2011
Hardware Pemrograman AVR
Microcontroller AVR memiliki beberapa mode programming diantaranya parallel, serial dan JTAG. Mode programming paling umum adalah mode serial melalui port SPI (serial peripheral interface). Port SPI berupa MOSI, MISO dan SCK. Untuk programming AVR diperlukan juga control terhadap port Reset dari IC AVR.
STK200/300
STK 200/300 merupakan standar programming paling mudah dari seri AVR, dimana memanfaatkan port parallel/LPT atau serial dari komputer/PC . Biasanya kita akan kesulitan menemukan port ini di PC/Laptop generasi terbaru. Secara umum rangkaian yg digunakan menggunakan komponen sederhana seperti yg dirancang oleh ponyprog berikut :
STK200/300
STK 200/300 merupakan standar programming paling mudah dari seri AVR, dimana memanfaatkan port parallel/LPT atau serial dari komputer/PC . Biasanya kita akan kesulitan menemukan port ini di PC/Laptop generasi terbaru. Secara umum rangkaian yg digunakan menggunakan komponen sederhana seperti yg dirancang oleh ponyprog berikut :
untuk software programmer/downloader file hex menuju chip AVR, dapat menggunakan software umum seperti avrdude, ponyprog, avrisp dsb.
STK200/300 versi USB ASP
Beberapa developer AVR di dunia maya menggratiskan (open source) programmer berbasis usb. Hal hasil ada beberapa programmer yang bisa dibuat sendiri dengan memanfaatkan avr lain sebagai kontroller. Jangan kawatir, ada beberapa yang sudah dijual dan siap pake.
UsbAsp & TinyAsp
Untuk lebih jelasnya penggunaan USB ASP dalam AVRSTUDIO / ATMEL STUDIO silahkan buka : https://www.aisi555.com/2021/08/usb-asp-isp-programmer-untuk-avr.html
STK500
Seri programmer yang satu ini umum digunakan pada PC yang menggunakan port USB. Keuntungan dari programmer jenis ini adalah kemudahan programming langsung dari AVR STUDIO. Jenis programmer yang paling umum dijual dipasaran seperti seri DT-HiQ buatan innovative.
Secara umum port output dari STK200/300/500 memiliki konfigurasi header ke port spi seperti berikut:
Jika menggunakan breadboard ada trick yg digunakan untuk menghubungkan header ISP, salah satunya dengan memasukkan kabel jumper ke header isp dan kemudian di isolasi.
cara lain adalah dengan memakai "perantara" pin header 2x5 yg disusun di atas pcb lobang seperti gambar berikut:
ingat : umumnya programmer mendapat suply tegangan dari luar/rangkaian yg mau diprogram
jadi jangan bingung kalo dicolokin tanpa rangkaian dan PC ga detect apa-apa
Jika menggunakan breadboard ada trick yg digunakan untuk menghubungkan header ISP, salah satunya dengan memasukkan kabel jumper ke header isp dan kemudian di isolasi.
cara lain adalah dengan memakai "perantara" pin header 2x5 yg disusun di atas pcb lobang seperti gambar berikut:
ingat : umumnya programmer mendapat suply tegangan dari luar/rangkaian yg mau diprogram
jadi jangan bingung kalo dicolokin tanpa rangkaian dan PC ga detect apa-apa
Dengan cara diatas maka menyusun port ISP ke breadboard bukan menjadi masalah lagi.
Rabu, 03 Agustus 2011
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
Penanda kaki nomer satu adalah tulisan marking, paling kiri no 1....paling kanan no 7
Menyebrang ke kanan atas no 8 sampai ke kiri atas itu nomer 14
Beberapa kaki memang tidak dipakai jadi dibarkan tidak terhubung
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 )
- 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 )
Selasa, 02 Agustus 2011
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 :
"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);
Bagaimana dengan jam akurat ? disini nih kuncinya ...menggunakan xtal 4Mhz
/* ===================
GUNAKAN XTAL 4MHZ dan 2 buah capacitor 22pf
dan sambungkan seperti gambar di petunjuk awal
di bagian menggunakan xtal dan ubah dusebit
rangkaian tetap sama seperti jam_sederhana
hanya tambahan xtal pada kaki 4 dan 5 serta
masing kaki xtal dihubungkan ke GND oleh
capacitor 22pf
*/
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int jam=0, min=0, detik=0;
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
}
}
ISR(TIMER1_COMPA_vect)
{
detik ++;
if ( detik == 60)
{ detik=0;
min++;
}
if ( min == 60)
{ min = 0;
jam++ ;
}
if (jam == 24) jam=0;
}
int main(void)
{
int digit;
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
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6);
DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3) |(1<<PD6);
DDRD &= ~(1<<PD4) & ~(1<<PD5) ;
sei();
while(1)
{
if(TCNT1 < 31250) PORTD |=(1<<PD6) ;
else PORTD &=~(1<<PD6) ;
segmen(10);
digit = jam/10;
PORTD |= (1<<PD0);
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);
segmen(10);
digit = jam%10;
PORTD |= (1<<PD1);
PORTD &= ~(1<<PD0) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);
segmen(10);
digit = min/10;
PORTD |= (1<<PD2);
PORTD &= ~(1<<PD1) & ~(1<<PD0) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);
segmen(10);
digit = min%10;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD0) ;
segmen(digit);
_delay_ms(5);
if (bit_is_set(PIND, PIND4))
{
jam++;
if(jam==24) jam =0;
_delay_ms(100);
}
if (bit_is_set(PIND, PIND5))
{
min++;
if(min==60) min=0;
_delay_ms(100);
}
}
return 0;
}
hasilnya dapat dilihat seperti berikut :
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);
Bagaimana dengan jam akurat ? disini nih kuncinya ...menggunakan xtal 4Mhz
/* ===================
GUNAKAN XTAL 4MHZ dan 2 buah capacitor 22pf
dan sambungkan seperti gambar di petunjuk awal
di bagian menggunakan xtal dan ubah dusebit
rangkaian tetap sama seperti jam_sederhana
hanya tambahan xtal pada kaki 4 dan 5 serta
masing kaki xtal dihubungkan ke GND oleh
capacitor 22pf
*/
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int jam=0, min=0, detik=0;
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
}
}
ISR(TIMER1_COMPA_vect)
{
detik ++;
if ( detik == 60)
{ detik=0;
min++;
}
if ( min == 60)
{ min = 0;
jam++ ;
}
if (jam == 24) jam=0;
}
int main(void)
{
int digit;
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
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6);
DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3) |(1<<PD6);
DDRD &= ~(1<<PD4) & ~(1<<PD5) ;
sei();
while(1)
{
if(TCNT1 < 31250) PORTD |=(1<<PD6) ;
else PORTD &=~(1<<PD6) ;
segmen(10);
digit = jam/10;
PORTD |= (1<<PD0);
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);
segmen(10);
digit = jam%10;
PORTD |= (1<<PD1);
PORTD &= ~(1<<PD0) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);
segmen(10);
digit = min/10;
PORTD |= (1<<PD2);
PORTD &= ~(1<<PD1) & ~(1<<PD0) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);
segmen(10);
digit = min%10;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD0) ;
segmen(digit);
_delay_ms(5);
if (bit_is_set(PIND, PIND4))
{
jam++;
if(jam==24) jam =0;
_delay_ms(100);
}
if (bit_is_set(PIND, PIND5))
{
min++;
if(min==60) min=0;
_delay_ms(100);
}
}
return 0;
}
hasilnya dapat dilihat seperti berikut :