APLIKASI

Selasa, 09 April 2013

Fungsi Mid di Bahasa C dengan Codevision Avr, Arduino dan Atmel studio


Fungsi Mid adalah fungsi yang digunakan untuk mengambil beberapa karakter dari data.
misalkan saya mau mengambil data nama depan saya saja.
dim data as string
dim pecahData as string

data="edy prasetiyo"
pecahData=mid(data,1,3)
Texbox1.text= pecahData
data yg tampil di textbox adalah "edy", lantas di codevision avr atau software semacamnya yg menggunakan bahasa C(arduino, atmel studio, dll) bisa tidak kita menggunakan fungsi mid. tentu saja bisa. namun stau saya codevision avr tidak menyediakan fungsi tersebut..
namun kita bisa membuatnya..
berikut listing progam di Codevision Avr yang akan di tampilkan di lcd lewat simulasi proteus.


 #include <mega16.h>  
 #include <string.h>  
 #include <stdlib.h>  
 #include <stdio.h>  
 // Alphanumeric LCD functions  
 #include <alcd.h>  
 /*****************fungsi mid**********************/  
 char* mid(char data[],int awal,int akhir){  
 int p_karakter =strlen(data);  
 static char dataMid[p_karakter];  
 int ulang;  
 int index=0;  
 for(ulang=awal;ulang<akhir+awal;ulang++){  
 dataMid[index]=data[ulang];  
 index++;  
 }   
 dataMid[index]='\0';  
 return dataMid;  
 }  
 /**************deklarasi variabel*********************/  
 char a[]="Edy Prasetiyo";  
 char b[];  
 /********************main**************************/  
 void main(void)  
 {  
 // Alphanumeric LCD initialization  
 // Connections are specified in the  
 // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:  
 // RS - PORTC Bit 0  
 // RD - PORTC Bit 1  
 // EN - PORTC Bit 2  
 // D4 - PORTC Bit 4  
 // D5 - PORTC Bit 5  
 // D6 - PORTC Bit 6  
 // D7 - PORTC Bit 7  
 // Characters/line: 16  
 lcd_init(16);  
 lcd_gotoxy(0,0);  
 lcd_puts(a);  
 /*ambil data edy prasetiyo   
 *************0123456789xxx  
 ambil data mulai dari index ke 0 sebanyak 2 karakter kekanan  
 */  
 strcpy(b,mid(a,0,2));  
 lcd_gotoxy(0,1);  
 lcd_puts(b);  
 while (1)  
    {  
    // Place your code here  
    }  
 }  



hasil simulasinya


Penjelasan

- Fungsi Mid
char* mid(char data[],int awal,int akhir){
int p_karakter =strlen(data);
static char dataMid[p_karakter];
int ulang;
int index=0;
for(ulang=awal;ulangdataMid[index]=data[ulang];
index++;

dataMid[index]='\0';
return dataMid;
}


coding di atas untuk memecah data
strcpy(b,mid(a,0,2)) ,ambil data string a, mulai dari index ke 0 sebanyak 2 karakter kekanan, kemudian di kopi ke varibel b. mengapa tidak b=mid(a,0,2) .. string di codevision menggunakan kumpulan data array (char),jadi untuk mengkopinya, kita haru harus menggunakan sintaks strcpy , mungkin singkatannya stringcopy...


silakan download contoh progam dan simulasi nya di sini
pass : cintakupadamutakakanpernahpadam

Progam Input Output digital Ala Arduino di Codevision avr.

Apa mungkin  Liblary arduino di gunakan di codevision?? Tentu saja mungkin, tetapi jika hanya di copas code dari arduino ke Cavr ada kemungkinan error karna fungsi bawaan yang di buat masing2 software agak berbeda. Tapi kalo ditiru pasti bias,, Contohnya untuk progam INPUT/OUTPUT di arduino, mari kita belajar bersama..
Pada pin arduino lebih di kenal D0,D1…..D13 , dan A0-A15 untuk pin analog. Gambar di bawah ini adalah mapping pin arduino dengan atmega 8/168/328.
 
sumber klik
 

Pada Codevision AVR biasa di tulis dengan instruksi DDRD,PORT dan PIN. D
Pada kesempatan Kali ini fungsi digitalWrite (output), digitalRead(baca Input),pinMode (setting I/0) akan di tulis di Codevision Avr..
berikut contoh progam untuk membaca input  dan mengeluarkan output.


1:  #include <mega168.h> // atau mega8.h  
2:  #include <delay.h>  
3:  #define LOW 0  
4:  #define HIGH 1  
5:  #define OUTPUT 1  
6:  #define INPUT 0  
7:  #define INPUT_PULLUP 2  
8:  unsigned char digitalRead(unsigned char P) {  
9:    if (P>=0 && P<=7){if(PIND & (1 << P)){  
10:    return HIGH;}else{return LOW;}}   
11:       else if (P>=8 && P<=13){if(PINB & (1 << P-8)) {  
12:    return HIGH;}else{return LOW;}}   
13:       else if (P>=14 && P<21){if(PINC & (1 << P-14)){  
14:    return HIGH;}else{return LOW;}} }   
15:  /*************************************************************/    
16:  void digitalWrite(unsigned char P,unsigned char ST) {   
17:       if(P>=0 && P<=7){if(ST == HIGH){(PORTD |= (1 << P))}  
18:    else{ (PORTD &= ~(1 << P)); }}  
19:       else if (P>=8 && P<=13){if(ST == HIGH){  
20:    (PORTB |= (1 << P-8)); }else{ (PORTB &= ~(1 << P-9)); }}  
21:       else if (P>=14){if(ST == HIGH){  
22:    (PORTC |= (1 << P-14)); }else{ (PORTC &= ~(1 << P-14)); }}}  
23:  /*************************************************************/                      
24:  void pinMode(unsigned char P,unsigned char ST) {  
25:       if(P>=0 && P<=7){ if(ST == OUTPUT){ DDRD|= (1 << P); }  
26:    else{DDRD &= ~(1 << P); if(ST==INPUT_PULLUP){PORTD|=(1<<P);}}}  
27:    else if(P>=8 && P<14){if(ST == OUTPUT){ DDRB|= (1 << P-8); }  
28:    else{DDRB &= ~(1 << P-8);if(ST==INPUT_PULLUP){PORTB|=(1<<P-8);}}}  
29:    else if(P>=14 && P<21){if(ST == OUTPUT){DDRC |=(1 << P-14); }  
30:    else{DDRC &= ~(1 << P-14);if(ST==INPUT_PULLUP){PORTC|=(1<<P-14);}}}}  
31:  /*************************************************************/  
32:  void main(void){   
33:  // setting I/O  
34:  pinMode(0,INPUT_PULLUP);  
35:  pinMode(1,OUTPUT);  
36:    while(1) // LOOPING  
37:    {  
38:     if(digitalRead(0)==LOW){  
39:     digitalWrite(1,HIGH);  
40:     }  
41:     if(digitalRead(0)==HIGH){  
42:     digitalWrite(1,LOW);  
43:     }  
44:    }  
45:  }  

 Penjelasan  
 pinMode(0,INPUT_PULLUP);  
 membuat pin D0 sebagai Input dan di beri PULLUP INTERNAL.  
 pinMode(1,OUTPUT);  
 membuat pin D1 sebagai output.  
 if(digitalRead(0)==LOW){digitalWrite(1,HIGH);  
 jika pin D0 diberi LOW, maka pin D1 bernilai HIGH.  
 if(digitalRead(0)==HIGH){digitalWrite(1,LOW);}  
 jika pin D0 diberi HIGH, maka pin D1 bernilai LOW.  
 Sekian, Semoga bermanfaat ya…  

Minggu, 07 April 2013

Array 3 Dimensi Pada Codevision Avr


Array? Apaan sih array itu, 
ARRAY bukan "ALLAY", kecuali untuk orang cadel.. hehhehehe.
Array adalah himpunan elemen (variable) dengan tipe yang sama dan disimpan secara berurutan dalam memory yang ditandai dengan memberikan index pada suatu nama variable. Contohnya, kita dapat menyimpan 5 nilai dengan tipe int tanpa harus mendeklarasikan 5 identifier variabel yang berbeda. Perhatikan contoh dibawah ini  :

Inisialisasi Array
Int uangJajan [5]={ 100,200,300,400,500 };
Dan nilai array tergantung dari indeksnya

uangJajan [0] nilainya 100
uangJajan [1] nilainya 200
uangJajan [2] nilainya 300
uangJajan [3] nilainya 400
uangJajan [4] nilainya 100

coba tanpa array..
Int uangJajan_0 = 100
Int uangJajan_1 = 200
Int uangJajan_2 = 300
Int uangJajan_3 = 400
Int uangJajan_4 = 500

5 kali inisialisasi,,
kalo pusing sama teori langsung kita praktekkan saja. Agar dari praktek menjadi Teori….

Ok saya contohkan array 3 dimensi untuk menampilkan nilai di 7 segment, lah kok 7 segment saja pakai array 3 dimensi?? Siapa tau ada dosen yang memberikan tugas seperti ini, lumayan lah tinggal copas..

7 segment? Sudah tau kan 7 segment itu apa? Kalau belum silakan cari referensinya di mbah google.
 
Gambar d atas keterangan pin dari 7 segment.
Dan saya buat data Tabel untuk menyalakan 7 segment.


 
Jadi pada saat kita menulis PORTC=0x66, maka 7 segment akan membentuk angka “4”
Lewat simulasi proteus perhatikan gambar di bawah ini..!!


Berikut listing progam di Codevision Avr

1:  #include <mega16.h>   
2:  #include <delay.h>  
3:  //tabel untuk 7 segment  
4:  unsigned char s_segment [10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7D, 0x07, 0x7F,0x6f};  
5:  unsigned char data[1][2][10];  
6:  int ayam;  
7:  int bebek;  
8:  const int delay=500;  
9:  void main(void)  
10:  {  
11:  // inisialisasi port  
12:  DDRC=255;  
13:  for (ayam=0;ayam<10;ayam++){  
14:  data[0][0][ayam]=s_segment[ayam];  
15:  }  // akhir for  
16:  bebek=9;  
17:  for (ayam=0;ayam<10;ayam++){  
18:  data[0][1][ayam]=s_segment[bebek];  
19:  bebek--;  
20:  }  // akhir for  
21:  PORTC= data[0][0][9];  
22:  while (1)  
23:  {  
24:  for (ayam=0;ayam<10;ayam++){  
25:  PORTC=data[0][0][ayam];  
26:  delay_ms(delay);  
27:  } // akhir for  
28:  for (ayam=0;ayam<10;ayam++){  
29:  PORTC=data[0][1][ayam];  
30:  delay_ms(delay);  
31:  }   // akhir for  
32:  };  // akhir while(1)  
33:  };  // akhir void  

Penjelasan progam
 
Kita buat table untuk 7 segmentnya
unsigned char s_segment [10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7D, 0x07, 0x7F,0x6f};

s_segment[0]=0x3f angka 0
s_segment[1]=0x06 angka 1
.................
s_segment[9]=0x6f  angka 9

kita buat array 3 dimensi(siap2 pusing)
unsigned data[1][2][10];

berarti ada data[0] [0 dan 1][0  s/d 9 ]
selanjutnya kita pindahkan data table 7 segment untuk menghitung maju ke array

 for (ayam=0;ayam<10;ayam++){  
 data[0][0][ayam]=s_segment[ayam];  
 }  // akhir for  
 
Data[0][0][ayam]= data[0][0][ayam]=s_segment[ayam], berarti jika nillai ayam=0, maka pada saat mengeksekusi data[0][0][ayam] nilainya adalah 0x3f (s_segment[0]),
Jika nilai ayam=1
data[0][0][ayam] nilainya adalah 0x06 (s_segment[1])
Begitu juga seterusnya selama nilai variable ayam kurang dari 10.
selanjutnya kita pindahkan data table 7 segment untuk menghitung mundur ke array

 bebek=9;  
 for (ayam=0;ayam<10;ayam++){  
 data[0][1][ayam]=s_segment[bebek];  
 bebek--;  
 }  // akhir for  

data[0][1][ayam]=s_segment[bebek], sama seperti diatas, bedanya ada variable bebek.. coba perhatikan lagi di depan layar computer anda (Konsentrasi….!!!!!!!!).
nilai bebek = 9
berarti jika nilai ayam = 0, maka data[0][1][ayam]= 0x6f (s_segment[9])
bebek --, nilai bebek = bebek-1, berarti nilai bebek sekarang adalah 8..


jika nilai ayam = 1, maka data[0][1][ayam]= 0x7f (s_segment[8])
dst selama nilai variabel ayam kurang dari 10..

sekarang berarti ada 2 data
pertama data 7 segment untuk menghitung maju pada data[0][0] dan kedua data 7 segment untuk menghitung mundur data[0][1] .

Lah kok Cuma 2 tanda [], sebelumnya kan ada 3 tanda [],, silakan anda cari materi array 3 dimensi bahasa C di mbah goggle… pasti di jawab kok sama mbah google, kalo ga di jawab, coba cek koneksi internet anda.. hehehhe

Mari kita tampilkan data arraynya untuk menghitung maju pada 7 segment


 for (ayam=0;ayam<10;ayam++){  
 PORTC=data[0][0][ayam];  
 delay_ms(delay);  
 } // akhir for  
 Jika nilai ayam =0 maka nilai PORTC adalah indeks ke 0 dari data [0][0] nilainya adalah 0x3f  
 Dst selama nilai variabel array kurang dari 10.  
 tampilkan data arraynya untuk menghitung mundur pada 7 segment.  
 for (ayam=0;ayam<10;ayam++){  
 PORTC=data[0][1][ayam];  
 delay_ms(delay);  
 }   // akhir for  
 Sama seperti sebelumnya tapi datanya bebeda. jika nilai = 0, maka nilai dari PORTC=0x6f..  
 dst sampai nilai ayam <10  


Selesai
Kenapa saya menulis variabelnya ayam/ bebek? kadang pemula seperti saya agak sulit memahami sebuah variabel. Misalakan int a? apakah harus a? tidak, anda dapat mengganti a dengan apa saja sesuai dengan peraturan Bahasa C,, buat lah koding itu menyenangkan….bahkan “LUCU”
Satu lagi 7 segment yang saya gunakan tipe katoda, jadi kalau ingin menggunakan tipe anoda.. silakan ganti data arraynya.. atau pusing di progam? Tambahkan saja gerbang not (7404) pada output mikro… tinggal pilih ngakalin di software atau hardware??


Download di sini contoh progam dan simulasinya..
password zip : cintakupadamutakakanpernahpadam