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
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.
makasih
BalasHapusPinset Hp