AVR dengan package 40-pin PDIP, contoh ATmega 8535 memiliki 32 I/O lines. Masing-masing lines dapat diatur fungsinya. Sebagian dari lines-lines I/O tersebut ada yang memilki fungsi-fungsi khusus, seperti ADC, Analog Comparator, PWM, USART dan External Interrupt. Kali ini kita akan membahas basicnya dulu.
Fungsi dasar dari setiap pin microcontroller adalah:
membaca perubahan level tegangan apakah 0 atau 5 volt (jika digunakan sebagai input)
mengeluarkan tegangan sebesar 0 atau 5 volt (jika digunakan sebagai output)
Microcontroller AVR memiliki 2 register yang berhubungan dengan fungsi dasar ini, yaitu:
1. Register DDRx
DDRx ( x adalah port micro yang digunakan ).
Misal: menggunakan Port A berarti registernya DDRA.
Register ini berfungsi untuk mengatur arah Pin/Port micro. Apakah dipakai sebagai input atau output.
Nilai register ini sebesar 8 bit. Setiap bit mewakili masing-masing pin kaki micro.
Jika pin kaki micro digunakan sebagai input maka register DDRx nya harus bernilai 0 (nol).
Jika pin kaki micro digunakan sebagai output maka register DDRx nya harus bernilai 1.
Misal Port A akan digunakan sebagai input maka untuk mensetnya kita gunakan perintah:
DDRA= 0x00;
//ini berarti seluruh pin-pin pada Port A digunakan sebagai input
Contoh:
Port A.0 dijadikan input sedangkan Port A.2 ..sampai.. Port A.7 digunakan sebagai output maka perintahnya:
DDRA= 0xFE;
0xFE (heksa) == 0b 1111 1110 (biner)
Perhatikan baik-baik konversi biner diatas!! Setiap bit nilai biner mewakili Pin-Pin pada PortA.
Amati dan pahami betul gambar di samping.
Port A.0 sebagai Input karena nilai DDRnya 0 (nol).
Port A.1 sampai Port A.7 sebagi Output karena nilai DDRnya 1.
2. Register PORTx
PORTx ( x adalah port micro yang digunakan ).
Misal: menggunakan Port A berarti registernya PORTA.
Jika Port digunakan sebagai input register ini berfungsi sebagai penentu apakah kondisi Port di Pull Up atau Floating.
Jika Port digunakan sebagai output register ini menentukan kondisi Port High atau Low.
Untuk memahami apa arti Pull Up perhatikan gambar berikut:
Pin 1. dihubungkan ke VCC(tegangan 5 Volt) melalui resistor (R), inilah yang di maksud dengan Pull Up. Saat tidak ada tegangan dari luar Pin 1 akan cenderung berkondisi High (1)
Pin 2. dibiarkan begitu saja sehingga kondisi logic Pin2 rentan terhadap pengaruh sekitarnya. Pin 2. bisa berlogika high bisa juga berlogika low ini artinya logika Pin2 ngambang (Floating).
Kondisi floating biasanya diperlukan saat Pin sebuah IC atau micro dihubungkan ke sensor. Karena jika di Pull Up dikhawatirkan kondisi logic Pin IC mengganggu kondisi logic pin-pin sensor.
Perhatikan code program berikut:
DDRA=0x00;
PORTA = 0xFF;
ini berarti seluruh pin-pin pada Port A sebagai Input dan di Pull Up.
Perhatikan code program berikut:
DDRB= 0x00;
PORTB=0x0F;
0x0F == 0b 0000 1111
berarti :
Seluruh pin-pin PortB dijadikan Input
PortB.0 ..sampai.. PortB.3 di Pull Up
PortB.4 ..sampai.. PortB.7 dalam keadaan Floating
Example:
- mengelurakan Output ke PortC dengan nilai 0x BB
#include <mega8535.h>
void main()
{
DDRC= 0xFF; //Port C sebagai Output
PORTC= 0x BB; //mengeluarkan nilai 0x BB ke Port C
}
2. membaca input di PORT A dan mengeluarkan nilainya ke PORT D
#include <mega8535.h>
void main()
{
DDRA= 0x00; //Port A sebagai Input
PORTA= 0xFF; //Port A di Pull Up
//karena tidak terhubung ke sensor, PortA di Pull Up agar kondisi logic nya tidak kacau
DDRD=0xFF; //Port D sebagai Output
while(1) //Infinite Looping (agar program dibawah ini dijalankan terus menerus)
{
PORTD=PINA; //kondisi PORTD sama dengan PORTA
}
}
NB 1:
Amati lagi baris program:
PORTD=PINA;
Mengapa tidak ditulis
PORTD=PORTA;
Hal ini tidak bisa dilakukan, dalam AVR kondisi input masuk ke register PINx.
Untuk membaca input, gunakan PINx bukan PORTx.
NB 2:
Apa itu Infinite Looping??
Infinite : tak terbatas, tak terhingga
Looping : perulangan, pengulangan, perputaran
Infinite Looping adalah perulangan(looping) yang dijalankan terus menerus. INGAT!!! code program yang dijalankan AVR adalah code program yang berada dalam fungsi utama:
void main()
{
..............................//code program
.............................//code program
}
Program dijalankan berurutan dari atas ke bawah dan program tersebut hanya akan dijalankan sekali. Dengan memakai infinite looping Code Program yang berada di dalam infinite looping akan dijalankan terus menerus.
void main()
{
...................//code program di luar infinite looping. Hanya dijalankan sekali
...................//code program di luar infinite looping. Hanya dijalankan sekali
while(1) //infinite looping
{
..................................//code program dalam infinite looping
.................................//code program dalam infinite looping
}
}
Untuk keluar dari infinite looping gunakan perintah
break;
Mengapa terjadi Infinite Looping ??
Perhatikan code program berikut:
while(1)
{
............................ //code program
........................... //code program
}
Arti dari code program di atas adalah:
while(1) //selama 1 maka kerjakan program di dalam kurung kurawal
{
.................... //code program
.................... //code program
}
Statement diatas akan selalu benar (selalu bernilai satu) karena angka 1merupakan konstanta. Konstanta nilainya tidak akan berubah, sehingga terjadilah Looping terus menerus .
Coba bedakan dengan code program berikut:
while(index<4)
{
....................................... //code program
....................................... //code program
index=index+1;
}
Program di dalam kurung kurawal akan dijalankan selama index kurang dari 4. index merupakan variabel sehingga nilainya bisa berubah. Nah.. jika index lebih dari atau sama dengan 4, looping tidak dijalankan lagi.
any questions?? post comment on this blog: http:\\avrku.blogspot.com or send email to: zigan@ymail.com CodeVisionAVR C Compiler is copyright by Pavel Haiduc, HP InfoTech s.r.l.
AVR is a registered trademark of Atmel Corporation.
CodeVisionAVR C Compiler is copyright by Pavel Haiduc, HP InfoTech s.r.l.
AVR is a registered trademark of Atmel Corporation.
No comments:
Post a Comment