Xedi.Xermawan's Blog

personal-technical blog

Archive for the ‘elektronics design’ Category

Hello World dengan WinAVR

with one comment

Just a documentation.

Minggu Desember 14 2008/Surabaya

—————————- start of doc —————————-

WinAVR dengan IDE pemrograman Code Block
Beberapa software open source yang dibutuhkan:

  1. GNU AVR GCC Compiler, disini digunakan WinAVR20080610 (versi sesuai tanggal update terakhir)

– Download http://winavr.sourceforge.net/ (sekitar 22 MB)
– Install. (selalu ingatlah tombol Next, Accept, Agree, dan OK 🙂 ) .Pilih saja direktori instalasi default agar mudah diingat, biasanya di dir utama= C:\WinAVR-20080610
2. Code::Block, sebuah IDE pemrograman untuk berbagai macam keperluan pemrograman , salah satunya bisa untuk IDE pemrograman mikrokontroler keluarga AVR.
– Download di http://www.CodeBlocks.Org (sekitar 11 MB)
– Install.
3. Buka Code::Block yang telah terinstall, lalu buat project baru (File->New->Project ). pada menu listbox terdapat beberapa pilihan tipe dari project yang bisa dibuat. Pilih “AVR Project”, lalu klik “Go”.
Read the rest of this entry »

Written by XediXermawan

December 28, 2008 at 12:54 pm

Posted in elektronics design

Embedded Web Server untuk Monitoring dan Data Logging.

with 53 comments

Sekarang ini banyak sekali macam Ethernet modul yang ada di pasaran yang sudah jadi dan pemakaiannya relatif mudah, seperti varian produk dari Wiznet. Tentu yang sudah jadi itu, harganya relatif lebih mahal dibanding kalau kita merakit sendiri !! . ENC28J60 dari Microchip bisa sebagai pilihan. IC ini adalah sebuah ethernet controller yang didalamnya terdapat Physical layer dan MAC

Read the rest of this entry »

Written by XediXermawan

November 21, 2008 at 12:15 pm

Posted in elektronics design

Interface barcode ke mikrokontroler AVR atmega.

with 17 comments

Barcode Scanner banyak digunakan di toko-toko retail untuk men-scan barang barang yang akan dibayar pembeli di kasir atau digunakan di perpustakaan untuk mempercepat petugas mendaftar buku-buku yang akan dipinjam. Dengan adanya alat ini semuanya menjadi cepat dan mudah, karena setiap jenis barang memiliki kode barcode sendiri yang unik sehingga bisa dikelompokkan dengan mudah. Seperti halnya keyboard dan mouse , terdapat banyak macam tipe barcode scanner berdasarkan jenis komunikasinya, misalnya barcode scanner serial, PS/2, dan USB. Pada proyek kali ini barcode scanner PS/2 yang akan digunakan, sehingga penanganannya sama dengan keyboard PS/2. Komunikasi PS/2 adalah komunikasi serial asinkronous yang menggunakan 2 kabel yaitu data
dan clock.
Read the rest of this entry »

Written by XediXermawan

November 21, 2008 at 12:00 pm

Posted in elektronics design

migrasi ke avr-gcc

with 5 comments

selama ini menggunakan code vision untuk mrogram mikro,dan kebnyakan orang-orang disini juga memakainya,walaupun ada juga yang msih pakai assembly murni (so rarely),namun codevision adalah yang mayoritas.code vision itu mudah,ada code wizard,dan tentu saja ini bukan freeware.lalu apakah semua orang disini membayar untuk itu?, tidak tahu lah.. . 😛 .di sisi lain ada yang freeware, yaitu win-avr (avr-gcc). rasa-rasanya sejak dulu memang ingin mencoba yang satu ini.dan sekarang aku telah mnggunakanya penuh.apa perlu uninstall code vision?tidak perlu …,yang terjadi terjadilah…

IDE bisa menggunakan AVR-studio atau codeblock atau juga bisa eclypse.tapi sekarang ini makai avrstudio,karena memang aselinya ini digunakan untuk mikro keluarga ATmel.

untuk menggunakan bahasa C di avr studio, perlu diinstal win-avr dan tentu saja Avr studio. Avrstudio tidak mendukung programer dengan pararel port jadi untuk mendownload file HEX,perlu program luar.

banyak program downloader yang bisa digunakan, saat ini saya menggunakan Pony programer.

—-mencoba dan menikmati—-(di sela sela waktu dikejar deadline) 😦

update 14 des 08 : Documentation, berisi penggunaan WinAVR dengan macam IDE pemrograman

Written by XediXermawan

June 24, 2008 at 4:15 am

Posted in elektronics design

rute menuju mana

with 4 comments

masih merasa ada yang hilang

Written by XediXermawan

April 12, 2008 at 3:58 am

Posted in elektronics design

ADC pada uC AVR ATMEGA16(dan untuk type yang lain),

with 15 comments

26/12/07, tft-LGoffice Bekasi
Atmega16 (dan sejenisnya) memiliki fitur ADC sebanyak 8 channel dengan resolusi 10-bit Register yang digunakan untuk setting ADC ini adalah:
+————————————————————————————————————-+
ADCSR | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
+————————————————————————————————————–+
7 6 5 4 3 2 1 0
ADEN : 1=adc enable, 0=adc turn off
ADSC : 1:mulai konversi,0:konversi belum terjadi
ADATE:1:auto trigger di aktifkan ,trigger berasal; dari sinyal yang dipilih(set pada register SFIOR bit ADTS).ADC akan start konversi pada edge positip sinyal trigger.
ADIF:di set ke 1,jika konversi ADC selesai dan data register ter-Update.Namun ADC Conversion Complete Interrupt di eksekusi jika bit ADIE dan bit-I dalam register SREG di set.
ADIE:di set 1,jika bit-I dalam register SREG di set.
ADPS0:2 ,faktor pembagi 0-7 = 2 2 4 8 16 32 64 128.
+————————————————————————————————————-+
ADMUX | REFS1 | REFS0 | ADLAR | MUX4 | MUX3 | MUX2 | MUX1 | MUX0 |
+————————————————————————————————————–+
7 6 5 4 3 2 1 0
REFS 0,1 :pemilihan tegangan referensi ADC
00:vref=AREF, 01:vref=AVCC dengan eksternal capasitor pada AREF, 10:Vref= Reserved , 11: vref= internal 2.56 volt dengan eksternal kapasitor pada AREF
ADLAR:
Untuk setting format data hasil konversi ADC,default=0.
MUX0-MUX4 :pemilihan channel ADC yang digunakan
0=channel1,1=channel 2,dst.
+————————————————————————————————————-+
SFIOR | ADTS2 | ADTS1 | ADTS0 | ADHSM | ACME | PUD | PSR2 | PSR10 |
+————————————————————————————————————–+
7 6 5 4 3 2 1 0
ADTS0-ADTS2 :pemilihan trigger untuk konversi ADC.bit-bit ini berhubungan dengan bit ADATE pada register ADCSRA.
ADHSM:ADC high speed mode enabled.
àlebih jelas baca datasheet
Contoh:
Inisialisasi:


ADMUX=0x00;  //channel 0
ADCSRA=0x8F;//ADEN=1,pembagi XTAL =128 jadi beroperasi pada f= 93.750 kHz
SFIOR&=0xEF;
ADCSRA|=0x40;

Pada rutin Interrupt:

unsigned char chan;  //nomer chanel adc
char lcd_buffer[33];
float temp;
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data,Rconversi;
unsigned char cdata[10];
adc_data=0;
// Read the AD conversion result
adc_data=ADCW;  //ambil data
if(chan==0)
{
temp = ((float)ADCW * 0.0048875);   //kalibrasi ke scale 5 volt
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"volt: %0.0001f V ",temp);  //1 angka di belakang koma
lcd_puts(lcd_buffer);
delay_ms(50);
chan=1;
ADMUX=0x01;
ADCSRA|=0x40;       //next conversion
}
else
{
if(chan==1)
{
temp = ((float)ADCW * 0.0048875);   //kalibrasi ke scale 5 volt
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"volt: %0.0001f V ",temp);
lcd_puts(lcd_buffer);
delay_ms(50);
chan=0;
ADMUX=0x00;
ADCSRA|=0x40;       //next conversion
}
}
}

Setting perintah sprintf() pada codevisionAVR:
Project|Configure|C Compiler tab|pada (s)printf edit box->float, width, precision
Program diatas menggunakan mode free running, ADC interrupt terjadi jika konversi data selesai. Data lalu di konversi ke tegangan(Range input 0 – 5 volt) . AREF di hubungkan AVCC.dipakai 2 channel,Channel 0 dan 1.Data tegangan lalu di displaykan ke LCD 16×2 yang terhubung pada PORT C.hasilnya cukup teliti,error 0,02 %.(dibandingkan dengan Voltmeter Asli).
-eof-

Written by XediXermawan

December 30, 2007 at 9:39 am

Posted in elektronics design

Timer di AVR

with 55 comments

Timer dalam embendded system sangat banyak kegunaannya.Itulah karenanya setiap mikrokontroler terdapat fitur timer. Mikrokontroller AVR keluaran Atmel memiliki beberapa timer(ATmega16 dalam hal ini,tipe lain yang lebih tinggi sama ,kecuali penambahan jumlah timernya),diantaranya timer0(8 bit),timer1(16 bit),dan timer2(8 bit).

Timer0 dan timer2(8 bit).

timer ini menghitung maksimal 255 hitungan.dimana periode setiap hitungan(detaknya) tergantung dari setting prescaler-nya. Untuk mengatur timer mode operasi apa yang digunakan dan mengatur prescaler digunakan register TCCRx(x=0,2).TCCRx adalah register 8 bit sebagai berikut:

FOC0WGM00 COM01COM00 WGM01CS2 CS1 CS0

7 6543210

CS0,CS1,CS2 digunakan untuk pengaturan prescaller, misalnya

000: timer dihentikan jika diset nilai ini

001: sekali detaknya sama dengan detak oscillator crystal yang digunakan

010 : sekali detaknya sama dengan oscillator/8.misalnya oscilator 8 MHZ,makasekali detak 1 perlu 1 mikrodetik.atau pada hitungan maksimal 255 us.

(atau clock berdetak 8 kali,timer baru sekali)

ànilai cs0,1,2 lain dapat dilihat di datasheetnya.

WGM00 dan WGM 01 digunakan untuk mode operasi dari timer,

Mode-Mode kerja Timer

1.mode normal,timer digunakan untuk ngitung saja,membuat delay,menghitung selang waktu .

2.mode PWM,phase correct

3.CTC,dalam mode ini ,nilai timer yang ada pada TCNTx akan di nol-kan lagi jika TCTx sudah match dengan nilai yang ada pada register OCRx.sebelumnya OCR diset dulu,.karena timer0 dan 2maksimumnya 255,maka range OCR 0-255.

4.Fast PWM

COM00,01:tergantung mode apa yang digunakan(nilaiWGM),COM00,01 untuk pengaturan lebih spesifik suatu mode timer.

Jadi hal utama jika akan menggunakan tiemr adalah setting TCCRx-nya,digunakan untuk mode apa(secara default,adalah sebagai mode normal).dan ketika saat timer jalan,jumlah hitungannya dapat dilihat Di register TCNTx.

Jika menggunakan compiler Seperti CodeVision ,penggunaannya auto generated,namun walaupun begitu ketika troubleshoot program setting manual adalah penting.

Interrupt Timer

1.Overflow Interrupt,akan terjadi interrupt jika TCNTx mencapai 255 untuk timer0 dan timer2 ,dan 65535 untuk timer1.

2.Compare Match interrupt,terjadi jika nilai OCR sama dengan TCNTx

Contoh Aplikasi:

1. Jam digital.

Digunakan Compare Match Interrupt,menggunakan crystal 12 MHZ,digunakan timer 0

Dengan prescaller Osc/8: 12mhz/8=1,5 mhz periode 1/1,5mhz==sekitar 100 us,jadi agar setara 1 detik harus dikali 10000.

Register OCR=0x96.

Output :tampilan Jam:Menit:Detik pada port C yang terhubung dengan LCD 2×16

/*********************************************

Project : jam digital

Date : 7/13/2007

Author: edee

Chip type : ATmega16

Program type : Application

Clock frequency : 12.000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

*********************************************/

#include <mega16.h>

#include <stdlib.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15

#endasm

#include <lcd.h>

unsigned int kdetik=0,detik=0,menit=0,jam=0;

unsigned char cdetik[10],cmenit[10],cjam[10];

// interrupt jika compare match

interrupt [TIM0_COMP] void timer0_comp_isr(void)

{

TCNT0=0; //jika sudah compare match,set awal lagi

if(++kdetik==10000)

{

if(++detik==60)

{ detik=0;

lcd_clear();

if(++menit==60)

{menit=0;

lcd_clear();

if(++jam==24)

{

jam=0;

lcd_clear();

}
}
}
kdetik=0;
itoa(detik,cdetik);
itoa(menit,cmenit);
itoa(jam,cjam);
lcd_gotoxy(9,0);
lcd_putsf(“:”);
lcd_gotoxy(10,0);
lcd_puts(cdetik);
lcd_gotoxy(6,0);
lcd_putsf(“:”);
lcd_gotoxy(7,0);
lcd_puts(cmenit);
lcd_gotoxy(4,0);
lcd_puts(cjam);
lcd_gotoxy(0,1);
lcd_putsf(“= Jam Digital =”);

}

}

void main(void)

{

//PA.5,6,7 input,dengan pull up

PORTA=0xE0;

DDRA=0x00;

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0x00;

PORTD=0x00;

DDRD=0x00;

//timer 0 sumber 12mhz/8=1,5 mhz periode 1/1,5mhz

TCCR0=0x02;

TCNT0=0x00;

OCR0=0x96; //sekitar 100us

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0x00;

MCUCSR=0x00;

// interrupt timer digunakan

TIMSK=0x02;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0x80;

SFIOR=0x00;

lcd_init(16);

#asm(“sei”)

while (1)

{

};

}

2.Pengukur selang waktu

Dalam aplikasi ini timer digunakan untuk mengukur selang waktu dua kejadian,dimulai start dan stop(tanpa menggunakan interrupt apapun)

Deklarasi awal:

#define TSTART() TCCR1B = 0x02

//stop timer

#define TSTOP() TCCR1B = 0x00

#define TRESET() TCNT1=0x00

#define THABIS 65000

Penggunaan di program:

TSTART();

while(PINB.0!=1) //jika syarat stop terpenuhi

{

hitung++;

if(hitung==THABIS)//sampai nilai max

{ //j=0; // return 0;

break;

}

}

TSTOP();

t=TCNT1;

akhir2 ini sering pake timer.

Written by XediXermawan

September 28, 2007 at 1:52 am

Posted in elektronics design