Senin, 26 Maret 2018

Port IO Atmega8535


Port Input / Output Paralel


Port Input Output (PIO) berfungsi untuk menghubungkan mikroprosesor dengan perangkat luar, seperti papan ketik, sensor, saklar sebagai perangkat masukan dan layar LCD, penggerak motor, penggerak lampu sebagai perangkat keluaran. Pada Port Input Output Paralel, data dikirim dan diterima secara serentak sebanyak 8 bit sesuai lebar data bus. Terdapat empat group PIO dan setiap group memiliki 8 kaki (pin). Masing-masing Group diberikan nama PORTA, PORTB, PORTC dan PORTD.
Semua I/O dan periferal ATmega8535 ditempatkan di ruang I/O. Lokasi I/O diakses dengan instruksi IN dan OUT, untuk mentransfer data antara 32 register I/O dan ruang register serbaguna (GPR). Register I/O dalam kisaran alamat 0x00-0x1F diakses secara langsung menggunakan instruksi SBI dan CBI. Dalam register tersebut, nilai bit tunggal dapat diperiksa dengan menggunakan instruksi SBIS dan SBIC. Ketika menggunakan perintah khusus IN dan OUT I/O, alamat I/O 0x00-0x3F harus digunakan. Ketika menangani Register I/O sebagai ruang data menggunakan instruksi LD dan ST, 0x20 harus ditambahkan ke alamat ini. Alamat register I/O tercantum pada tabel 1.

Tabel 1. Alamat register I/O
     Register       alamat I/O       alamat memori  
     PORTA           0x1B                0x3B
     DDRA             0x1A                0x3A
     PINA              0x19                0x39  
     PORTB           0x18                0x38
     DDRB             0x17                0x37
     PINB              0x16                0x36  
     PORTC           0x15                0x35
     DDRC             0x14                0x34
     PINC              0x13                0x33  
     PORTD           0x12                0x32
     DDRD             0x11                0x31
     PIND              0x10                0x30              



Semua Port AVR memiliki kegunaan Baca-Modifikasi-tulis yang sesungguhnya ketika digunakan sebagai Port I/O digital secara umum. Maksudnya bahwa arah dari satu pin port dapat diubah tanpa mempengaruhi pin yang lain dengan instruksi SBI dan CBI. Cara yang sama ketika mengubah nilai pendorong (jika dikofigurasi sebagai keluaran) atau enable/disable resistor pull-up (jika dikonfigurasi sebagai input). Setiap bufer keluaran memiliki karakteristik dorong yang simetris dengan pembenaman tinggi dan kemampuan sumber. Pendorong pin cukup kuat untuk mendorong tampilan LED secara langsung. Semua Pin port dapat memilih resistor pull-up individual dengan satu macam resistor tegangan catu. Semua pin I/O memiliki diode pelindung ke VCC dan Ground seperti tampak pada gambar 1.

Gambar 1. rangkaian dasar port I/O
Semua referensi register dan bit dalam bagian ini ditulis dalam bentuk umum. Huruf kecil “x” menunjukkan huruf nomor untuk Port, huruf kecil “n” menunjukkan nomor bit. Namun demikian ketika menggunakan definisi register atau bit didalam program, bentuk yang tepat harus digunakan. Misalnya, PORTB3 untuk bit no.3 di Port B, di sini didokumentasikan secara umum sebagai PORTxn.
Tiga lokasi alamat memori I/O dialokasikan untuk masing-masing port, masing-masing untuk Data Register - PORTx , Data Direction Register - DDRx , dan Pin Port Input - PINx. Lokasi Port input PINx I/O hanya dibaca saja, sedangkan Register Data dan Data Direction Register dapat dibaca/ditulis. Selain itu, bit Pull-up Disable - PUD di SFIOR menonaktifkan fungsi pull-up untuk semua pin di semua port ketika ketika diset. Kebanyakan pin port dimultiplexing dengan fungsi alternatif untuk fitur perangkat periferal. Perhatikan bahwa mengaktifkan fungsi alternatif dari beberapa pin port tidak mempengaruhi penggunaan pin lainnya di port sebagai general digital I/O.
Port I/O adalah port dua arah (bi-directional) dengan opsional internal pull-up. Gambar 1. menunjukkan deskripsi fungsional dari satu pin I/O-port, di sini umumnya disebut Pxn. Setiap pin PORT terdiri dari tiga bit register: DDxn , PORTxn , dan PINxn. bit DDxn diakses di alamat DDRx I/O, bit PORTxn di alamat PORTx I/O , dan bit PINxn di alamat Pinx I/O. Bit DDxn dalam Register DDRx memilih arah data pin ini. Jika DDxn ditulis logika satu, Pxn dikonfigurasi sebagai pin output. Jika DDxn ditulis logika nol, Pxn dikonfigurasi sebagai pin input.


Gambar 2. blok diagram PORT I/O

SALURAN MASUKAN

Konfigurasi pin sebagai masukan apabila DDRx ditulis logika nol (0). Jika PORTxn ditulis logika nol (0) dan pin dikonfigurasi sebagai pin input (DDRx=0), maka pull-up resistor dinon-aktifkan, pengaturan semacam ini digunakan jika pin dihubungkan rangkaian digital yang memiliki status logika jelas ( 0 atau 1). Ketika pin tidak dihubungkan dengan rangkaian masukan, jika pin dibaca oleh mikroprosesor maka status logika tidak menentu (mengambang). 



Gambar 3. RPU non-aktif, masukan terbaca mengambang




Gambar 4. RPU non-aktif, masukan terbaca nol



Untuk mengaktifkan resistor pull-up, PORTxn harus ditulis logika satu (1) dan pin harus dikonfigurasi sebagai pin masukan, DDRx ditulis nol (0). Ketika pin tidak terhubung dengan rangkaian yang mengambang, maka masukkan akan terbaca logika satu (1). sedangkan jika terhubung dengan rangkaian yang terhubung dengan ground maka akan terbaca nol (0).
Gambar 5. RPU aktif, masukan mengambang terbaca satu.

gambar 6. RPU aktif, pin terhubung dengan ground terbaca nol 
Biasanya, resistor pull-up diaktifkan status sepenuhnya dapat diterima. Jika hal ini tidak ingin terjadi, bit PUD di register SFIOR dapat diset untuk menonaktifkan semua pull-up di semua port. 


 SALURAN KELUARAN

Pinx akan berfungsi sebagai saluran keluaran jika DDRx ditulis logika 1. Jika PORTxn ditulis logika nol ketika pin dikonfigurasi sebagai pin keluaran, pin port didorong rendah (nol). jika sebuah LED kita hubungkan dengan Pinx maka LED tidak akan menyala.


Jika PORTxn ditulis logika satu ketika pin dikonfigurasi sebagai pin output, pin PORT didorong tinggi (satu). Jika sebuah LED kita hubungkan dengan pin maka LED akan menyala.



Pengaturan kaki port dan resistor pull-up dapat dilihat pada tabel 2. 

Table 2. Konfigurasi Kaki Port
DDxn
PORTxn
PUD (in SFIOR)
I/O
Pull-up
Comment
0
0
X
Masukan
Tidak
Tri-state (Z-tinggi)
0
1
0
Masukan
Ya
Pxn menghasilkan arus sumber jika keluaran ditarik rendah
0
1
1
Masukan
Tidak
Tri-state (Z-tinggi)
1
0
X
Keluaran
Tidak
Keluaran rendah(membenamkan)
1
1
X
Keluaran
Tidak
Keluaran tinggi(Sumber)

INISIALISASI PORT I/O

Inisialisasi Port I/O adalah mengatur fungsi awal Port sebagai masukan atau sebagai keluaran. Contoh langkah-langkah membuat program untuk menetapkan kondisi awal (inisialisasi)  sebuah Port I/O adalah sebagai berikut :
Membuat PORT A sebagai keluaran, langkah yang harus dilakukan adalah menemukan alamat register arah data Port A (DDRA). Dalam data sheet dapat kita temukan alamatnya adalah 0x1A. Untuk berfungsi sebagai keluaran maka setiap bit DDRA harus diberikan data 1 sehingga diperoleh bilangan biner 11111111 (0b11111111) atau bilangan heksadesimal FF (0xFF).  Untuk mengirimkan data keluar, data yang akan dikirim, misalnya 0x4F dapat diberikan pada alamat PORTA. Instruksi dalam bahasa C adalah :

#define DDRA  0x1A //mendefinisikan DDRA dengan alamat 0x1A
#define PORTA 0X1B //mendefinisikan PORTA dengan alamat 0x1B
DDRA = 0xFF;       // mengisi DDRA dengan 0xFF (0b11111111)
PORTA = 0x4F;      // mengirim data 0x4F melalui PORTA

Membuat PORTB sebagai masukan, langkah yang harus dilakukan adalah menemukan alamat register arah data Port B (DDRB). Dalam data sheet dapat kita temukan alamatnya adalah 0x17. Untuk berfungsi sebagai keluaran maka setiap bit DDRA harus diberikan data 0 sehingga diperoleh bilangan biner 00000000 (0b00000000) atau bilangan heksadesimal 00 (0x00). Untuk saluran masukan perlu menentukan apakah Resistor pull-up (RPU) diaktifkan atau tidak. Jika RPU diaktifkan, PIN akan terbaca 1 dalam keadaan terbuka, misalnya masukkannya berupa tombol, terbaca 0 jika PIN dihubungkan dengan ground. Jika RPU tidak diaktifkan, keadaan masukkan bergantung dari, logika output masukkannya. Tetapi jika masukkan terbuka keadaannya mengambang. Untuk mengaktifkan RPU register PORTB diberikan logika 1. Alamat register PORTB adalah 0x18. Pembacaan data luar dengan memindahkan data dari register PINB ke sebuah variable. Register PINB memiliki alamat 0x16. Contoh Instruksi dalam bahasa C adalah :

#define PINB  0x16 //mendefinisikan PINB dengan alamat 0x16
#define DDRB  0x17 //mendefinisikan DDRB dengan alamat 0x17
#define PORTB 0X18 //mendefinisikan PORTB dengan alamat 0x18
Char DataInput;    //membuat variable DataInput
DDRB = 0x00;       // mengisi DDRB dengan 0x00 (0b00000000)
PORTB = 0xFF;      // mengaktifkan RPU
DataInput = PINB;  // membaca data masukan pada PINB

Jika program sudah menggunakan file header dari type mikroprosesor yang kita gunakan, misalnya #include <mega8535>, maka instruksi definisi alamat register tidak perlu dituliskan lagi, karena sudah dibuat pada file header.

1 komentar: