Digital Input / Output

Digital Input / Output (Digital IO) adalah komponen yang paling mendasar dari sebuah MCU (Main Control Unit) yang menghubungkan mikrokontroler dengan dunia luar. Antarmuka dengan dunia luar tersebut dikenal dengan istilah PORT. Port adalah titik di mana data internal dari chip MCU keluar atau data eksternal berjalan masuk. Port terdiri dari beberapa PIN, Port pada mikrokontroler biasanya diberi nama PortA, PORTB, PORTC, PORTD dan sebagainya. Contoh konfigurasi pin dari MCU ATmege16 ditunjukkan pada gambar berikut :image

Gambar Konfigurasi pin MCU ATmega16

Setiap MCU AVR memiliki beberapa port IO bernama PORTA, PORTB, PORTC dll. Kita dapat mengetahui lokasi fisik port tersebut dengan melihat konfigurasi pin pada gambar diatas. Misalnya bit 0 Port C berada pada PIN 22 dari IC.

Setiap port terdiri dari 8 bit register, misalnya PORTA terdiri dari PA0, PA1, PA2…PA7.  Setiap pin bisa di set ‘1’ (high) atau ‘0‘ (low) secara terpisah, tapi bisa juga dengan cara memberikan nilai pada port tersebut, misalnya PORTB diberi nilai F3h (hexa) atau 11110111 dalam biner, itu berarti semua pin pada port B diset ‘high’ kecuali pin PB3 yang diset ‘low’.

Pin di set ‘1’ (high) berarti tegangan pada pin tersebut mendekati VCC (+5V) dan bila di set ‘0‘ (low) berarti tegangan pada pin tersebut mendekati GND (0V). Port memiliki batasan arus, sehingga tidak disarankan untuk menghubungkan pin ini dengan perangkat (komponen) lain yang memerlukan arus cukup tinggi.

Digial IO bisa digunakan untuk menyalakan LED misalnya, atau men-drive sebuah transistor untuk keperluan pengontrolan dengan arus yang lebih tinggi. Digital IO bisa juga digunakan untuk membaca data dari luar (sebagai input), misalnya untuk membaca status tombol, switch atau membaca data dari keypad.

 

Port sebagai Input dan Output

Secara keseluruhan, setiap port memiliki tiga register:


  • PORT - untuk menentukan nilai input / output dari bus.
  • PIN - untuk membaca input pada bus atau mengeluarkan output dari bus.
  • DDR - untuk pengaturan arah bus.

Data Direction Register (DDR) merupakan register yang berfungsi untuk mengatur arah data dari PORT. Bit-bit dalam register ini juga mengatur arah data PIN secara individu. Arah untuk setiap PIN dapat menjadi input atau output. Pin PORT dijadikan input bila ingin membaca data misalnya dari saklar (switch) atau sensor. Sementra PORT dijadikan output ketika ingin menggunakannya untuk membuat LED berkedip atau mengontrol sebuah motor.

Jadi, untuk mengatur port sebagai input atau output, register DDR inilah yang mengaturnya. Nilai bit ‘1’ menandai port sebagai output dan ‘0’ sebagai input.

 

Fungsi tambahan

Selain berfungsi sebagai digital IO, beberapa pin juga memiliki fungsi alternatif. Misalnya PB6, selain sebagai PIN 6 dari PORTB, juga sebagai MISO untuk keperluan SPI. PA0 selain sebagai PIN 0 dari PORTA, juga sebagai input ADC 0 dan lainnya.

 

Periperal

MCU AVR memiliki beberapa built-in hardware yang disebut peripheral. Periperal merupakan perangkat tambahan yang disertakan dalam sebuah MCU untuk mendukung beberapa fungsi khusus misalnya :

  • USART untuk komunikasi serial dengan PC dan perangkat lain. Misalnya mengontrol sebuah lengan robot melalaui PC lewat port serial. Komunikasi serial ini hanya menggunakan 3 kabel.
  • ADC – Analog to Digital Convertion, berfungsi untuk mengubah data analog menjadi data digital. Misalnya untuk membaca nilai suhu atau jumlah cahaya yang jatuh pada sensor.
  • SPI - Serial Peripheral interface. Digunakan untuk komunikasi serial antara perangkat digital (misalnya EEPROMs, Data Flash, LDC modul dll)

 

Mengakses Digital IO dalam bahasa C

Seperti telah dijelaskan sebelumnya, setiap PORT dalam AVR memiliki tiga Registers terkait, yaitu PORT, DDR dan PIN. Misalnya untuk PORTD sebagai contoh, untuk membuat PIND-0 (PD0) sebagai output, maka instruksinya adalah sebagai berikut :

//set PD0 sebagai output

DDRD=0b00000001;



perintah diatas maksudnya adalah menjadikan PD0 sebagai output dan PD1…PD7 dibiarkan sebagai input.



Secara default semua pin port IO adalah input yaitu '0 '



Digital Output



Setelah mengatur arah pin untuk output, berikutnya kita bisa memberikan nilai pada register yang hasilnya akan terlihat pada pin tersebut. Contoh kode program :



//membuat PD0 ‘high’
PORTD=0b00000001;

//tunggu beberapa saat …
_delayms(500);

//ubah PD0 menjadi ‘low’
PORTD=0b00000000;



pada program diatas, pertama pin PD0 diset high (1), lalu dibiarkan beberapa saat, kemudian diset kembali menjadi low (0).



Contoh Aplikasi Digital Output



image Gambar Contoh Aplikasi Digital Output



Pada aplikasi A, untuk menyalakan LED caranya adalah dengan memberikan nilai low (0) pada PD2, sementara pada aplikasi B, untuk menyalakan LED adalah dengan memberikan nilai high (1). Jadi untuk aplikasi A, mode LED tersebut dalam adalah active low dan pada aplikasi B, mode LED nya adalah active-high.



Digital Input



Bila PIN di-set sebagai input, maka statusnya bisa dibaca melalui nilai register. Misalnya PD2 dihubungkan dengan sebuah tombol (push button) seperti gambar berikut :



image



Gambar Aplikasi Tombol Push-Button sebagai Digital Input



karena default dari port adalah sebagai input, jadi DDR tidak perlu inisialisasi. Untuk membaca status tombol, caranya adalah dengan membaca status dari PIND2 tersebut. Pin ini akan menjadi '0' ketika tombol ditekan dan '1' jika dilepas. Contoh kode programnya adalah sebagai berikut :



...
if (PIND & 0b00000100)
{
... //rutin jika tombol tidak ditekan
}
else
{
... //rutin jika tombol ditekan
}
...


Contoh kode program Digital Input Output



Contoh kode program untuk membuat PB0 - PB3 sebagai input dan PB4 - PB7 output, kemudian mengatur PB5 di-set high dan membaca nilai dari PB0 - PB3 ke variabel. Kode program dalam bahasa C untuk aplikasi tersebut adalah sebagai :



#include <avr/io.h>  
int main()
{
unsigned char x;
DDRB = 0xF0; //pin 0-3 sebagai input, pin 4-7 sebagai output
PORTB |= (1 << PIN5); //set pin ke-5 menjadi high
x = PINB & 0x0F; //membaca data dari input 0-3
}
//Catatan :
//alternatif instruksi yang sama dengan
//instruksi PORTB |= (1 << PIN5); adalah PORTB |= 0x20;



Dalam contoh diatas, input digunakan dalam mode Hi-Z (high impedance). Mode ini mungkin diperlukan jika pin digunakan sebagai data bus. Disarankan untuk menggunakan sebuah resistor pull-up pada input jika pin digunakan untuk tombol, switch atau input lain, dimana input dihubungkan ke ground.



Untuk itu, bit output dari pin yang bersangkutan harus di set high dalam mode input, resistor pull-up ditempatkan antara tegangan suplai dan input, yang menjaga tegangan input yang tinggi (kecuali aplikasi yang memerlukan pull-down). Tujuan dari sebuah resistor pull-up adalah untuk mencegah input mengambang karena listrik statis atau gangguan lainnya. (Lihat gambar Aplikasi Tombol Push-Button sebagai Digital Input)



Setelah proses booting, semua bus IO berada dalam mode input high impedance secara default.




Selamat Belajar !



Reff:



http://www.extremeelectronics.co.in/avrtutorials/



http://home.roboticlab.eu/en/avr

Tidak ada komentar:

Posting Komentar

author
Embedtronix
Build Your Embedded System. Belajar bareng ngoprek Microcontroller, Arduino, TPLink, GLiNet dan ilmu Microelectronic lainnya.