RSS

PEMBERITAHUAN (NOTIFICATION)

PEMBERITAHUAN

Mulai hari ini tanggal 29 Juni 2010 dan seterusnya, Blog ini dipindahkan ke alamat:

elektro-kontrol.blogspot.com

Dikarenakan beberapa alasan.

Semua artikel, ebook, software dan link dialihkan ke alamat blog yang baru, tanpa mengurangi isi dari artikel tersebut.

Diharapkan untuk mengunjungi alamat blog yang baru tersebut, silakan klik link berikut untuk mengunjungi blog terbaru elektro-kontrol.

Tertanda Electro Control Team.

Harap maklum, Terima kasih…

=====================================================================================

=====================================================================================

NOTIFICATION

Starting today June 29, 2010 onwards, this blog moved to this address:

elektro-kontrol.blogspot.com

Due to several reasons.

All articles, ebook, software and links redirected to the new blog address, without reducing the contents of the article.

It is expected to visit the new blog address, please click the following link to visit the latest blog elektro-kontrol.

Signed Electro Control Team.

Please understand, Thank you …

 
Leave a comment

Posted by on June 29, 2011 in Uncategorized

 

MENGAKSES MODUL SENSOR GYROSCOPE LISY300 TERKALIBRASI MENGGUNAKAN CODEVISION AVR

Sensor gyroscope yang saya gunakan ini adalah sebuah modul yang terdiri dari sensor Gyroscope LISY300AL dan ADC serial ADC101S021 yang dikeluarkan oleh PARALLAX Inc. Pada modul ini pun telah dilengkapi dengan regulator tegangan 3.3 V sebagai supply nya. Modul Sensor Gyroscope LISY300AL dapat mendeteksi kecepatan sudut (angular rate) satu axis, yaitu sumbu Z (yaw). Dan mampu membaca sampai ± 300°/s full scale.

[PROTOKOL KOMUNIKASI]

Pada dasarnya output dari sensor Gyroscope LISY300AL adalah berupa tegangan analog, tetapi oleh PARALLAX Inc, output dari sensor Gyroscope tersebut dibaca menggunakan ADC serial. Sehingga untuk mengakses modul ini kita harus menggunakan protokol kumunikasi SPI (Serial Peripheral Interface). Berikut adalah timing diagram cara mengakses Modul Sensor Gyroscope LISY300AL (ADC serial ADC101S021).

Pada dasarnya untuk dapat mengakses Modul Sensor Gyroscope LISY300AL ini, sebenarnya kita hanya harus tau cara mengakses ADC serial ADC101S021, dikarenakan Sensor Gyroscope itu sendiri dibaca oleh ADC serial ADC101S021. Dari gambar diatas terlihat bahwa terdapat 3 jalur untuk mengakses ADC serial ADC101S021 yaitu CS, SCLK dan SDATA.

CS digunakan untuk meng-enable ADC serial ADC101S021 agar dapat diakses, harus beri logika LOW.

SCLK digunakan sebagai serial clock, dimana semua aplikasi yang berkomunikasi secara serial membutuhkan clock untuk mengaksesnya, maksimal kecepatan clock untuk mengakses ADC serial ADC101S021 adalah 4MHz.

Sedangkan SDATA adalah jalur data serial yang berasal dari ADC serial ADC101S021. Data yang berasal dari ADC serial ADC101S021 mempunyai 15 bit data. Yaitu 3 bit 0 (LOW) awal, 10 bit data ADC dan 2 bit 0 (LOW) akhir. Dimana 10 bit data ADC dimulai dari MSB dan diakhiri oleh LSB.

[SENSITIVITAS]

Dan sensor Gyroscope LISY300AL, mempunyai sensitivitas 3.3 mV/°/s. Dimana ADC serial ADC101S021 mempunyai pembacaan data 10 bit (0-1023 atau sebanyak 1024 step) dengan perkiraan 3.22 mV/step. Sehingga setiap perubahan setiap step adalah perubahan 1 derajat.

[ZERO RATE LEVEL]

Sebenarnya sensor Gyroscope LISY300AL sudah terkalibrasi dari pabriknya. Yaitu dengan supply tegangan 3.3 V akan menghasilkan zero rate level 1.65 V (tegangan offset atau Voffset). Nilai zero rate level ini terjadi ketika Gyroscope tidak melakukan kecepatan sudut (angular rate), atau sensor Gyroscope dalam keadaan diam. Atau dengan kata lain jika dibaca menggunakan ADC 10 bit, dengan range input ADC 0-3.3 V, maka didapat nilai ADC sebesar 512 untuk zero rate level (tidak terjadi percepatan sudut atau dalam keadaan diam). Jika sumbu Z bergerak searah jarum jam, maka nilai ADC akan berkurang (dibawah nilai zero rate levelnya), Jika bergerak berlawanan arah jarum jam maka nilai ADC akan bertambah (diatas zero rate levelnya).

Tetapi menurut datasheet Gyroscope LISY300AL:

“Zero-rate level describes the actual output signal if there is no angular rate present. For a 3.3 V powered sensor the absolute zero-rate output is ideally 1.65 V. Zero-rate level of precise MEMS sensors is, to some extent, a result of stress to the sensor and therefore zero-rate level can slightly change after mounting the sensor onto a printed circuit board or after exposing it to extensive mechanical stress. This value changes very little over temperature and also very little over time.”

[KALIBRASI]

Karena alasan diatas, maka terjadi penyimpangan untuk nilai zero rate levelnya, yaitu maksimal sekitar 512±24. Oleh karena itu harus dilakukan cara untuk dapat menentukan nilai zero rate level melalui kalibrasi.

Pada dasarnya nilai zero rate level sudah bisa kita tentukan sendiri, yaitu saat tidak terjadi kecepatan sudut (angular rate) atau gyroscope dalam keadaan diam. Sebagai contoh ketika saya baca keluaran Modul Sensor Gyroscope LISY300AL muncul nilai 511, 509, 504, 513 (berubah-ubah). Dari data tersebut bisa saja saya mengambil kesimpulan jika nilai zero rate levelnya adalah 507 (nilai tengahnya).

Pertanyaannya, mengapa nilainya tidak diam/statis? Jawabannya adalah sensor gyroscope bersifar dinamis, dimana sensor gyroscope mempunyai nilai saat terjadi  kecepatan sudut (angular rate). Sedangkan saat diam (tidak terjadi angular rate) maka nilainya adalah sama dengan zero rate level. Lalu nilainya yang berubah-ubah dikarenakan gyroscope mempunyai efek drift saat kondisi diam (saya tidak tahu istilah drift dalam bahasa indonesia). Hal ini adalah kebalikan dari sensor accelerometer, dimana sensor accelerometer bersifat statis. Oleh karena itu mengapa pada banyak aplikasi selalu menggabungkan dua buah sensor tersebut (gyroscope dan accelerometer).

Baiklah, berikut adalah cara melakukan kalibrasinya. Cara ini saya dapat dari program demo yang diberikan oleh PARALLAX Inc.

center (saya gunakan untuk mengganti istilah zero rate level)
data_gyro (hasil pembacaan ADC dari gyroscope melalui komunikasi SPI)

center(n)=(center(n-1)+data_gyro(n))/ n

dimana:
n = banyaknya sampling
center(n-1) = 0 (bernilai nol pada awalnya)

Semakin banyak n (sampling) maka semakin baik untuk mendapatkan nilai zero rate levelnya. Kalibrasi ini dilakukan hanya 1 kali pada awal program saja.

[MENGAKSES ADC SERIAL ADC101S021 ATAU SPI]

Untuk mengakses ADC serial ini menggunakan protokol komunikasi SPI dan saya menggunakan bahasa C dengan compiler CodeVision AVR untuk memprogramnya. Pada dasarnya compiler CodeVision AVR telah mempunyai library bawaan untuk mengakses SPI, tapi sayangnya library tersebut hanya untuk mengakses 8 bit data saja (aplikasi ini datanya 15 bit). Oleh karena itu saya membuat sebuah fungsi sendiri untuk mengaksesnya.

Untuk listing program lengkap dan schematic rangkaiannya dapat dilihat dibawah ini.

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>

char j=1, i=1, k=1, data[16], temp[16];
unsigned int data_gyro;
float center=0, sudut;

#asm
   .equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>

void baca_gyro()
{
    data_gyro=0;
    if (i==16){i=1;}
    if (j==16){j=1;}

    PORTB.4=1;//cs high
    delay_us(100);
    PORTB.4=0;//cs low, enable serial transfer —\___

    for(i=1;i<16;i++)
    {
    PORTB.7=1;//sclk high   
    delay_us(1);               
    PORTB.7=0;//sclk low —\___
    delay_us(1);

    if (PINB.6==1){data[j]=1;}//mengambil data per bit dari MISO  
    else data[j]=0;
    j++;
    }

    //perhitungan data ADC 10 bit, 3 bit zero leading dan 2 bit zero trailer tidak dihitung
    //data[1] sampai data[3] adalah bit leading dan data[14] sampai data[15] adalah bit trailer
    data_gyro=((data[4]*512)+(data[5]*256)+(data[6]*128)+(data[7]*64)+(data[8]*32)+(data[9]*16)+(data[10]*8)+(data[11]*4)+(data[12]*2)+(data[13]*1));               
}

void kalibrasi_gyro()
{
    for (k=1;k<10;k++)
    {
    baca_gyro();
    center=center+data_gyro;

    lcd_gotoxy(0,0);
    lcd_putsf(“CALIBRATING…”);

    lcd_gotoxy(0,1);
    ftoa(center,1,temp);
    lcd_puts(temp);
    delay_ms(200);
    }
    center=center/10;   
}

void sudut_gyro()
{
    sudut=data_gyro-center;
    sudut=sudut*-1;
}

void tampil_LCD()
{
    lcd_clear();
    itoa(data_gyro,temp);
    lcd_puts(temp);   

    lcd_gotoxy(0,1);
    ftoa(center,1,temp);
    lcd_puts(temp);   

    lcd_gotoxy(8,1);
    ftoa(sudut,1,temp);
    lcd_puts(temp);
}

void main(void)
{
PORTB=0xff;
DDRB=0×90;//pb7 dan pb4 output, sisanya input

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// LCD module initialization
lcd_init(16);
kalibrasi_gyro();

while (1)
      {
      baca_gyro();
      sudut_gyro();
      tampil_LCD();  
      delay_ms(100);     
      };
}

Untuk mendapatkan program file dalam bentuk CodeVision AVR silakan download link dibawah ini.

File program CodeVision AVR mengakses Modul Gyroscope LISY300 PARALLAX

Dibawah ini adalah beberapa panduan wajib jika ingin dapat mengakses Modul Gyroscope LISY300:

Datasheet LISY300AL (keluaran pabrikan)
Datasheet Modul Gyroscope LISY300 (keluaran PARALLAX)
Schematic Modul Gyroscope LISY300 (keluaran PARALLAX)
Datasheet serial ADC101S021

Semoga bermanfaat…

 
Leave a comment

Posted by on June 20, 2011 in AVR Projects

 

Tags: , , , ,

SIMPLE STOPWATCH MENGGUNAKAN MIKROKONTROLER DENGAN CODEVISION AVR

Aplikasi ini merupakan sebuah stopwatch sederhana yang dapat menghitung sampai satuan waktu terkecil yaitu 1/100 detik atau 10 ms. Untuk membangkitkan timer 10 ms saya menggunakan fitur timer0 mikrokontroler AVR. Untuk lebih jelas mengenai fitur timer AVR silakan baca postingan saya mengenai tutorial Timer dan Counter AVR.

Pada aplikasi ini terdapat 3 buah tombol (push button) yang terdiri dari tombol START, STOP dan RESET. Tombol START digunakan untuk memulai stopwatch,  STOP digunakan untuk memberhentikan stowatch dan tombol RESET untuk me-reset (menset ulang kembali nilai stopwatch).

Saya juga menyertakan program dalam file CodeVision AVR dan file simulasi proteus pada akhir artikel ini. Berikut adalah schematik rangkaiannya.

Sedangkan setting untuk CodeWizard AVR adalah sebagai berikut:

Berikut adalah listimg program lengkapnya:

unsigned char count, temp[16], indeks=0, detik=0, menit=0, jam=0;

#include <mega16.h>
#include <stdio.h>
#include <stdlib.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x8A;
count++;
}

void hitung_waktu()
{
if (count>=100)
    {
    lcd_clear();
    detik++;
    count=0;
    }

if (detik>=60)
    {
    menit++;
    detik=0;
    }

if (menit>=60)
    {
    jam++;
    menit=0;
    }
}

void detek_tombol()
{
if (PINA.0==0 && (indeks==0 || indeks==2))//start timer
    {
    indeks=1;
    TIMSK=0×01;//memulai timer
    lcd_clear();
    }

if (PINA.1==0 && indeks==1)//stop timer
    {   
    indeks=2;
    TIMSK=0×00;//menstop timer
    lcd_clear();
    }

if (PINA.2==0 && indeks==2)//reset timer
    {   
    indeks=0;//semua data direset
    count=0;
    detik=0;
    menit=0;
    jam=0;   
    lcd_clear();
    }
}

void tampil_lcd()
{
lcd_gotoxy(0,0);
sprintf(temp,”Timer %d:%d:%d:%d”,jam,menit,detik,count);
lcd_puts(temp);//tampilkan waktu di LCD baris pertama

if (indeks==0)
    {
    lcd_gotoxy(0,1);
    lcd_putsf(“START”);
    }   

if (indeks==1)
    {
    lcd_gotoxy(0,1);
    lcd_putsf(“STOP”);
    }    

if (indeks==2)
    {
    lcd_gotoxy(0,1);
    lcd_putsf(“START      RESET”);
    }
}

void main(void)
{
PORTA=0x0f;
DDRA=0×00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0×05;
TCNT0=0x8A;
OCR0=0×00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm(“sei”)

while (1)
      {
      detek_tombol();
      hitung_waktu();
      tampil_lcd();
      };
}

Untuk file program CodeVision AVR dan file simulasi Proteus silakan download link dibawah ini.

File program CodeVision AVR dan file simulasi Proteus

Semoga bermanfaat…

 
9 Comments

Posted by on June 12, 2011 in AVR Projects

 

Tags: , , ,

JAM DIGITAL MENGGUNAKAN RTC DS1307 DENGAN CODEVISION AVR

RTC DS1307 berkomunikasi dengan antarmuka I2C (Inter Integrated Circuit). RTC DS1307 memiliki pewaktu dalam variabel detik, menit, jam, hari, tanggal, bulan dan tahun. Selain itu, RTC ini menyediakan pin battery-backup untuk dihubungkan pada baterai lithium 3V atau catu daya lain sehingga ketika power (catu daya) mati, battery-backup akan mengambil alih dan timer tetap akan berjalan sebagaimana mestinya. Sedangkan kristal yang digunakan menurut datasheet bernilai 32,768 KHz. Untuk mendapatkan datasheet DS1307 silakan download disini.

Dengan menggunakan bantuan pada CodeWizardAVR pada Codevision AVR, yang sudah terdapat library untuk DS1307, maka kita akan dengan mudah dapat mengakses RTC DS1307. Setting seperti gambar dibawah ini:

Dan menurut CodeVisionAVR Help, terdapat beberapa instruksi untuk mengakses DS1307:

void rtc_init(unsigned char rs, unsigned char sqwe, unsigned char out)
Instruksi ini untuk inisialisasi DS1307, dimana:
Parameter rs digunakan untuk menghasilkan nilai dari frekuensi gelombang kotak pada pin SQW/OUT DS1307:
Jika rs bernilai:
0 untuk 1 Hz
1 untuk 4096 Hz
2 untuk 8192 Hz
3 untuk 32768 Hz
Jika parameter sqwe bernilai 1 maka output gelombang kotak pada pin SQW/OUT DS1307 akan di enable.
Parameter out merupakan level logika pada pin SQW/OUT saat output gelombang kotak di disable (sqwe=0)

void rtc_get_time(unsigned char *hour, unsigned char *min, unsigned char *sec)
Intruksi ini untuk mendapatkan nilai *hour (jam), *min (menit) dan *sec (detik). Untuk variabel hour, min dan sec dapat kita ganti namanya sesuai keinginan kita tetapi harus bertipe data unsigned char.

void rtc_get_date(unsigned char *date, unsigned char *month, unsigned char *year)
Intruksi ini untuk mendapatkan nilai *date (tanggal), *month (bulan) dan *year  (tahun). Untuk variabel date, month dan year dapat kita ganti namanya sesuai keinginan kita tetapi harus bertipe data unsigned char.

void rtc_set_time(unsigned char hour, unsigned char min, unsigned char sec)
intruksi ini digunakan untuk menset nilai hour (jam), min (menit) dan sec (detik) sesuai keinginan kita.

void rtc_set_date(unsigned char date, unsigned char month, unsigned char year)
intruksi ini digunakan untuk menset nilai date (tanggal), month (bulan) dan year (tahun) sesuai keinginan kita.

Dibawah ini adalah listing program lengkapnya:

unsigned char h, m, s, d, mo, y, temp[16];
/*
h=hour, m=minute, s=second
d=day, mo=month, y=year
*/

#include <mega16.h>
#include <stdio.h>
#include <delay.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x1B ;PORTA
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>

void main(void)
{
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// I2C Bus initialization
i2c_init();                                                                         
rtc_init(0,0,0);
lcd_init(16);

//rtc_set_time(9,10,26); //untuk menset jam 09:10:26
//rtc_set_date(8,11,87); //untuk menset tanggal: 8 nov 1987

while (1)
      {         
        rtc_get_time(&h,&m,&s); //mendapatkan nilai  jam, menit dan detik
        rtc_get_date(&d,&mo,&y); //mendapatkan nilai tanggal, bulan dan tahun

        lcd_gotoxy(0,0);
        sprintf(temp,”Time %d:%d:%d”,h,m,s);
        lcd_puts(temp);//tampilkan jam di LCD baris pertama

        lcd_gotoxy(0,1);
        sprintf(temp,”Date %d-%d-%d”,d,mo,y);
        lcd_puts(temp);//tampilkan tanggal di LCD baris kedua
      };
}

Untuk file program dalam bentuk CodeVision AVR dan file simulasi Proteus silakan download link dibawah ini.

File program dalam CodeVision AVR dan file simulasi Proteus.

Semoga bermanfaat…

 
43 Comments

Posted by on June 8, 2011 in AVR Projects

 

Tags: , , , ,

PENGUKURAN NEGATIVE THEMPERATURE (MINUS) MENGGUNAKAN LM35 DENGAN CODEVISION AVR

Menurut datasheet, LM35 dapat mengukur dengan range -55° sampai 150°C dengan akurasi 0,5°C. Untuk lebih jelasnya dapat dibaca pada datasheet. Untuk mendapatkan datasheet LM35 silakan download disini. Aplikasi ini pun telah saya simulasikan menggunakan software proteus, dan mempunyai hasil yang sangat presisi untuk pembacaannya. Dibawah ini adalah schematic rangkaiannya:

Sedangkan untuk listing program lengkapnya adalah sebagai berikut, pada akhir postingan ini saya juga menyertakan file program dalam codevision AVR serta file simulasi proteus.

#include <mega16.h>
#include <lcd.h>
#include <delay.h>
#include <stdlib.h>

int data1, data2;
float suhu_minus;
char temp[8];

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0×15 ;PORTC
#endasm

#define ADC_VREF_TYPE 0×40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0×10)==0);
ADCSRA|=0×10;
return ADCW;
}

void ambil_dataADC()
{
data1=read_adc(0);
data2=read_adc(1);
}

void hitung_suhu_minus()
{
suhu_minus=(float)(data1-data2)/2;//rumus mencari suhu minus
}

void tampil_LDC()
{
lcd_gotoxy(0,0);
lcd_putsf(“ElectrO-cOntrOl”);

ftoa(suhu_minus,1,temp);//float to array
lcd_gotoxy(0,1);  
lcd_puts(temp);

lcd_gotoxy(5,1);
lcd_putchar(0xdf);//menampilkan karakter derajat
lcd_putsf(“C”);
}

void main(void)
{

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0×84;

// LCD module initialization
lcd_init(16);

while (1)
      {
      ambil_dataADC();
      hitung_suhu_minus();
      tampil_LDC();
      delay_ms(500);
      };
}

Untuk mendapatkan file program dalam bentuk CodeVision AVR dan file simulasi proteus untuk aplikasi pengukuran temperatur negatif silakan download link dibawah ini.

File program CodeVision AVR dan file simulasi Proteus

Semoga bermanfaat…

 
3 Comments

Posted by on June 2, 2011 in AVR Projects

 

Tags: , , ,

COUNTER (PENGHITUNG) 0-9999 MENGGUNAKAN PENAMPIL SEVEN SEGMENT DENGAN CODEVISION AVR

Pada aplikasi counter 0-9999 saya menggunakan fitur timer/counter1 yang dapat menghitung sampai 65536 (16 bit). Untuk lebih jelasnya mengenai timer dan counter AVR, dapat membaca postingan saya di tutorial timer dan counter AVR.

Dikarenakan saya menggunakan 4 buah seven segment tipe CA (common anoda), maka hanya dapat menampilkan maksimal 9999 penghitungan. Untuk mendapatkan datasheet penampil seven segment silakan download disini. Metode yang saya gunakan untuk menampilkan di seven segment adalah metode scanning, untuk lebih jelasnya tentang seven segment silakan baca tutorial seven segment. Jika penghitungan telah mencapai 10000 maka akan saya set kembali menjadi 0000. Berikut adalah schematic rangkaiannya.Input timer/counter1 berasal dari pin PB1(T1), dimana untuk aplikasi ini saya menggunakan sebuah push button sebagai inputnya. Pada program yang saya buat, jika terjadi perubahan logika dari high ke low (falling edge) maka akan dideteksi sebagai input counter. Untuk input yang berupa push button diatas dapat diganti menggunakan sensor yang sesungguhnya. Berikut adalah listing program lengkapnya:

#include <mega16.h>
#include <delay.h>

int data, data_temp;
char ribuan, ratusan, puluhan, satuan, ubah;

void ambil_data_counter()
{
    if (TCNT1==10000){TCNT1=0;}//jika counter bernilai 10000 maka kembali lagi ke 0000
    data=TCNT1;//nilai dari register counter1 diumpankan ke data
}

void tampil_7segment()
{
      PORTC=ribuan;//mengirimkan data ribuan
      PORTD=0b11110111;//menyalakan digit1
      delay_ms(5);

      PORTC=ratusan;//mengirimkan data ratusan
      PORTD=0b11111011;//menyalakan digit2
      delay_ms(5);

      PORTC=puluhan;//mengirimkan data puluhan
      PORTD=0b11111101;//menyalakan digit3
      delay_ms(5);

      PORTC=satuan;//mengirimkan data satuan
      PORTD=0b11111110;//menyalakan digit4
      delay_ms(5);
      //lamanya waktu scanning ditentukan oleh intruksi delay
}

void ubah_ke_format7segment()//fungsi untuk mengubah kedalam format 7segment
{
      if (ubah==0){ubah=0xc0;}
      if (ubah==1){ubah=0xf9;}
      if (ubah==2){ubah=0xa4;}
      if (ubah==3){ubah=0xb0;}
      if (ubah==4){ubah=0×99;}
      if (ubah==5){ubah=0×92;}
      if (ubah==6){ubah=0×82;}
      if (ubah==7){ubah=0xf8;}
      if (ubah==8){ubah=0×80;}
      if (ubah==9){ubah=0×90;}
}

void ambil_nilai_tiap_digit()
{
      data_temp=data;
      satuan=data_temp%10;//sisa dari pembagian disimpan di variabel satuan
      ubah=satuan;
      ubah_ke_format7segment();//panggil fungsi mengubah kedalam format 7segment
      satuan=ubah;

      data_temp=data_temp/10;
      puluhan=data_temp%10;
      ubah=puluhan;
      ubah_ke_format7segment();
      puluhan=ubah;

      data_temp=data_temp/10;
      ratusan=data_temp%10;
      ubah=ratusan;
      ubah_ke_format7segment();
      ratusan=ubah;

      data_temp=data_temp/10;
      ribuan=data_temp%10;
      ubah=ribuan;
      ubah_ke_format7segment();
      ribuan=ubah;
}

void main(void)
{
PORTC=0xff;
DDRC=0xff;

PORTD=0x0f;
DDRD=0x0f;

// Timer/Counter 1 initialization
// Clock source: T1 pin Falling Edge
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0×00;
TCCR1B=0×06;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

while (1)
      {
      ambil_data_counter();
      ambil_nilai_tiap_digit();
      tampil_7segment();
      };
}

Untuk mendapatkan file program dalam bentuk CodeVision AVR dapat didownload pada link dibawah ini.

File program CodeVision AVR

Semoga bermanfaat…

 
8 Comments

Posted by on June 1, 2011 in AVR Projects

 

Tags: , ,

PENGISIAN TANGKI (TANDON) AIR OTOMATIS MENGGUNAKAN ATMEGA8535

Beberapa bulan yang lalu saya telah membuat aplikasi pengisian tangki air otomatis menggunakan mikrokontroler. Mungkin aplikasi ini sangat sederhana dan terbilang cukup mahal jika menggunakan mikrokontroler, dikarenakan dipasaran sudah banyak yang menjual sensor level air menggunakan bandul dan sudah mempunyai output untuk relay. Tetapi tidak ada salahnya jika kita mencoba membuatnya menggunakan mikrokontroler, anggap saja sebagai latihan.

Pada aplikasi ini saya menggunakan prinsip penekanan push button sebagai cara untuk mendeteksi level air (sensor level air). Terdapat 2 buah sensor level air yaitu MAX dan MIN, sedangkan GND digunakan untuk mendeteksi sensor mana yang sedang terbaca. Cara kerjanya jika air berada dibawah sensor MIN maka sensor MIN (PC3) akan belogika high. Kemudian jika air berada diatas sensor MIN maka sensor MIN (PC3) akan berlogika low (terhubung ke GND karena terkena air). Begitu juga untuk sensor MAX (PC2), jika air sudah penuh (menyentuh sensor MAX) maka yang awalnya sensor MAX (PC2) berlogika high akan berubah menjadi low.

Dengan kata lain jika tangki air sedang kosong maka sensor MIN dan MAX akan berlogika high dan jika air sudah penuh sensor MIN dan sensor MAX akan berlogika low.

Kemudian terdapat duah buah saklar yaitu saklar MODE dan POMPA. Saklar MODE digunakan untuk pemilihan mode yaitu otomatis dan manual. Jika mode otomatis maka motor pompa akan bekerja (mengisi) jika tangki air sedang kosong (dibawah sensor MIN), dan akan berhenti mengisi ketika terdeteksi sensor MAX (penuh). Untuk mode manual motor pompa dapat dinyalakan secara manual menggunakan saklar POMPA, jika dinyalakan motor pompa tersebut dan air sudah penuh, maka saya buat motor pompa tersebut mati dengan sendirinya. Dan terdapat beberapa LED yang digunakan sebagai indikator untuk masing-masing parameter.


Berikut adalah listing program lengkapnya:

//kondisi=0 adalah keadaan kosong,
//kondisi=1 adalah keadaan penuh,
//penggunaan variabel kondisi berfungsi sebagai penghilang
//efek bouncing yg disebabkan oleh gelombang air
bit kondisi;

#include <mega16.h>

#define pompa PORTA.0
#define ind_pompa PORTA.5
#define ind_min PORTA.7
#define ind_max PORTA.6
#define mode PINC.0
#define on_off PINC.1
#define maxim PINC.2
#define minim PINC.3

void otomatis()//pemilihan mode otomatis
{
if  (mode==1)//mode otomatis
  {
    if (kondisi==0)
    {
        if (maxim==1)//kosong   
            {
            pompa=0;
            ind_pompa=0;       
            }  

         if (maxim==0)//penuh
            {        
            pompa=1;
            ind_pompa=1;
            kondisi=1;
            }
    }                 

    if (kondisi==1)
    {        
        if (minim==1)
        {
        kondisi=0;
        }
    }       
  }
}    

void manual()//pemilihan mode manual
{
if  (mode==0)//manual
    {
     if (maxim==0)
       {
              pompa=1;
              ind_pompa=1;
       }
    else
       {
        if (on_off==0)
            {  
            pompa=0;
            ind_pompa=0;
            }
        else  
            {
            pompa=1;
            ind_pompa=1;
            }
       }
    }
}

void indikator()//menyalakan indikator LED MIN dan MAX
{
if (maxim==0) ind_max=0;
    else ind_max=1;
if (minim==0) ind_min=0;  
    else ind_min=1;
}

void main(void)
{
DDRA=0xff;   //inisialisasi port mikro
PORTA=0xff;
DDRC=0×00;
PORTC=0xff;

while (1)
      {
      otomatis();
      manual();
      indikator();
      };
}

Untuk mendapatkan file program dalam bentuk CodeVision AVR silakan download pada link dibawah ini.

File program CodeVision AVR pengisian tangki air otomatis

Semoga bermanfaat…

 
Leave a comment

Posted by on May 31, 2011 in AVR Projects

 

Tags: , , , , ,

 
Follow

Get every new post delivered to your Inbox.